Saya bergabung di cabang terpencil yang mungkin memiliki banyak konflik. Bagaimana saya bisa tahu apakah akan ada konflik atau tidak?
Saya tidak melihat sesuatu seperti --dry-run
on git-merge
.
Saya bergabung di cabang terpencil yang mungkin memiliki banyak konflik. Bagaimana saya bisa tahu apakah akan ada konflik atau tidak?
Saya tidak melihat sesuatu seperti --dry-run
on git-merge
.
Jawaban:
Seperti disebutkan sebelumnya, berikan --no-commit
flag, tetapi untuk menghindari fast-forward commit, ikut juga --no-ff
, seperti:
$ git merge --no-commit --no-ff $BRANCH
Untuk memeriksa perubahan bertahap:
$ git diff --cached
Dan Anda bisa membatalkan penggabungan, bahkan jika itu adalah penggabungan maju-cepat:
$ git merge --abort
git merge --only-if-there-wont-be-any-conflicts
atau git diff --show-conflicts <commit>
akan sangat berguna. Malu itu belum mungkin, atau apakah saya kehilangan sesuatu?
git pull --ff-only
!
Saya hanya perlu mengimplementasikan metode yang secara otomatis menemukan konflik antara repositori dan remote-nya. Solusi ini melakukan penggabungan dalam memori sehingga tidak akan menyentuh indeks, atau pohon yang berfungsi. Saya pikir ini adalah cara teraman yang mungkin Anda bisa menyelesaikan masalah ini. Begini cara kerjanya:
git fetch origin master
git merge-base FETCH_HEAD master
git merge-tree mergebase master FETCH_HEAD
( mergebase adalah id heksadesimal yang digabungkan-basis dicetak pada langkah sebelumnya)Sekarang anggaplah Anda ingin menggabungkan master jarak jauh dengan master lokal Anda, tetapi Anda bisa menggunakan cabang apa pun. git merge-tree
akan menjalankan gabungan dalam memori dan mencetak hasilnya ke output standar. Grep untuk polanya <<
atau >>
. Atau Anda dapat mencetak output ke file dan memeriksanya. Jika Anda menemukan garis yang dimulai dengan 'diubah di keduanya' maka kemungkinan besar akan ada konflik.
git merge-tree `git merge-base FETCH_HEAD master` FETCH_HEAD master
git merge-tree `git merge-base clieop master` clieop master | grep -A3 "changed in both"
biasa! +100
+<<<<<<< .our
jadi saya menggunakan ekspresi grep sepertigrep -q '^+<* \.our$'
Solusi brute force sederhana saya untuk ini adalah:
Buat cabang "pra-master" (dari master tentu saja)
Gabungkan semua hal yang Anda inginkan ke dalam pre-master ini.
Kemudian Anda bisa melihat bagaimana penggabungan terjadi tanpa menyentuh master.
Bagaimanapun, saya akan mengikuti saran @ orange80.
git merge --abort
jika ada konflik, git reset --hard HEAD~1
apakah ada gabungan atau git reset --hard origin/master
. Menciptakan cabang lain memberi Anda perasaan aman, tetapi jika Anda mempelajari cara kerja git, Anda akan mengerti bahwa itu adalah ketakutan yang salah tempat. Ketika kekhawatiran tentang tidak mengubah copy pekerjaan, ini tidak menawarkan solusi.
git merge --no-commit
tidak akan membatalkan penggabungan jika itu dapat diteruskan dengan cepat. git merge --abort
tidak berfungsi jika digabung. Jika Anda ingin menulis ini sebagai skrip, ini aneh, karena git merge
tidak membalas dengan kode kesalahan yang cukup baik untuk menjelaskan berbagai jenis konflik. Bekerja dengan cabang baru mencegah skrip rusak meninggalkan repo Anda dalam keadaan yang memerlukan intervensi manual. Tentu Anda tidak bisa kehilangan apapun. Tetapi lebih mudah untuk membangun sebaliknya.
Mengurungkan penggabungan dengan git sangat mudah sehingga Anda tidak perlu khawatir tentang dry run:
$ git pull $REMOTE $BRANCH
# uh oh, that wasn't right
$ git reset --hard ORIG_HEAD
# all is right with the world
SUNTING: Seperti disebutkan dalam komentar di bawah ini, jika Anda memiliki perubahan dalam direktori kerja Anda atau area pementasan Anda mungkin ingin menyimpannya sebelum melakukan hal di atas (jika tidak mereka akan menghilang mengikuti yang di git reset
atas)
git branch --contains HEAD
atau bahkan lebih langsung, cukup gunakangit merge --ff-only
--dry-run
tidak akan "cukup memeriksa apakah penggabungan akan maju cepat". Itu akan mengembalikan output yang tepat bahwa penggabungan akan: file, konflik dll. Apakah akan ff tidak benar-benar menarik, bukan?
git stash; git reset --hard
? @BrianPhillips
Saya membuat alias untuk melakukan ini dan bekerja seperti pesona, saya melakukan ini:
git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '
Sekarang saya hanya menelepon
git mergetest <branchname>
Untuk mengetahui apakah ada konflik.
Hanya beda cabang Anda saat ini dengan cabang jarak jauh, ini akan memberi tahu Anda apa yang akan berubah ketika Anda melakukan tarikan / penggabungan.
#see diff between current master and remote branch
git diff master origin/master
Saya menggunakan perintah request-pull git untuk melakukannya. Ini memungkinkan Anda untuk melihat setiap perubahan yang akan terjadi saat penggabungan, tetapi tanpa melakukan apa pun di repositori lokal atau jauh Anda .
Misalnya, bayangkan Anda ingin menggabungkan cabang bernama "fitur-x" ke cabang master Anda
git request-pull master origin feature-x
akan menunjukkan kepada Anda ringkasan tentang apa yang akan terjadi (tanpa melakukan apa pun):
The following changes since commit fc01dde318:
Layout updates (2015-06-25 11:00:47 +0200)
are available in the git repository at:
http://fakeurl.com/myrepo.git/ feature-x
for you to fetch changes up to 841d3b41ad:
----------------------------------------------------------------
john (2):
Adding some layout
Refactoring
ioserver.js | 8 +++---
package.json | 7 +++++-
server.js | 4 +--
layout/ldkdsd.js | 277 +++++++++++++++++++++++++++++++++++++
4 files changed, 289 insertions(+), 7 deletions(-)
create mode 100644 layout/ldkdsd.js
Jika Anda menambahkan -p
parameter, Anda juga akan mendapatkan teks tambalan lengkap, persis seperti jika Anda melakukan git diff pada setiap file yang diubah.
master
dan origin
lakukan di opsi baris perintah, dan bagaimana jika saya misalnya pada lokal branch1
dan ingin melakukan request-pull
pada cabang fitur lokal branch2
? Apakah saya masih membutuhkan origin
? Tentu saja, orang selalu dapat membaca dokumentasi.
Saya terkejut belum ada yang menyarankan untuk menggunakan tambalan.
Katakanlah Anda ingin menguji gabungan dari your_branch
ke master
(aku asumsi Anda telah master
memeriksa):
$ git diff master your_branch > your_branch.patch
$ git apply --check your_branch.patch
$ rm your_branch.patch
Itu harus melakukan trik.
Jika Anda mendapatkan kesalahan seperti
error: patch failed: test.txt:1
error: test.txt: patch does not apply
itu berarti bahwa tambalan tidak berhasil dan penggabungan akan menghasilkan konflik. Tidak ada output berarti patch bersih dan Anda dapat dengan mudah menggabungkan cabang
Perhatikan bahwa ini tidak akan benar - benar mengubah pohon kerja Anda (selain membuat file tambalan tentu saja, tetapi Anda dapat dengan aman menghapusnya setelah itu). Dari dokumentasi git-apply:
--check
Instead of applying the patch, see if the patch is applicable to the
current working tree and/or the index file and detects errors. Turns
off "apply".
Catatan untuk siapa saja yang lebih pintar / lebih berpengalaman dengan git daripada saya: tolong beri tahu saya jika saya salah di sini dan metode ini memang menunjukkan perilaku yang berbeda dari gabungan biasa. Tampaknya aneh bahwa dalam 8+ tahun bahwa pertanyaan ini telah ada, tidak seorang pun akan menyarankan solusi yang tampaknya jelas ini.
git diff master your_branch | git apply --check
.
Ini mungkin menarik: Dari dokumentasi:
Jika Anda mencoba gabungan yang mengakibatkan konflik kompleks dan ingin memulai kembali, Anda dapat memulihkan dengan git merge --abort .
Tapi Anda juga bisa melakukannya dengan cara naif (tapi lambat):
rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)
(Catatan: Ini tidak akan berfungsi hanya mengkloning ke / tmp, Anda akan memerlukan salinan, untuk memastikan bahwa perubahan yang tidak dikomit tidak akan bertentangan).
cp -r repository/.git /tmp/repository/.git
, cd /tmp/repository
, git reset --hard
, git add --all
, git reset --hard
(untuk mengukur baik), git status
(untuk memeriksa bahwa itu bersih).
Saya sadar bahwa ini adalah pertanyaan lama, tetapi ini adalah pertanyaan pertama yang muncul di pencarian Google.
Git memperkenalkan opsi --ff-only saat penggabungan.
Dari: http://git-scm.com/docs/git-merge
--ff-saja
Menolak untuk menggabungkan dan keluar dengan status bukan nol kecuali KEPALA saat ini sudah mutakhir atau penggabungan dapat diselesaikan sebagai fast-forward.
Melakukan hal ini akan mencoba untuk menggabungkan dan memajukan, dan jika tidak dapat membatalkan dan meminta Anda bahwa memajukan tidak dapat dilakukan, tetapi membiarkan cabang kerja Anda tidak tersentuh. Jika itu bisa maju cepat, maka itu akan melakukan penggabungan pada cabang kerja Anda. Opsi ini juga tersedia di git pull
. Dengan demikian, Anda dapat melakukan hal berikut:
git pull --ff-only origin branchA #See if you can pull down and merge branchA
git merge --ff-only branchA branchB #See if you can merge branchA into branchB
Saya menggunakan git log untuk melihat apa yang telah berubah pada cabang fitur dari cabang utama
git log does_this_branch..contain_this_branch_changes
mis - untuk melihat komit apa yang ada dalam cabang fitur yang telah / belum digabungkan untuk dikuasai:
git log master..feature_branch
Jika Anda ingin memajukan dari B ke A, maka Anda harus memastikan bahwa git log B..A tidak menunjukkan apa-apa kepada Anda, yaitu A tidak memiliki apa pun yang tidak dimiliki B. Tetapi bahkan jika B..A memiliki sesuatu, Anda mungkin masih dapat bergabung tanpa konflik, jadi hal di atas menunjukkan dua hal: bahwa akan ada fast-forward, dan dengan demikian Anda tidak akan mendapatkan konflik.
Solusi saya adalah menggabungkan kembali.
Daripada menggabungkan cabang Anda ke cabang "target" yang jauh, gabungkan cabang itu ke cabang Anda.
git checkout my-branch
git merge origin/target-branch
Anda akan melihat apakah ada konflik dan dapat merencanakan bagaimana menyelesaikannya.
Setelah itu Anda dapat membatalkan penggabungan melalui git merge --abort
, atau (jika tidak ada konflik dan penggabungan telah terjadi) kembalikan ke komit sebelumnya melaluigit reset --hard HEAD~1