Saya satu-satunya di organisasi saya yang membuat komitmen dengan pesan berikut:
Gabungkan cabang pelacakan jarak jauh 'origin / develop' menjadi develop
Tidak yakin apa yang saya lakukan yang menyebabkan mereka, tetapi saya ingin berhenti.
Perintah apa yang saya keluarkan untuk membuat komit ini, dan perintah apa yang tepat yang harus saya gunakan untuk tidak memproduksinya?
git
branching-and-merging
git-merge
git-remote
Jordan Feldstein
sumber
sumber
git pull --autostash --rebase
bekerja untuk Anda @Johnjohn?Jawaban:
git pull
mungkin membuat komit. Jika Anda membuat komit lokal dan kemudian menjalankangit pull
setelah orang lain mendorong komit ke repositori, Git mengunduh komit pengembang lain dan kemudian menggabungkannya ke cabang lokal Anda.Bagaimana cara menghindari komitmen gabungan ini di masa mendatang
Anda dapat menggunakan
git pull --rebase
untuk mencegah hal ini terjadi di masa mendatang, tetapi rebasing memiliki risiko sendiri, dan saya sarankan untuk menghindarinyapull
sama sekali .Sebagai gantinya, saya mendorong Anda untuk mengikuti pola penggunaan ini:
Penjelasan
git remote update -p
mengunduh semua komit di repositori jarak jauh dan memperbarui cabang pelacakan jarak jauh (misalnya,origin/master
). Ini TIDAK menyentuh direktori kerja, indeks, atau cabang lokal Anda.The
-p
plum Argumen dihapus cabang hulu. Dengan demikian, jikafoo
cabang tersebut terhapus diorigin
repositori,git remote update -p
otomatisorigin/foo
ref Anda akan terhapus .git merge --ff-only @{u}
memberi tahu Git untuk menggabungkan cabang upstream (@{u}
argumen) ke dalam cabang lokal Anda tetapi hanya jika cabang lokal Anda dapat "diteruskan dengan cepat" ke cabang upstream (dengan kata lain, jika cabang tersebut belum menyimpang).git rebase -p @{u}
secara efektif memindahkan komit yang telah Anda buat tetapi belum mendorong ke atas cabang hulu, yang menghilangkan kebutuhan untuk membuat komit gabungan konyol yang Anda coba hindari. Ini meningkatkan linearitas riwayat pengembangan, membuatnya lebih mudah untuk ditinjau.The
-p
pilihan memberitahu Git untuk melestarikan gabungan. Hal ini mencegah Git melinierisasi komitmen yang dibuat ulang. Ini penting jika, misalnya, Anda menggabungkan cabang fitur menjadimaster
. Tanpa-p
, setiap komit pada cabang fitur akan diduplikasimaster
sebagai bagian dari linierisasi yang dilakukan olehgit rebase
. Ini akan membuat riwayat perkembangan lebih sulit untuk ditinjau, bukan lebih mudah.Waspadalah :
git rebase
mungkin tidak melakukan apa yang Anda harapkan, jadi tinjau hasilnya sebelum mendorong. Sebagai contoh:Saya lebih suka pendekatan ini
git pull --rebase
karena alasan berikut:-p
(--preserve-merges
)git rebase
jika Anda perlu melakukan rebase pada penggabungan yang disengaja (misalnya, menggabungkan cabang fitur yang sudah didorong kemaster
).Singkatan:
git up
bukangit pull
Untuk mempermudah melakukan hal di atas, saya sarankan membuat alias bernama
up
:Sekarang yang perlu Anda lakukan untuk memperbarui cabang Anda adalah menjalankan:
bukannya
git pull
. Jika Anda mendapatkan kesalahan karena cabang lokal Anda menyimpang dari cabang hulu, itu isyarat Anda untuk melakukan rebase.Mengapa tidak
git pull --rebase
?Berlari
git pull --rebase
setara dengan berlarigit fetch
diikuti dengangit rebase
. Ini mencoba untuk mempercepat ke komit upstream baru, tetapi jika itu tidak memungkinkan maka itu akan me-rebase komit lokal Anda ke komit upstream baru. Ini biasanya OK, tapi hati-hati:git pull --rebase
tidak memberi Anda kesempatan untuk memeriksa komit sebelum memasukkannya. Tergantung pada apa yang berubah hulu, itu sangat mungkin bahwa rebase adalah salah operasi-arebase --onto
,merge
,reset
, ataupush -f
mungkin lebih tepat daripada polosrebase
.--preserve-merges
ke operasi rebase, jadi setiap penggabungan yang disengaja dari cabang fitur akan dilinearisasi, mengulang (dan dengan demikian menggandakan) semua cabang fitur yang berkomitmen."Memperbaiki" komit penggabungan yang ada yang dibuat oleh
git pull
Jika Anda belum mendorong komit penggabungan yang dibuat oleh
git pull
, Anda dapat menghapus kembali komit penggabungan. Dengan asumsi Anda belum membuat penggabungan yang disengaja (misalnya, menggabungkan cabang fitur yang sudah didorong ke cabang Anda saat ini), berikut ini yang harus dilakukan:Perintah di atas memberitahu Git untuk memilih semua komit non-gabungan yang dapat dijangkau dari
HEAD
(komit saat ini), dikurangi semua komitmen yang dapat dijangkau dari@{u}
(yang merupakan singkatan dari "cabang upstream", yaitu,origin/master
jikaHEAD
adamaster
), putar ulang (cherry-pick ) di atas cabang upstream, lalu pindahkan referensi cabang saat ini untuk menunjukkan hasil dari pemutaran ulang komit. Ini secara efektif memindahkan komitmen non-penggabungan ke komit upstream terbaru, yang menghilangkan penggabungan yang dibuat olehgit pull
.Jika Anda memiliki komit penggabungan yang disengaja, Anda tidak ingin menjalankannya
git rebase @{u}
karena itu akan memutar ulang semuanya dari cabang lain. Menangani kasus ini jauh lebih rumit, oleh karena itu sebaiknya digunakangit up
dan dihindarigit pull
sama sekali. Anda mungkin harus menggunakanreset
untuk membatalkan penggabungan yang dibuat olehpull
dan kemudian melakukannyagit rebase -p @{u}
. The-p
argumen untukgit rebase
tidak bekerja andal untuk saya, sehingga Anda mungkin akhirnya harus menggunakanreset
untuk membatalkan penggabungan disengaja, memperbarui cabang lokal Anda untuk@{u}
, dan kemudian mengulang gabungan disengaja (yang sakit jika ada banyak merge berbulu konflik).sumber
-p
. Saya menghindari merekomendasikannya sebelumnya karena tidak terlalu sering diperlukan dan perilakunya tidak terdokumentasi dengan baik.git remote update -p
dangit fetch
?git remote update -p
sama dengangit fetch --all -p
. Saya terbiasa menggunakangit remote update -p
punggung ketikafetch
tidak punya-p
pilihan.Itu harus dilakukan. Atau jika ingin terus menggunakan tarik
Anda juga dapat mengatur cabang itu dalam konfigurasi Anda untuk melakukan rebase secara otomatis, atau diatur seperti itu secara otomatis untuk cabang pelacakan lain yang Anda buat di masa mendatang. Kemudian Anda dapat kembali menggunakan
Lebih lanjut tentang ini di bagian "tarik dengan rebase daripada menggabungkan" halaman ini:
http://mislav.uniqpath.com/2010/07/git-tips/
sumber