
Saya tidak tahu bahasa pemrograman apa yang Anda tulis, tetapi saya yakin Anda menggunakan Geet selama pengembangan. Ada semakin banyak alat untuk mendukung pengembangan, tetapi bahkan proyek uji terkecil, saya selalu mulai dengan perintah git init
. Dan selama hari kerja saya mengetik rata-rata 80 tim lain, mengacu pada sistem kontrol versi ini.
Saya menghabiskan banyak waktu ketika mulai mempelajari kembali metode pencetakan sepuluh jari. Pada akhirnya, ini adalah keputusan terbaik untuk meningkatkan alur kerja pribadi Anda. Di antara optimasi paling penting berikutnya adalah pengembangan lanjutan dari Geeta.
Banyak artikel tentang Gita telah ditulis di Habr, tetapi tidak melampaui dokumentasi resmi, dan penulis mengusulkan untuk menyederhanakan pekerjaan dengan kruk buatan sendiri. Saya yakin bahwa perlu mempelajari Geet pada contoh tugas yang konkret, dan untuk meningkatkan efisiensi bekerja dengannya menggunakan cara terstandarisasi.
Siapa yang akan mendapat manfaat dari artikel ini?
Sudahkah Anda menguasai perangkat Gita milik pria itu dan apakah Anda siap untuk pindah? Ada 2 cara:
- Perintah Master disingkat - alias. Mereka hampir selalu mnemonik dan mudah diingat. Lupa perintah asli bermasalah, saya dengan mudah mengetiknya bila perlu. Plus, saya tidak bingung dengan memeriksa sesuatu di Gita saat menulis kode.
- Pelajari tentang bendera tambahan untuk tim, serta integrasi mereka di antara mereka sendiri. Saya mengerti bahwa seseorang membenci pemotongan. Bagi Anda juga, ada bahan yang menarik dalam artikel ini - bagaimana meningkatkan kegunaan dan kenyamanan output perintah, serta bagaimana menyelesaikannya bukan yang paling sepele, tetapi sering ditemui dalam masalah praktik .
Luangkan beberapa jam hari ini untuk eksperimen yang dijelaskan dalam artikel, dan simpan dengan perkiraan perkiraan enam bulan masa kerja.
Selamat datang di kucing!
Persiapan
Di antara pengembang, standar untuk alternatif Bash
adalah Zsh
, shell perangkat lunak canggih yang mendukung fine-tuning. Dan di antara pengguna Zsh
, standarnya adalah menggunakan Oh My Zsh
, satu set pengaturan yang telah ditentukan untuk Zsh
. Dengan demikian, setelah menginstal kit ini, kita akan keluar dari kotak satu set peretasan yang telah dikumpulkan dan dikembangkan oleh komunitas untuk kita selama bertahun-tahun.
Sangat penting untuk dicatat bahwa Zsh
adalah untuk Linux , dan untuk Mac , dan bahkan untuk Windows .
Instal Zsh
dan Oh My Zsh
Instal Zsh
dan Oh My Zsh
sesuai dengan instruksi dengan satu perintah:
Karena tugasnya adalah mengoptimalkan interaksi dengan Geet , kami akan menambahkan beberapa plug-in ke Zsh
. Buka file ~/.zshrc
dan tambahkan plugins
ke daftar:
plugins=(git gitfast)
Total:
git
- satu set alias dan fungsi tambahan;gitfast
- peningkatan penyelesaian otomatis untuk Gita.
Pengaturan tig
Dan sentuhan terakhir adalah pemasangan utilitas konsol tig
:
Kami akan membicarakannya lebih lanjut.
Git dalam praktik
Berurusan dengan Geeta paling baik dilakukan dengan memecahkan masalah tertentu. Selanjutnya, kami mempertimbangkan tugas dari praktik sehari-hari dan opsi untuk solusi praktis mereka. Untuk melakukan ini, pertimbangkan repositori tertentu dengan file teks.
Blok kuning menunjukkan alias utama untuk menyelesaikan masalah dari bagian. Pelajari hanya itu, dan tinggalkan semua yang lain untuk pengembangan umum.
Periksa status direktori kerja
Mari kita mulai dengan hal yang paling mendasar. Kami melakukan sedikit pekerjaan dan sekarang mari kita lihat apa yang terjadi di direktori kerja:
$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: e.md Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: b.md Untracked files: (use "git add <file>..." to include in what will be committed) d.md
Status semua file saat ini dijelaskan dengan sangat terperinci, instruksi tambahan untuk tindakan diberikan. Ini sangat berguna pada awalnya ketika menggunakan Geeta, tetapi ada banyak berlebihan untuk pekerjaan sehari-hari. Mari kita turunkan tingkat kebisingan dengan tombol tambahan:
$ git status -sb
Ya, kami berada di cabang master
, mengubah file b.md
( M-odified
) dan membuat dua file, menambahkan yang pertama ke indeks Geeta ( A-dded
), dan membiarkan yang kedua keluar dari indeks ( ??
). Singkat dan jelas.
Tetap mengoptimalkan input tanpa akhir dari perintah ini oleh alias " g it s tatus with b ranch" :
Tampilkan status direktori kerja yang dipersingkat
$ gsb
Buat komit
Kami melanjutkan.
Tentu saja, Anda dapat membuat komitmen. Tetapi mari kita coba untuk mengoptimalkan solusi dari tugas sederhana ini. Tambahkan semua perubahan ke indeks dengan alias " g it a dd a ll" :
$ gaa
Kami memeriksa bahwa indeks mendapatkan apa yang kami butuhkan menggunakan alias " g it d iff ca ched" :
$ gdca # git diff --cached diff --git a/b.md b/b.md index 698d533..cf20072 100644 --- a/b.md +++ b/b.md @@ -1,3 +1,3 @@ # Beta -Next step. +Next step really hard. diff --git a/d.md b/d.md new file mode 100644 index 0000000..9e3752e --- /dev/null +++ b/d.md @@ -0,0 +1,3 @@ +# Delta + +Body of article.
Hmm, perubahan yang menyelesaikan satu tugas harus jatuh ke dalam satu komit. Di sini, perubahan kedua file tidak terhubung dengan cara apa pun. Mari kita d.md
file d.md
dari indeks dengan alias " g it r eset u ndo" :
$ gru d.md # git reset
Dan buat komit dengan alias " g it c ommit" :
$ gc
Kami menulis nama komit dan menyimpan. Dan kemudian kita membuat komit lain untuk file d.md
perintah yang lebih akrab menggunakan alias " g it c ommit m e s sa g e" :
$ gaa
Dan kita bisa ...
... komit file yang dimodifikasi dari indeks dengan satu perintah:
$ gcam "Add changes"
... lihat perubahan dengan kata-kata alih-alih baris (sangat berguna saat bekerja dengan teks):
$ gdw
... tambahkan file dalam bagian-bagian (sangat berguna ketika Anda perlu menambahkan hanya bagian komit dari perubahan dari file):
$ gapa
... tambahkan ke file indeks saja yang sudah di bawah pengawasan Geeta:
$ gau
Total:
Tambahkan ke Indeks / Buat Komit
$ ga
Perbaiki komit
Nama komit terakhir tidak menjelaskan perubahan yang kami buat. Mari kita merumuskan kembali:
$ gc!
Dan di editor teks yang terbuka, kita akan menyebutnya lebih jelas: "Add Delta article"
. Saya yakin Anda tidak pernah menggunakan sakelar -v
, meskipun saat mengedit deskripsi komit, ia memperlihatkan semua perubahan yang dibuat, yang membantu menavigasi dengan lebih baik.
Dan kita bisa ...
... buat perubahan file pada komit, tapi jangan sentuh deskripsi:
$ gcn!
... buat semua perubahan file dengan segera ke komit, tanpa terlebih dahulu menambahkan ke indeks:
$ gca!
... gabungkan dua perintah sebelumnya:
$ gcan!
Nah, penting untuk dicatat sekali lagi bahwa alih-alih mengetikkan perintah git commit -v --amend
yang lengkap secara rutin, kami hanya menulis tiga karakter:
Ubah komit terakhir
$ gc!
Memulai fitur baru
Buat cabang baru dari alias saat ini " g it c heckout b ranch" :
$ gcb erlang
Meskipun tidak, lebih baik menulis artikel tentang bahasa yang lebih modern oleh Elixir alias " g it b ranch with the key m ove" (penggantian nama dalam Gita dilakukan melalui move
):
$ gb -m elixir
Akan logis untuk menggunakan alias gbmv
, tetapi, sayangnya, itu belum ditemukan. Pilihan yang bagus untuk berkontribusi.
Kami membuat perubahan pada repositori dan membuat komit, seperti yang sudah kita ketahui:
$ echo "# β ." > e.md $ gaa && gcmsg "Add article about Elixir"
Dan ingat:
Buat cabang baru
$ gcb
Gabungkan perubahan
Sekarang kami menambahkan artikel baru kami tentang Elixir untuk master
. Pertama, beralihlah ke cabang utama dengan alias " g it c heckout m aster" :
$ gcm
Tidak, sungguh Salah satu perintah yang paling umum digunakan dalam tiga karakter yang mudah diingat. Sekarang gabungan dari perubahan alias adalah " g it m erge" :
$ gm elixir
Ups, tetapi seseorang sudah berhasil membuat perubahan untuk master
. Dan alih-alih sejarah linear indah yang diadopsi dalam proyek kami, saya menciptakan benci gabungkan komit.
Gabungkan cabang
$ gm
Hapus komit terakhir
Tidak ada yang perlu dikhawatirkan! Anda hanya perlu menghapus komit terakhir dan mencoba menggabungkan perubahan lagi β g it r eset hh ardβ :
Hapus komit terakhir
$ grhh HEAD~
Kami menyelesaikan konflik
Aliran checkout β rebase β merge
untuk menyiapkan riwayat perubahan linier dilakukan dengan urutan alias berikut:
gco elixir
Semuanya begitu sering digunakan sehingga mereka sudah terbang jauh dari jari, dan ketika melakukan operasi seperti itu, tidak perlu memikirkan set huruf mana yang akan diketik. Dan jangan lupa bahwa di Zsh
Anda dapat menambah nama cabang dengan tombol Tab
.
Buat rebase
$ grb
Mengirimkan perubahan ke server
Pertama kita tambahkan origin
alias " g it r emote a dd" :
$ gra origin git@github.com/...
Dan kemudian kami mengirim perubahan secara langsung ke cabang repositori saat ini ( "gg" - g
berlipat ganda di awal perintah menunjukkan eksekusi tindakan di cabang saat ini):
$ ggpush
Anda juga bisa ...
... kirim perubahan ke server dengan pemasangan upstream
alias " g it p ush s et up stream" :
$ gpsup
Kirim perubahan ke server
$ gp
Kami menerima perubahan dari server
Pekerjaan sedang berjalan lancar. Kami berhasil menambahkan artikel baru f.md
untuk master
, dan kolega kami mengubah artikel a.md
dan mengirimkan perubahan ini ke server. Situasi ini juga diselesaikan dengan sangat sederhana:
$ gup
Kemudian Anda dapat mengirim perubahan ke server dengan aman. Konflik diselesaikan.
Dapatkan perubahan dari server
$ gl
Hapus cabang yang digabungkan
Jadi, kami berhasil menggabungkan beberapa cabang menjadi master
, termasuk cabang elixir
dari contoh sebelumnya. Kami tidak membutuhkannya lagi. Anda dapat menghapus alias " g it b ranch d elete a nother" :
$ gbda
Tim yang sangat cantik dan licik. Biasanya saya lupa membersihkan cabang yang kehilangan relevansi dan tim yang anggun ini adalah penyelamat sejati. Jika Anda tidak ingin menggunakan alias, cukup salin versi lengkap dari perintah ke dalam catatan Anda, dan jalankan sesuai keperluan.
Buat komit sementara
Bekerja pada artikel h.md
baru tentang Haskell dalam ayunan penuh. Setengah ditulis dan Anda perlu mendapatkan umpan balik dari seorang rekan. Tanpa berpikir dua kali , kami mengetik alias " g it w ik i n p rogress" :
$ gwip
Dan kemudian sebuah komit dibuat dengan nama Work in Progress
, melompati CI dan menghapus file "ekstra". Kami mengirim cabang ke server, berbicara tentang kolega ini dan menunggu peninjauan.
Kemudian komit ini dapat dibatalkan dan file dikembalikan ke keadaan semula:
$ gunwip
Dan untuk memeriksa apakah ada komit WIP
di cabang Anda, gunakan perintah:
$ work_in_progress
Perintah gwip
adalah analog stash
cukup andal ketika Anda perlu beralih ke cabang tetangga. Tetapi di Zsh
ada banyak alias untuk stash
itu sendiri.
Tambahkan komit sementara / Reset komit sementara
$ gwip $ gunwip
Menyembunyikan perubahan
Anda harus berhati-hati dengan perintah ini. File dapat disembunyikan, dan kemudian dihapus sepenuhnya dengan tindakan yang ceroboh, karena ada reflog
di mana Anda dapat mencoba menemukan pekerjaan yang hilang.
Mari kita sembunyikan file yang sedang kita kerjakan dengan nama alias alias:
$ gsta
Dan kemudian kembalikan mereka dengan alias β g it st ash p opβ :
$ gstp
Atau metode " g it st ash a ll a ply" yang lebih aman :
$ gstaa
Anda juga bisa ...
... lihat apa sebenarnya yang kami sembunyikan:
gsts
... gunakan singkatan untuk perintah terkait:
gstc
Sembunyikan Perubahan / Dapatkan Perubahan
$ gsta $ gstaa
Mencari bug
Alat git-bisect
, yang telah berulang kali menyelamatkan hidup saya, juga memiliki alias sendiri. Kita mulai dengan memulai prosedur "pencarian kesalahan biner" dengan alias " g it b i s ect s tart" :
$ gbss
Kami perhatikan bahwa saat ini, terakhir di cabang, komit mengandung kesalahan dengan alias " g it b i s ect b ad" :
$ gbsb
Sekarang kita menandai komit yang menjamin kita keadaan operasional aplikasi " g it be iect g ood" :
$ gbsg HEAD~20
Dan sekarang tetap melanjutkan untuk menjawab pertanyaan Gita dengan frasa gbsb
atau gbsg
, dan setelah menemukan pelakunya, reset prosedur:
$ gbsr
Dan saya benar-benar menulis singkatan ini ketika menggunakan alat ini.
Kesalahan melakukan pencarian
$ gbss
Kami mencari penghasut pelanggaran hukum
Bahkan dengan persentase cakupan kode yang tinggi dengan pengujian, tidak ada yang kebal dari situasi di mana aplikasi mogok dan dengan ramah menunjuk ke baris tertentu dengan kesalahan. Atau, misalnya, dalam kasus kami, kami ingin mencari tahu siapa yang membuat kesalahan di baris kedua file a.md
Untuk melakukan ini, jalankan perintah:
$ gbl a.md -L 2
Anda tahu, kontributor Oh My Zsh
membuat alias tidak hanya untuk tim git blame
, tetapi menambahkan kunci yang membuatnya mudah untuk menemukan penghasut secara langsung.
Bonus
Lihat daftar komitmen
Untuk melihat daftar commit, gunakan perintah git log
dengan tombol format output tambahan. Biasanya perintah ini, bersama dengan kunci, dimasukkan dalam alias khusus Gita. Kami lebih beruntung, kami sudah memiliki alias siap pakai di luar kotak: glog
. Dan jika Anda menginstal utilitas tig
berdasarkan saran dari awal artikel, maka Anda adalah juara mutlak.
Sekarang, untuk mempelajari sejarah komit di konsol dengan cara yang sangat nyaman, Anda perlu mengetikkan kata git
sebaliknya:
$ tig
Utilitas ini juga menyediakan beberapa tambahan berguna yang tidak ada dalam Gita di luar kotak.
Pertama, perintah untuk mencari isi cerita:
$ tig grep
Kedua, melihat daftar semua sumber, cabang, tag beserta riwayatnya:
$ tig refs
Ketiga, mungkin Anda akan menemukan sesuatu yang menarik untuk diri sendiri:
$ tig --help
git reset --hard
dilakukan secara tidak sengaja git reset --hard
Anda bekerja di cabang elixir
sepanjang hari:
$ glog * 17cb385 (HEAD -> elixir) Refine Elixir article * c14b4dc Add article about Elixir * db84d54 (master) Initial commit
Dan pada akhirnya, mereka secara tidak sengaja menghapus semuanya:
$ grhh HEAD~2 HEAD is now at db84d54 Initial commit
Tidak perlu panik. Aturan yang paling penting adalah berhenti mengeksekusi perintah apa pun di Gita dan buang napas . Semua tindakan dengan repositori lokal direkam dalam log- reflog
. Dari itu, Anda bisa mendapatkan hash dari komit yang diinginkan dan mengembalikannya ke pohon kerja.
Mari kita lihat reflog, tetapi tidak dengan cara biasa melalui git reflog
, tetapi lebih menarik dengan transkrip terperinci:
$ glg -g
Temukan hash dari 17cb385
komit yang diinginkan dan pulihkan:
Secara kebetulan, alih-alih membuat komit baru, saya membuat perubahan dengan yang sebelumnya
Di sini kita kembali ke bantuan penyelamatan reflog. Kami menemukan hash dari commit 17cb385
asli, jika kami membatalkan komit langsung, maka daripada mencari hash, kita dapat menggunakan tautan cepat ke sana HEAD@{1}
. Selanjutnya kita melakukan soft reset, sedangkan indeks tidak diatur ulang:
Cabang terlalu tua
Kadang-kadang Anda mulai bekerja pada fitur, tetapi rilisnya tertunda tanpa batas waktu. Anda berkomitmen dan beralih ke tugas lain. Bersama dengan tim Anda membuat banyak perubahan pada master dan setelah beberapa saat Anda kembali ke cabang dengan fitur. Anda mencoba untuk rebase, tetapi ia menawarkan untuk mengurai konflik dalam selusin komitmen. Anda dapat mencoba menyelesaikannya atau membuatnya lebih mudah.
Mari kita lihat contoh cabang fitur bernama elixir
:
Jadi, alih-alih mencoba memperbarui cabang, kami mengambil dan mentransfer satu komit tanpa masalah.
Menghapus data penting dari repositori
Untuk menghapus data penting dari repositori, saya telah menyimpan cuplikan berikut:
$ git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <path-to-your-file>' --prune-empty --tag-name-filter cat -- --all && git push origin --force --all
Menjalankan perintah ini akan menghancurkan stash
Anda. Sebelum pelaksanaannya, disarankan untuk mendapatkan semua perubahan tersembunyi. Baca lebih lanjut tentang teknik ini di sini .
Mengacu pada cabang sebelumnya
Saat menjalankan beberapa perintah yang mengharapkan nama cabang dimasukkan, kita bisa memberikan tanda hubung sebagai referensi ke cabang tempat kita datang. Sangat baik untuk menggunakan trik checkout ini:
$ gco -
Hapus semua file yang ditandai dengan .gitignore
Kemunduran umum lainnya sudah terlambat untuk menambahkan file atau direktori yang tidak diinginkan ke .gitignore
. Untuk membersihkannya dari repositori ( dan menghapusnya dari disk ), sudah ada kunci yang sudah jadi untuk perintah git clean
:
$ gclean -X
Berhati-hatilah!
Baca terus untuk cara yang benar.
Mengapa banyak tim membutuhkan saklar --dry-run
?
--dry-run
diperlukan hanya sebagai tindakan pencegahan saat mencopot dan memperbarui. Misalnya, bagian sebelumnya menjelaskan cara menghapus semua yang ditentukan dalam file .gitignore
. Lebih baik berhati-hati dan menggunakan switch --dry-run
, --dry-run
daftar semua file yang akan dihapus, dan hanya kemudian jalankan perintah tanpa --dry-run
.
Kesimpulan
Artikel ini menunjukkan titik untuk mengoptimalkan pekerjaan programmer. Ingat 10-20 singkatan mnemonic tidak sulit, lupakan tim asli hampir mustahil. Alias ββadalah standar, jadi ketika Anda mengalihkan seluruh tim ke Zsh
+ Oh My Zsh
, Anda dapat bekerja pada kecepatan dan kenyamanan yang sama, bahkan dengan pemrograman berpasangan.
Ke mana harus pergi selanjutnya?
Saya menawarkan opsi berikut:
- Akhirnya, cari tahu bagaimana Geet diatur di dalam . Ini membantu untuk memahami apa yang Anda lakukan dan mengapa apa yang ingin Anda lakukan tidak berhasil.
- Jangan malas untuk sekali lagi melihat dokumentasi untuk perintah:
git --help
atau ghh
. - Lihat daftar lengkap alias di tautan . Mencoba mengingat semuanya itu gila, tetapi menggunakan daftar sebagai kumpulan perintah dan kunci yang menarik bagi mereka adalah ide yang bagus.
Beberapa alias dibuat non-sepele, tetapi terbukti sangat berguna dalam praktik. Banyak alias yang disajikan tidak hanya singkatan, tetapi fungsi kecil yang lebih mengoptimalkan pekerjaan. Menggunakan Git menjadi lebih menyenangkan, kualitas komitmen telah meningkat.
Saya harap materinya ternyata bermanfaat, dan Anda bisa belajar sesuatu yang baru untuk diri Anda sendiri. Atau mungkin mereka sudah mulai secara aktif memperkenalkan pendekatan baru. Semoga beruntung