Saya memiliki cabang git (garis utama, misalnya) dan saya ingin menggabungkan cabang pengembangan lain. Atau saya?
Untuk memutuskan apakah saya benar-benar ingin menggabungkan cabang ini, saya ingin melihat semacam pratinjau tentang apa yang akan dilakukan penggabungan. Lebih disukai dengan kemampuan melihat daftar commit yang sedang diterapkan.
Sejauh ini, yang terbaik yang bisa saya lakukan adalah merge --no-ff --no-commit
, dan kemudian diff HEAD
.
git merge
dangit reset --keep HEAD@{1}
jika saya tidak suka hasilnya.git reset --keep HEAD@{1}
mengembalikanfatal: Cannot do a keep reset in the middle of a merge.
Bantuan?--preview
opsi di git-merge?Jawaban:
Saya telah menemukan bahwa solusi yang paling berhasil bagi saya adalah hanya melakukan penggabungan dan membatalkannya jika ada konflik . Sintaksis ini terasa bersih dan sederhana bagi saya. Ini adalah Strategi 2 di bawah ini.
Namun, jika Anda ingin memastikan Anda tidak mengacaukan cabang Anda saat ini, atau Anda hanya tidak siap untuk bergabung terlepas dari adanya konflik, cukup buat cabang pembantu baru darinya dan gabungkan bahwa:
Strategi 1: Cara aman - menggabungkan cabang sementara:
Dengan begitu Anda bisa membuang cabang sementara jika Anda hanya ingin melihat apa konfliknya. Anda tidak perlu repot-repot "membatalkan" penggabungan, dan Anda dapat kembali ke pekerjaan Anda - cukup checkout 'mybranch' lagi dan Anda tidak akan memiliki kode gabungan atau menggabungkan konflik di cabang Anda.
Ini pada dasarnya adalah dry-run.
Strategi 2: Ketika Anda benar-benar ingin bergabung, tetapi hanya jika tidak ada konflik
Jika git melaporkan konflik (dan HANYA JIKA ADA konflik), Anda dapat melakukannya:
Jika penggabungan berhasil, Anda tidak dapat membatalkannya (hanya mengatur ulang).
Jika Anda belum siap untuk bergabung, gunakan cara yang lebih aman di atas.
[EDIT: 2016-Nov - Saya bertukar strategi 1 untuk 2, karena tampaknya kebanyakan orang mencari "jalan yang aman". Strategi 2 sekarang lebih merupakan catatan bahwa Anda bisa membatalkan penggabungan jika penggabungan memiliki konflik yang tidak siap untuk Anda tangani. Perlu diingat jika membaca komentar!]
sumber
git merge --no-ff --no-commit
jika Anda tidak ingin melakukan perubahan secara langsung. Ini menghilangkan "kebutuhan" untuk cabang yang berbeda membuatnya sedikit lebih mudah untuk meninjau perubahan, imo.git merge --no-ff --no-commit
? Saya kira Anda masih bisa melakukangit merge --abort
setelah itu jika Anda tidak suka apa yang Anda lihat? Bahkan jika penggabungan tidak menghasilkan konflik?git reset --hard HEAD
dan kemudian checkout cabang yang berbedagit checkout <different branch name>
dan menghapus cabang sementaragit delete -b <name of temporary branch>
.git log ..otherbranch
git diff ...otherbranch
gitk ...otherbranch
String kosong menyiratkan
HEAD
, jadi itu sebabnya..otherbranch
alih-alihHEAD..otherbranch
.Dua vs tiga titik memiliki arti yang sedikit berbeda untuk diff daripada untuk perintah yang berisi daftar revisi (log, gitk dll.). Untuk log dan lainnya dua titik (
a..b
) berarti semua yang adab
tetapi tidaka
dan tiga titik (a...b
) berarti semua yang ada hanya dalam satua
ataub
. Tetapi diff bekerja dengan dua revisi dan di sana kasus sederhana diwakili oleh dua titik (a..b
) adalah perbedaan sederhana daria
keb
dan tiga titik (a...b
) perbedaan rata-rata antara leluhur yang sama danb
(git diff $(git merge-base a b)..b
).sumber
git checkout master
sebelum saya mencoba ini. Saya bertanya-tanya mengapa dikatakan semua perubahan saya akan dituliskan secara berlebihan ...git show ..otherbranch
akan menampilkan daftar perubahan dan perbedaan yang akan digabung ke cabang saat ini.Jika Anda seperti saya, Anda mencari yang setara dengan
svn update -n
. Berikut ini adalah triknya. Perhatikan bahwa pastikan untuk melakukan yanggit fetch
pertama sehingga repo lokal Anda memiliki pembaruan yang sesuai untuk dibandingkan.atau jika Anda ingin diff dari kepala Anda ke remote:
IMO solusi ini jauh lebih mudah dan lebih sedikit kesalahan rawan (dan karenanya jauh lebih sedikit berisiko) daripada solusi teratas yang mengusulkan "menggabungkan kemudian membatalkan".
sumber
$ git checkout target-branch
dan kemudian$ git diff --name-status ...branch-to-be-merged
(tiga titik sangat penting jadi ketik mereka seperti apa adanya)Sebagian besar jawaban di sini membutuhkan direktori kerja yang bersih dan beberapa langkah interaktif (buruk untuk skrip), atau tidak berfungsi untuk semua kasus, misalnya penggabungan sebelumnya yang telah membawa beberapa perubahan luar biasa ke cabang target Anda, atau cherry-picks yang melakukan sama.
Untuk benar-benar melihat apa yang akan berubah di
master
cabang jika Anda bergabungdevelop
dengannya, sekarang:- https://git.seveas.net/previewing-a-merge-result.html
(terima kasih kepada David Normington untuk tautannya)
PS:
Jika Anda mendapatkan gabungan konflik, mereka akan muncul dengan penanda konflik yang biasa di output, misalnya:
Pengguna @dreftymac membuat poin yang bagus: ini membuatnya tidak cocok untuk skrip, karena Anda tidak dapat dengan mudah menangkapnya dari kode status. Penanda konflik dapat sangat berbeda tergantung pada keadaan (dihapus vs dimodifikasi, dll), yang membuatnya sulit untuk dipahami juga. Waspadalah.
sumber
true
jika ada konflik danfalse
jika tidak ada konflik (misalnya, nilai boolean yang tidak memerlukan tes "bola mata" atau intervensi manusia).git merge-tree ... | grep -q '^[a-z].*in both$' && echo conflict || echo safe to merge
tetapi itu sangat bagus; Saya mungkin lupa sebuah kasus. mungkin Anda ingin memeriksa penanda konflik, bukan? misalnya ini mungkin tidak menangkap konflik gaya "mereka dihapus, kami berubah". (Saya baru saja memeriksa dan itu bahkan tidak menunjukkan penanda konflik, jadi Anda perlu regex yang cermat untuk aman di sini)less -R
untuk menangani keluaran berwarna tanpa mengubah konfigurasi Anda.Jika Anda sudah mengambil perubahan, favorit saya adalah:
Itu perlu git 1.7.x Namun saya percaya. The
@{u}
notasi adalah "singkatan" untuk cabang hulu sehingga sedikit lebih fleksibel daripadagit log ...origin/master
.Catatan: Jika Anda menggunakan zsh dan glog extended, Anda mungkin harus melakukan sesuatu seperti:
sumber
Menambahkan ke jawaban yang ada, alias dapat dibuat untuk menampilkan diff dan / atau log sebelum penggabungan. Banyak jawaban mengabaikan yang
fetch
harus dilakukan terlebih dahulu sebelum "melihat dulu" penggabungan; ini adalah alias yang menggabungkan dua langkah ini menjadi satu (meniru sesuatu yang mirip dengan mercurialhg incoming
/outgoing
)Jadi, membangun "
git log ..otherbranch
", Anda dapat menambahkan yang berikut ke~/.gitconfig
:Untuk simetri, alias berikut dapat digunakan untuk menunjukkan apa yang dilakukan dan akan didorong, sebelum mendorong:
Dan kemudian Anda dapat menjalankan "
git incoming
" untuk menunjukkan banyak perubahan, atau "git incoming -p
" untuk menampilkan tambalan (yaitu, "diff"), "git incoming --pretty=oneline
", untuk ringkasan singkat, dll. Anda kemudian dapat (opsional) menjalankan "git pull
" untuk sebenarnya bergabung. (Padahal, karena kamu sudah mengambil, penggabungan bisa dilakukan secara langsung.)Demikian juga, "
git outgoing
" menunjukkan apa yang akan didorong jika Anda menjalankan "git push
".sumber
git log currentbranch..otherbranch
akan memberi Anda daftar komit yang akan masuk ke cabang saat ini jika Anda melakukan penggabungan. Argumen biasa untuk mencatat yang memberikan rincian tentang komit akan memberi Anda lebih banyak informasi.git diff currentbranch otherbranch
akan memberi Anda perbedaan antara dua komit yang akan menjadi satu. Ini akan menjadi perbedaan yang memberi Anda segala sesuatu yang akan digabungkan.Apakah ini membantu?
sumber
git log otherbranch..currentbranch
memberikan daftar komitmen pada cabang saat ini . Thegit diff otherbranch currentbranch
memberi Anda diff dari versi to-be-merger ke ujung saat ini, yaitu sekitar sebagai tidak berguna karena dapat, karena apa yang Anda inginkan adalah diff dari dasar penggabungan ke kepala merge.Permintaan Tarik - Saya telah menggunakan sebagian besar ide yang sudah dikirimkan tetapi salah satu yang juga sering saya gunakan adalah (terutama jika berasal dari pengembang lain) melakukan Permintaan Tarik yang memberikan cara praktis untuk meninjau semua perubahan dalam penggabungan sebelum dibutuhkan tempat. Saya tahu itu adalah GitHub bukan git tetapi tentu berguna.
sumber
Singkatnya benar-benar melakukan penggabungan dengan cara membuang (lihat jawaban Kasapo), tampaknya tidak ada cara yang dapat diandalkan untuk melihat ini.
Karena itu, inilah metode yang hampir sama:
Ini memberikan indikasi yang adil tentang komitmen yang akan membuatnya menjadi penggabungan. Untuk melihat perbedaan, tambahkan
-p
. Untuk melihat nama file, menambahkan dari--raw
,--stat
,--name-only
,--name-status
.Masalah dengan
git diff TARGET_BRANCH...SOURCE_BRANCH
pendekatan (lihat jawaban Jan Hudec) adalah, Anda akan melihat perbedaan untuk perubahan yang sudah ada di cabang target Anda jika cabang sumber Anda berisi gabungan silang.sumber
Mungkin ini bisa membantu Anda? git-diff-tree - Membandingkan konten dan mode gumpalan yang ditemukan melalui dua objek pohon
sumber
Saya tidak ingin menggunakan perintah git merge sebagai prekursor untuk meninjau file yang saling bertentangan. Saya tidak ingin melakukan penggabungan, saya ingin mengidentifikasi potensi masalah sebelum bergabung - masalah yang mungkin disembunyikan auto-gabungan dari saya. Solusi yang saya cari adalah bagaimana cara meludah git daftar file yang telah diubah di kedua cabang yang akan digabung bersama di masa depan, relatif terhadap beberapa leluhur umum. Setelah saya memiliki daftar itu, saya dapat menggunakan alat perbandingan file lainnya untuk mencari tahu lebih lanjut. Saya telah mencari beberapa kali, dan saya masih belum menemukan apa yang saya inginkan dalam perintah git asli.
Ini solusi saya, kalau-kalau ini membantu orang lain di luar sana:
Dalam skenario ini saya memiliki cabang bernama QA yang memiliki banyak perubahan di dalamnya sejak rilis produksi terakhir. Rilis produksi terakhir kami ditandai dengan "15.20.1". Saya memiliki cabang pengembangan lain yang disebut new_stuff yang ingin saya gabungkan ke cabang QA. Baik QA dan new_stuff menunjuk untuk melakukan "follow" (seperti yang dilaporkan oleh gitk) pada tag 15.20.1.
Berikut adalah beberapa diskusi yang menjelaskan mengapa saya tertarik menargetkan file-file spesifik ini:
Bagaimana saya bisa mempercayai Git bergabung?
/software/199780/how-far-do-you-trust-automerge
sumber