Saya tahu beberapa orang yang menggunakan git pull --rebase
secara default dan yang lain bersikeras tidak pernah menggunakannya. Saya percaya saya mengerti perbedaan antara merger dan rebasing, tapi saya mencoba untuk menempatkan ini dalam konteks git pull
. Apakah hanya tentang tidak ingin melihat banyak pesan gabungan melakukan, atau ada masalah lain?
806
Jawaban:
Anda harus menggunakan
git pull --rebase
kapanMemang - mengapa tidak? Ini lebih jelas, dan tidak memaksakan pengelompokan logis pada komitmen Anda.
Ok, saya kira perlu beberapa klarifikasi. Di Git, seperti yang mungkin Anda ketahui, Anda didorong untuk bercabang dan bergabung. Cabang lokal Anda, tempat Anda menarik perubahan, dan cabang jarak jauh sebenarnya adalah cabang yang berbeda, dan
git pull
akan menggabungkannya. Ini masuk akal, karena Anda mendorong sangat jarang dan biasanya mengumpulkan sejumlah perubahan sebelum mereka merupakan fitur yang lengkap.Namun, kadang-kadang - dengan alasan apa pun - Anda berpikir bahwa sebenarnya akan lebih baik jika keduanya - terpencil dan lokal - adalah satu cabang. Seperti di SVN. Di sinilah tempat
git pull --rebase
bermain. Anda tidak lagi bergabung - Anda benar-benar melakukan di atas cabang jarak jauh . Sebenarnya itu tentang apa.Apakah itu berbahaya atau tidak, adalah pertanyaan apakah Anda memperlakukan cabang lokal dan terpencil sebagai satu hal yang tidak dapat dipisahkan. Terkadang masuk akal (ketika perubahan Anda kecil, atau jika Anda berada di awal perkembangan yang kuat, ketika perubahan penting dilakukan dengan komitmen kecil). Terkadang bukan (saat Anda biasanya membuat cabang lain, tetapi Anda terlalu malas untuk melakukannya). Tapi itu pertanyaan yang berbeda.
sumber
git config --global pull.rebase preserve
(pertahankan mengatakan selain memungkinkan rebasing, untuk mencoba mempertahankan penggabungan jika Anda telah membuat secara lokal).Saya ingin memberikan perspektif yang berbeda tentang apa arti sebenarnya "git pull --rebase", karena kadang-kadang sepertinya hilang.
Jika Anda pernah menggunakan Subversion (atau CVS), Anda mungkin terbiasa dengan perilaku "pembaruan svn". Jika Anda memiliki perubahan untuk dikomit dan komit gagal karena perubahan telah dibuat hulu, Anda "memperbarui". Subversi dihasilkan dengan menggabungkan perubahan hulu dengan milik Anda, yang berpotensi menimbulkan konflik.
Apa yang baru saja dilakukan Subversion, pada dasarnya adalah "pull --rebase". Tindakan merumuskan ulang perubahan lokal Anda menjadi relatif terhadap versi yang lebih baru adalah bagian "rebasing". Jika Anda telah melakukan "svn diff" sebelum upaya komit yang gagal, dan membandingkan diff yang dihasilkan dengan output dari "svn diff" sesudahnya, perbedaan antara kedua diff adalah apa yang dilakukan operasi rebasing.
Perbedaan utama antara Git dan Subversion dalam kasus ini adalah bahwa dalam Subversion, perubahan "Anda" hanya ada sebagai perubahan yang tidak dikomit dalam copy pekerjaan Anda, sementara di Git Anda memiliki komitmen aktual secara lokal. Dengan kata lain, di Git Anda telah memotong sejarah; sejarah Anda dan sejarah hulu telah menyimpang, tetapi Anda memiliki leluhur yang sama.
Menurut pendapat saya, dalam kasus normal memiliki cabang lokal Anda hanya mencerminkan cabang hulu dan melakukan pengembangan terus-menerus di atasnya, hal yang benar untuk dilakukan adalah selalu "--rase", karena itulah yang sebenarnya Anda lakukan secara semantik . Anda dan yang lainnya sedang meretas pada sejarah linier yang dimaksudkan dari sebuah cabang. Fakta bahwa orang lain kebetulan mendorong sedikit sebelum upaya yang Anda coba tidak relevan, dan tampaknya tidak produktif untuk setiap kecelakaan waktu seperti itu untuk menghasilkan penggabungan dalam sejarah.
Jika Anda benar-benar merasakan perlunya sesuatu untuk menjadi cabang untuk alasan apa pun, itu adalah keprihatinan yang berbeda menurut saya. Tetapi kecuali jika Anda memiliki keinginan spesifik dan aktif untuk mewakili perubahan Anda dalam bentuk penggabungan, perilaku default seharusnya, menurut pendapat saya, adalah "git pull --rebase".
Harap pertimbangkan orang lain yang perlu mengamati dan memahami sejarah proyek Anda. Apakah Anda ingin sejarah penuh dengan ratusan gabungan di semua tempat, atau Anda ingin hanya beberapa gabungan terpilih yang mewakili gabungan nyata dari upaya pengembangan yang berbeda secara disengaja?
sumber
git config --global branch.autosetupmerge always
?Mungkin cara terbaik untuk menjelaskannya adalah dengan contoh:
git checkout master && git pull
. Master sudah terkini.git checkout master && git pull
. Master sudah terkini.git merge topic-branch-A
git merge topic-branch-B
git push origin master
sebelum Alicegit push origin master
, yang ditolak karena itu bukan penggabungan maju cepat.git pull --rebase origin master
git push origin master
, dan semua orang senang mereka tidak harus membaca komit gabungan yang tidak berguna ketika mereka melihat log di masa depan.Perhatikan bahwa cabang spesifik yang digabungkan menjadi tidak relevan dengan contoh. Master dalam contoh ini bisa dengan mudah menjadi cabang rilis atau cabang dev. Poin kuncinya adalah bahwa Alice & Bob secara bersamaan menggabungkan cabang lokal mereka ke cabang terpencil bersama.
sumber
git co master && git pull; git checkout topic-branch-A; git rebase master; git checkout master; git merge topic-branch-A; git push origin master
dan mengulangi jika dorongan orang lain untuk menguasai terjadi sebelum saya. Meskipun saya bisa melihat keuntungan ringkas dalam resep Anda.Saya pikir Anda harus menggunakan
git pull --rebase
ketika berkolaborasi dengan orang lain di cabang yang sama. Anda berada di pekerjaan Anda → komit → pekerjaan → komit siklus, dan ketika Anda memutuskan untuk mendorong pekerjaan Anda dorongan Anda ditolak, karena ada pekerjaan paralel di cabang yang sama. Pada titik ini saya selalu melakukanpull --rebase
. Saya tidak menggunakan squash (untuk meratakan komit), tapi saya rebase untuk menghindari komit gabungan tambahan.Ketika pengetahuan Git Anda meningkat, Anda mendapati diri Anda lebih melihat sejarah daripada dengan sistem kontrol versi lain yang saya gunakan. Jika Anda memiliki banyak komitmen gabungan, mudah kehilangan fokus dari gambaran besar yang terjadi dalam sejarah Anda.
Ini sebenarnya satu-satunya saat saya melakukan rebasing (*), dan sisa alur kerja saya berbasis penggabungan. Tetapi selama komuter Anda yang paling sering melakukan ini, sejarah pada akhirnya terlihat jauh lebih baik.
(*) Saat mengajar kursus Git, saya meminta seorang siswa untuk menangkap saya dalam hal ini, karena saya juga menganjurkan cabang fitur rebasing dalam keadaan tertentu. Dan dia telah membaca jawaban ini;) Rebasing semacam itu juga mungkin, tetapi selalu harus sesuai dengan sistem yang telah diatur sebelumnya / disepakati, dan dengan demikian tidak boleh "selalu" diterapkan. Dan pada saat itu saya biasanya tidak melakukan
pull --rebase
keduanya, yang merupakan pertanyaan:)sumber
Saya tidak berpikir ada alasan untuk tidak menggunakan
pull --rebase
- saya menambahkan kode ke Git secara khusus untuk memungkinkangit pull
perintah saya untuk selalu rebase terhadap komitmen upstream.Saat menelusuri sejarah, tidak pernah menarik untuk mengetahui kapan orang yang bekerja pada fitur tersebut berhenti untuk menyinkronkan. Ini mungkin berguna untuk pria / wanita saat dia melakukannya, tapi itu untuk apa
reflog
. Itu hanya menambahkan suara untuk orang lain.sumber
pull --rebase
harus selalu digunakan, mengapa tidakpull
melakukannya secara default?.gitconfig
untuk membuat beberapa opsi melakukan hal yang benar. Saya pikir git rebase melakukan hal yang salah secara default, seperti halnya git tag, dll ... Jika Anda tidak setuju, Anda tidak perlu membenarkan pendapat Anda.master
, dan jika cabang yang Anda tarik belum go public (belum). Jika Anda menarik di sisi lain dari cabang fitur kemaster
dalamnya lebih seperti sebaliknya: tidak pernah ada alasan untuk menggunakannya--rebase
, kan? Itu mungkin menjadi alasan mengapa itu tidak standar. Saya menemukan Rebases adalah bagaimana perubahan harus lulus dari puncak hierarki ke bawah dan penggabungan adalah bagaimana mereka mengalir kembali ke atas. derekgourlay.com/blog/git-when-to-merge-vs-when-to-rebaseIngatlah:
Jadi, pilih cara yang Anda inginkan untuk menangani cabang Anda.
Anda sebaiknya tahu perbedaan antara penggabungan dan rebase :)
sumber
Saya pikir itu bermuara pada preferensi pribadi.
Apakah Anda ingin menyembunyikan kesalahan konyol Anda sebelum mendorong perubahan Anda? Jika demikian,
git pull --rebase
itu sempurna. Hal ini memungkinkan Anda untuk kemudian menekan komitmen Anda ke beberapa (atau satu) komitmen. Jika Anda memiliki penggabungan dalam riwayat Anda (tidak dicuri), itu tidak mudah untuk dilakukangit rebase
nanti.Saya pribadi tidak keberatan mempublikasikan semua kesalahan konyol saya, jadi saya cenderung bergabung bukan rebase.
sumber
git pull --rebase
dapat menyembunyikan riwayat penulisan ulang dari kolaboratorgit push --force
. Saya sarankan untuk menggunakangit pull --rebase
hanya jika Anda tahu Anda lupa mendorong komit Anda sebelum orang lain melakukan hal yang sama.Jika Anda tidak melakukan apa pun, tetapi ruang kerja Anda tidak bersih, tepat
git stash
sebelumgit pull
. Dengan cara ini Anda tidak akan menulis ulang riwayat Anda secara diam-diam (yang dapat secara diam-diam meninggalkan beberapa pekerjaan Anda).sumber