团队开发里频繁使用 git rebase 来保持树的整洁好吗?
巴扎黑
巴扎黑 2017-04-25 09:02:57
0
11
1740

用了以后, 树可以非常清晰, 某种程度上便于追踪, 但是 push --force 就多多了,
不用呢, 合并没有远程仓库被修改的麻烦, 可是追踪又不清晰...

怎样取舍? 团队里一般怎么取舍?

巴扎黑
巴扎黑

membalas semua(11)
滿天的星座

git rebase ialah penulisan semula sejarah komit. Apabila sejarah komit yang ingin anda tulis semula belum diserahkan kepada repo jauh, iaitu sebelum ia dikongsi dengan orang lain, sejarah komit adalah peribadi kepada anda, jadi anda boleh menulis semula mengikut kehendak anda. .

Apabila ia diserahkan kepada alat kawalan jauh, jika anda menulis semula sejarah, ia pasti akan berbeza daripada sejarah orang lain. git push, git akan membandingkan sejarah komit Jika ia tidak konsisten, tindakan komit akan ditolak sejarah committer, oleh itu Lengkapkan penyerahan kod. Walaupun kod telah diserahkan, ini boleh menyebabkan kehilangan kerja orang lain, jadi gunakan parameter -f dengan berhati-hati. -f

Masalah yang dihadapi oleh poster asal adalah disebabkan oleh penulisan semula sejarah komitmen awam. Untuk menyelesaikan masalah ini, kita perlu menyeragamkan proses penyerahan.

Beri saya contoh proses yang betul:

Andaikan terdapat dua pembangun dalam pasukan poster: Tom dan Jerry Mereka bersama-sama menggunakan repo jauh dan mengklonkannya ke mesin mereka sendiri, diandaikan hanya terdapat satu cabang:

. master

Pada masa ini, repo mesin tom mempunyai dua cabang


, masterorigin/master Mesin Jerry juga mempunyai dua cawangan

, masterorigin/master

Kedua-duanya ditunjukkan dalam gambar di bawah

Tom dan Jerry masing-masing membangunkan ciri baharu mereka sendiri, dan komitmen baharu sentiasa diserahkan kepada sejarah komitmen peribadi masing-masing, jadi petunjuk utama mereka terus bergerak ke hadapan, menunjuk kepada komitmen yang berbeza. Dan kerana tiada seorang pun daripada mereka mempunyai

dan git fetch, git push mereka kekal tidak berubah. origin/master

Repo Jerry adalah seperti berikut

Repo Tom adalah seperti berikut. Ambil perhatian bahawa

dan T1 dalam gambar di atas adalah dua komitmen yang berbeza J1

Pada masa ini, Tom mula-mula menyerahkan komitmennya ke repo jauh, kemudian penuding

tempatannya akan maju dan konsisten dengan penuding origin/master, seperti berikut master

Repo jauh adalah seperti berikut

Sekarang Jerry juga mahu menyerahkan komitnya ke repo jauh, jalankan git push, dan ia gagal tanpa sebarang kejutan, jadi dia git fetch melakukannya dan meletakkan repo jauh, yang telah diserahkan oleh Tom sebelum T1 Ia telah ditarik ke repo tempatannya, seperti berikut

Sejarah komit telah bercabang-cabang Jika anda ingin memasukkan kandungan yang sebelum ini diserahkan oleh Tom ke dalam kerja anda sendiri, salah satu caranya ialah dengan git merge, yang secara automatik akan menjana komitmen yang merangkumi penyerahan Tom dan komit Jerry menggabungkan dua komit bercabang kembali bersama. Walau bagaimanapun, komitmen yang dijana secara automatik ini akan mempunyai dua ibu bapa Apabila menyemak kod, ia mesti dibandingkan dua kali, yang sangat menyusahkan.

Untuk memastikan kelinearan sejarah komit, jerry memutuskan untuk menggunakan kaedah lain, iaitu git rebase. Komit Jerry J1 belum diserahkan kepada repo jauh pada masa ini, yang merupakan komitmen yang sepenuhnya peribadi kepadanya, jadi tiada masalah menggunakan git rebase untuk menulis semula sejarah J1 Selepas menulis semula, ia akan menjadi seperti berikut

