Cara menguji gabungan tanpa benar-benar bergabung terlebih dahulu


166

Apakah ada cara untuk mensimulasikan git mergeantara dua cabang, cabang kerja saat ini dan master, tetapi tanpa membuat perubahan?

Saya sering mengalami konflik ketika harus membuat git merge. Apakah ada cara untuk mensimulasikan penggabungan terlebih dahulu?



Jawaban:


132

Saya tidak berpikir ada cara mensimulasikan apa yang akan terjadi sampai Anda mencoba penggabungan. Namun, jika Anda memastikan bahwa output git statuskosong sebelum Anda melakukan penggabungan, cukup aman untuk melanjutkan dan mencobanya. Jika Anda mendapatkan konflik, Anda dapat segera kembali ke keadaan sebelumnya dengan:

git reset --merge

Sejak git 1.7.4, Anda juga dapat membatalkan penggabungan dengan melakukan:

git merge --abort

(Seperti pesan komit yang menambahkan opsi itu menjelaskan , ini ditambahkan untuk konsistensi dengan git rebase --abortdan sebagainya.)


4
@ Jawaban Amber adalah menjawab persis apa yang ditanyakan 'bagaimana mensimulasikan penggabungan'. menggunakan --no-commitjauh lebih mudah menurut saya
samirahmed

14
@samirahmed: @Amber menjawab pertanyaan itu dengan lebih harfiah, tentu saja, meskipun dengan --no-commitAnda masih mengubah indeks dan pohon kerja, yang sebenarnya bukan "tanpa membuat perubahan" :) Maksud saya adalah ketika orang bertanya seperti ini pertanyaan, itu umumnya karena mereka tidak menyadari bahwa cara terbaik untuk melihat bagaimana sebuah penggabungan akan pergi dengan hanya mencoba penggabungan , sering kali karena mereka tidak menyadari betapa mudahnya untuk kembali ke keadaan mereka sebelumnya jika ternyata ada masalah.
Mark Longair

2
Saya tidak tahu apakah ini ditambahkan dalam versi git yang lebih baru, tetapi dalam dokumen (1.8.4) ia menyatakan " git merge --abortsetara dengan git reset --mergekapan MERGE_HEADhadir", jadi apa pun yang lebih mudah diingat :)
Samuel Meacham

@SamuelMeacham: terima kasih telah menunjukkannya - diperkenalkan di 1.7.4. Saya sudah memperbarui jawabannya dengan itu. Terima kasih!
Mark Longair

Saran ini tidak melakukan apa pun untuk saya, di git 1.9.4.
Djangofan

137

Anda bisa menggunakan git merge --no-commituntuk mencegah penggabungan dari benar-benar dilakukan, dan jika Anda tidak suka bagaimana penggabungan bekerja, cukup reset ke kepala asli.

Jika Anda benar-benar tidak ingin menyelesaikan penggabungan, bahkan jika itu adalah langkah maju (dan dengan demikian tidak memiliki konflik, menurut definisi), Anda dapat menambahkan --no-ffjuga.


Saya tidak berpikir itu git merge --abortada - mungkin maksud Anda git reset --merge?
Mark Longair

Nah, saya hanya lupa bahwa tidak seperti tidak rebaseada --abortuntuk git merge.
Amber

7
Saya akan melemparkan --no-ffjuga. Agar tidak terjadi penggabungan.
Andy

1
@ Andy --no-ffcukup wajib di sini, karena --no-committidak menghentikan perubahan maju cepat.
jackr

1
@Anant Anand Gupta - ini adalah trik yang bagus tetapi harus: git config --global alias.tm "gabungkan --tidak-komit --tidak-ff"
pasx

109

Jika saya ingin membandingkan perubahan pada cabang topik untuk dikuasai, saya merasa paling mudah dan aman untuk melakukan hal berikut:

git checkout master
git checkout -b trial_merge
git merge topic_branch

Setelah menyelesaikan penggabungan, mudah untuk melihat perubahan gabungan dari master

git diff master

Setelah selesai, cukup hapus cabang trial_merge

git checkout master
git branch -D trial_merge

Dengan cara ini, cabang master tidak pernah berubah.


4
Anda juga dapat melakukan git checkout --detachdan menguji apa pun yang Anda inginkan. Nanti, jika Anda ingin menyimpan perubahan Anda, lakukan git checkout -b new_branch. Dan jika Anda ingin membuang perubahan Anda, checkout semua cabang yang Anda inginkan ( git checkout master).
Shayan Toqraee

Jika topic_branchbesar (seperti yang mungkin terjadi jika Anda berada di pertanyaan ini di tempat pertama) diff masterhasilnya mungkin terlalu besar bagi Anda untuk melihat jika penggabungan akan menyebabkan konflik.
Crescent Fresh

Saya sangat suka ini ... aman dan sederhana.
leo

4

Saya menggunakan :

git merge --ff-only

menurut dokumentasi :

Menolak untuk menggabungkan dan keluar dengan status bukan nol kecuali KEPALA saat ini sudah mutakhir atau penggabungan dapat diselesaikan sebagai fast-forward.

Ini bukan simulasi karena akan ada penggabungan cepat jika tidak ada konflik antara dua cabang. Tetapi jika terjadi konflik, Anda akan diberi tahu dan tidak ada yang terjadi.


4

Saya sudah bisa menggunakan git merge --abort, baru-baru ini. Namun, ini hanya dapat digunakan jika ada konflik gabungan. Jika Anda yakin tidak ingin melakukan komitmen, maka gunakan metode lain yang disebutkan di atas.


1
Metode lain apa yang disebutkan di atas? Mereka semua menyebutkan git merge --abort. Anda harus membuktikan jawaban Anda di kemudian hari dengan menentukan siapa yang menulis jawaban yang Anda maksud.
Michael Fulton

3

Mengapa tidak membuat cabang sekali pakai (git checkout -b), dan lakukan uji coba penggabungan di sana?


1
Apa yang Anda sarankan sebenarnya adalah jawaban yang diungkapkan Ian dengan tegas :)
tzot

0

Saya tidak tahu persis apakah itu kasus Anda , tetapi pertanyaan Anda ingat saya bahwa kadang-kadang saya memulai fitur, saya melakukan beberapa hari dan saya menggabungkan pengembangan di atasnya berkali-kali.

Pada titik ini saya kehilangan kontrol atas file yang saya ubah dan saya hanya akan mengetahuinya ketika fitur saya ditutup dan kode saya mulai berkembang.

Dalam hal ini, cara yang baik untuk mengetahui modifikasi apa yang Anda lakukan (tidak lain dari penggabungan) menggunakan Sourcetree.

Anda harus mengklik dengan tombol kanan pada cabang dasar dan memilih Diff Against Current:

Fitur Sourcetree untuk mengetahui perbedaan antara dua cabang

Kemudian sourcetree akan menunjukkan kepada Anda semua modifikasi yang akan digabungkan jika Anda menggabungkan cabang Anda menjadi cabang dasar.

Hasil

Tentu saja, itu tidak akan menunjukkan kepada Anda konflik, tetapi itu adalah alat yang berguna dalam penggabungan.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.