Penggunaan Geeta tingkat lanjut atau bagaimana pensiun enam bulan sebelumnya?


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:


  1. 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.
  2. 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:


 # macOS brew install zsh zsh-completions && sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" # Ubuntu, Debian, ... apt install zsh && sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)" 

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 :


 # macOS brew install tig # Ubuntu, Debian, ... # https://jonas.imtqy.com/tig/INSTALL.html 

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 ## master M b.md A e.md ?? d.md 

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 # git status -sb 


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 # git add --all 

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 -- d.md 

Dan buat komit dengan alias " g it c ommit" :


 $ gc # git commit 

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 #    $ gcmsg "Add new file" # git commit -m "Add new file" 

Dan kita bisa ...


... komit file yang dimodifikasi dari indeks dengan satu perintah:


 $ gcam "Add changes" # git commit -a -m "Add changes" 

... lihat perubahan dengan kata-kata alih-alih baris (sangat berguna saat bekerja dengan teks):


 $ gdw # git diff --word-diff 

... tambahkan file dalam bagian-bagian (sangat berguna ketika Anda perlu menambahkan hanya bagian komit dari perubahan dari file):


 $ gapa # git add --patch 

... tambahkan ke file indeks saja yang sudah di bawah pengawasan Geeta:


 $ gau # git add --update 

Total:


Tambahkan ke Indeks / Buat Komit

 $ ga # git add $ gc # git commit 


Perbaiki komit


Nama komit terakhir tidak menjelaskan perubahan yang kami buat. Mari kita merumuskan kembali:


 $ gc! # git commit -v --amend 

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! # git commit -v --no-edit --amend 

... buat semua perubahan file dengan segera ke komit, tanpa terlebih dahulu menambahkan ke indeks:


 $ gca! # git commit -v -a --amend 

... gabungkan dua perintah sebelumnya:


 $ gcan! # git commit -v -a --no-edit --amend 

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! # git commit -v --amend 


Memulai fitur baru


Buat cabang baru dari alias saat ini " g it c heckout b ranch" :


 $ gcb erlang # git checkout --branch 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 # git branch -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 # git checkout --branch 


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 # git checkout master 

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 # git merge 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 # git merge 


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~ # git reset --hard HEAD~ 


Kami menyelesaikan konflik


Aliran checkout – rebase – merge untuk menyiapkan riwayat perubahan linier dilakukan dengan urutan alias berikut:


 gco elixir # git checkout elixir grbm # git rebase master gcm # git checkout master gm elixir # git merge 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 # git rebase 


Mengirimkan perubahan ke server


Pertama kita tambahkan origin alias " g it r emote a dd" :


 $ gra origin git@github.com/... # git remote add 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 # git push origin git_current_branch 

Anda juga bisa ...


... kirim perubahan ke server dengan pemasangan upstream alias " g it p ush s et up stream" :


 $ gpsup # git push --set-upstream origin $(git_current_branch) 

Kirim perubahan ke server

 $ gp # git push 


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 # git pull --rebase 

Kemudian Anda dapat mengirim perubahan ke server dengan aman. Konflik diselesaikan.


Dapatkan perubahan dari server

 $ gl # git pull 


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 # git branch --no-color --merged | command grep -vE "^(\*|\s*(master|develop|dev)\s*$)" | command xargs -n 1 git branch -d 

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 # git add -A; git rm $(git ls-files --deleted) 2> /dev/null; git commit --no-verify -m "--wip-- [skip ci]" 

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 # git log -n 1 | grep -q -c "\-\-wip\-\-" && git reset HEAD~1 

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 # git stash save 

Dan kemudian kembalikan mereka dengan alias β€œ g it st ash p op” :


 $ gstp # git stash pop 

Atau metode " g it st ash a ll a ply" yang lebih aman :


 $ gstaa # git stash apply 

Anda juga bisa ...


... lihat apa sebenarnya yang kami sembunyikan:


 gsts # git stash show --text 

... gunakan singkatan untuk perintah terkait:


 gstc # git stash clear gstd # git stash drop gstl # git stash list 

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 # git bisect start 

Kami perhatikan bahwa saat ini, terakhir di cabang, komit mengandung kesalahan dengan alias " g it b i s ect b ad" :


 $ gbsb # git bisect bad 

Sekarang kita menandai komit yang menjamin kita keadaan operasional aplikasi " g it be iect g ood" :


 $ gbsg HEAD~20 # git bisect good HEAD~20 

Dan sekarang tetap melanjutkan untuk menjawab pertanyaan Gita dengan frasa gbsb atau gbsg , dan setelah menemukan pelakunya, reset prosedur:


 $ gbsr # git bisect reset 

Dan saya benar-benar menulis singkatan ini ketika menggunakan alat ini.


Kesalahan melakukan pencarian

 $ gbss # git bisect start $ gbsb # git bisect bad $ gbsg # git bisect good $ gbsr # git bisect reset 


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 # git blame -b -w 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:


 #           $ gcb elixir-recover 17cb385 #    $ gbd elixir #     $ gb -m elixir 

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:


 #      $ grh --soft HEAD@{1} # git reset -soft #   $ gcmsg "Commit description" 

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 :


 #   master $ gcm # git checkout master #        $ gcb elixir-new # git checkout --branch elixir-new #           $ gcp elixir@{0} # git cherry-pick elixir@{0} 

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 - # git checkout - $ gm - # git merge - $ grb - # git rebase - 

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 # git clean -Xfd 

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:


  1. 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.
  2. Jangan malas untuk sekali lagi melihat dokumentasi untuk perintah: git --help atau ghh .
  3. 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

Source: https://habr.com/ru/post/id420529/


All Articles