Perhatikan bahawa J1 telah ditulis semula selepas T1 dan menjadi J1`

Selepas

git push, repo tempatan

Dan repo jauh

Sangat santai, garis lurus, tiada apa-f

Jadi, jika anda ingin memastikan pokok itu kemas tanpa menggunakan -f, kaedahnya ialah: sebelum git push, dahulu git fetch, kemudian git rebase.

git fetch origin master
git rebase origin/master
git push

Bacaan yang sangat disyorkan

  • model percabangan git yang berjaya
  • Pengkalan semula cawangan-Git-cawangan
巴扎黑

Melainkan anda seorang sahaja yang menggunakannya, sesiapa yang menggunakan push --force harus mati.

PHPzhong

Pengikatan (penjejakan) cawangan tempatan dan cawangan terpencil, serta strategi pangkalan semula:

[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

Dengan cara ini, rebase akan digunakan secara automatik apabila mengemas kini kod (pull) dan bukannya menjana komit gabungan, melainkan terdapat situasi lain, seperti konflik yang disebabkan oleh penggabungan tiga pihak yang memerlukan campur tangan. Selalunya ia sangat pintar asalkan tabiat dalam pasukan itu baik, maka bentuk pokok yang sangat bersih dan cantik dapat dikekalkan.

Sebenarnya, terdapat banyak cara untuk menjadikan struktur pokok lebih cantik dan jelas, tetapi ia bergantung pada jenis Model Git yang digunakan oleh pasukan, dan anda hanya boleh menetapkan ubat yang betul. Tidak ada cara untuk merumuskannya di sini.

Selain itu, orang di atas betul, gunakannya dengan berhati-hati push -f!

我想大声告诉你

Ini sepatutnya menjadi masalah aliran kerja git Pasukan kami telah menggunakan rebase untuk memastikan kebersihan maklumat komit, tetapi kami tidak akan menggunakan operasi seperti push -f.

Mengenai aliran kerja git, anda boleh membaca artikel berikut dan mencari artikel yang sesuai dengan pasukan anda. Tetapi perkara yang paling penting ialah memastikan semua orang dalam pasukan terbiasa dengan git.

  • Bina petunjuk sejarah Git yang bersih
  • Model percabangan Git yang berjaya yang diedarkan secara meluas
  • Aliran kerja Github

Jika anda menggunakan github untuk kerja berpasukan, gunakan permintaan tarik dengan baik, ia boleh menyelesaikan push -fmasalah bodoh ini!

阿神

Semua orang harus menyandarkan semula pengubahsuaian mereka kepada kod pelayan terkini sebelum menyerahkan tiada masalah jika anda mengikut peraturan ini. Jika anda memerlukan tolakan paksa, ini bermakna anda melakukannya secara sebaliknya.

Ty80

Adalah disyorkan untuk merujuk kepada bab mengenai rebase dalam Pro Git http://git-scm.com/book/zh/Git-%E5%88%86%E6%94%AF-%E5%88% 86%E6% 94%AF%E7%9A%84%E8%A1%8D%E5%90%88

Risiko penjanaan semula
Nah, terbitan yang indah itu tidak sempurna untuk menggunakannya, anda mesti mematuhi satu peraturan:

Setelah objek komit dalam cawangan diterbitkan ke gudang awam, jangan sekali-kali meletakkan semula cawangan itu.

Jika anda mengikuti peraturan emas ini, tiada apa yang boleh menjadi salah. Jika tidak, orang ramai akan membenci anda, dan rakan serta keluarga anda akan mentertawakan anda dan menolak anda.

Setahu saya. Jika anda perlu menggunakan push -f selepas rebase, ini mesti bermakna operasi rebase tidak sesuai. Melainkan anda berhasrat untuk mengubah suai sejarah komit.

漂亮男人

Tidak perlu menolak -f Jika cawangan ketinggalan, gunakan pull --rebase

伊谢尔伦

Jawapan di atas semuanya betul secara peribadi, melainkan anda seorang sahaja yang bekerja di cawangan tertentu, tidak akan ada masalah tidak kira bagaimana anda membuat rebase, tetapi jika anda berada dalam master. atau kembangkanApabila anda membina semula cawangan jenis ini, dianggarkan semua orang dalam pasukan mahu mengalahkan anda hingga mati, terutamanya rakan sepasukan yang tidak biasa dengan git.

Hanya ada satu situasi di mana push -f ditolak selepas rebase, iaitu subjek mengalami gangguan obsesif-kompulsif seperti saya, dan takut akan perkara yang menyakitkan seperti masa mati komputer dan sistem ranap (sejarah tragis darah dan tears), dan selepas melengkapkan komit ciri, tolaknya dengan cepat ke Alat kawalan jauh hanya milik cawangan anda Untuk mendapatkan ciri baharu pembangunan, anda membina semula pada cawangan anda sendiri setiap hari dan melakukan operasi tolak berulang kali Secara peribadi, saya rasa tidak ada masalah lagi, anda hanya menjejaskan diri sendiri (dan anda tahu ia betul).

Ty80

Secara peribadi, saya fikir adalah tidak munasabah untuk menggunakan rebase apabila anda bekerja sebagai satu pasukan di cawangan tertentu. Dan mudah tersilap. Gunakan dengan berhati-hati tekan --kuat

習慣沉默

Git rebase biasanya digunakan apabila membangunkan secara bersendirian untuk memastikan rekod penyerahan bersih. Setelah dimuat naik ke github, anda tidak sepatutnya menggunakan git rebase, jika tidak anda akan dimarahi hingga mati.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan