Çok fazla çatışmaya yol açabilecek uzak bir şubede birleşiyorum. Çatışmalar olup olmayacağını nasıl anlayabilirim?
Ben böyle bir şey görmüyorum --dry-run
tarihinde adlı git-merge
.
Çok fazla çatışmaya yol açabilecek uzak bir şubede birleşiyorum. Çatışmalar olup olmayacağını nasıl anlayabilirim?
Ben böyle bir şey görmüyorum --dry-run
tarihinde adlı git-merge
.
Yanıtlar:
Daha önce de belirtildiği gibi, --no-commit
bayrağı geçirin, ancak hızlı bir taahhütten kaçınmak için, aşağıdakileri de yapın --no-ff
:
$ git merge --no-commit --no-ff $BRANCH
Aşamalı değişiklikleri incelemek için:
$ git diff --cached
Ve hızlı ileri birleştirme olsa bile birleştirmeyi geri alabilirsiniz:
$ git merge --abort
git merge --only-if-there-wont-be-any-conflicts
ya git diff --show-conflicts <commit>
da gerçekten kullanışlı olurdu. Yazık ki henüz mümkün değil, yoksa bir şey mi kaçırıyorum?
git pull --ff-only
!
Sadece otomatik olarak bir depo ile onun uzaktan kumandası arasındaki çakışmaları bulan bir yöntem uygulamak zorunda kaldım. Bu çözüm bellekteki birleştirmeyi yapar, böylece dizine veya çalışma ağacına dokunmaz. Bu sorunu çözmenin mümkün olan en güvenli yolu olduğunu düşünüyorum. Şöyle çalışır:
git fetch origin master
git merge-base FETCH_HEAD master
git merge-tree mergebase master FETCH_HEAD
( mergebase , birleştirme adımında önceki adımda yazdırılan onaltılık )Şimdi uzak ustayı yerel ustanızla birleştirmek istediğinizi varsayalım, ancak herhangi bir dalı kullanabilirsiniz. git merge-tree
bellekte birleştirmeyi gerçekleştirir ve sonucu standart çıktıya yazdırır. Desen için Grep <<
veya >>
. Veya çıktıyı bir dosyaya yazdırabilir ve kontrol edebilirsiniz. 'Her ikisinde de değişti' ile başlayan bir çizgi bulursanız, büyük olasılıkla bir çatışma olacaktır.
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"
Tek kelimeyle harika! +100
+<<<<<<< .our
yüzden şöyle bir grep ifadesi kullanıyorumgrep -q '^+<* \.our$'
Bu basit kaba kuvvet çözümüm:
Bir "master öncesi" dal oluşturun (tabii ki master'dan)
İstediğiniz her şeyi bu master öncesi ile birleştirin.
Ardından, master'a dokunmadan birleştirmenin nasıl olduğunu görebilirsiniz.
Her neyse, @ orange80'in tavsiyelerini takip ederim.
git merge --abort
çatışması yoksa, git reset --hard HEAD~1
veya birleştirme olsaydı git reset --hard origin/master
. Başka bir şube oluşturmak size bir güvenlik hissi verir, ancak git'in nasıl çalıştığını öğrenirseniz, bunun yanlış yerleştirilmiş korku olduğunu anlayacaksınız. Endişe, çalışan kopyayı değiştirmemekle ilgili olduğunda, bu hiçbir çözüm sunmaz.
git merge --no-commit
hızlı bir şekilde iletilebiliyorsa birleştirme işlemini iptal etmez. git merge --abort
birleştirilirse çalışmaz. Bunu bir komut dosyası olarak yazmak istiyorsanız, gariptir, çünkü git merge
farklı çakışma türlerini açıklamak için yeterince iyi hata kodlarıyla yanıt vermez. Yeni bir dalla çalışmak, bozuk bir komut dosyasının repo'nuzu el ile müdahale gerektiren bir durumda bırakmasını önler. Tabii ki hiçbir şey kaybedemezsiniz. Ancak başka türlü inşa etmek daha kolaydır.
Git ile birleştirmeyi geri almak o kadar kolaydır ki kuru çalışma konusunda endişelenmemelisiniz:
$ git pull $REMOTE $BRANCH
# uh oh, that wasn't right
$ git reset --hard ORIG_HEAD
# all is right with the world
DÜZENLEME: Aşağıdaki yorumlarda belirtildiği gibi, çalışma dizininizde veya hazırlama alanınızda değişiklik varsa, muhtemelen yukarıdakileri yapmadan önce bunları saklamak isteyeceksiniz (aksi takdirde git reset
yukarıdakileri takiben kaybolacaktır )
git branch --contains HEAD
veya daha da doğrudan bir konudur , sadece kullanıngit merge --ff-only
--dry-run
"bir birleştirme işleminin hızlı ilerlemesini isteyip istemediğini kontrol etmez". Bir birleştirme olacağını kesin çıktı dönecekti: dosyalar, çatışmalar vb. Ff olacak mı gerçekten ilginç değil, değil mi?
git stash; git reset --hard
? @BrianPhillips
Bunu yapmak için bir takma ad yaptım ve bir cazibe gibi çalışır, bunu yaparım:
git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '
Şimdi sadece ararım
git mergetest <branchname>
Çatışma olup olmadığını öğrenmek için.
Geçerli dalınızı uzak dala göre ayırın, bu bir çekme / birleştirme yaptığınızda neyin değişeceğini size söyleyecektir.
#see diff between current master and remote branch
git diff master origin/master
Bunu yapmak için request-pull git komutunu kullanıyorum. Yerel veya uzak depolarınızda hiçbir şey yapmadan birleştirme sırasında gerçekleşecek her değişikliği görmenizi sağlar .
Örneğin, "özellik-x" adlı bir dalı ana dalınızla birleştirmek istediğinizi düşünün
git request-pull master origin feature-x
size ne olacağının bir özetini gösterecektir (hiçbir şey yapmadan):
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
-p
Parametreyi eklerseniz, tam yama metnini de alırsınız, tıpkı değiştirilen her dosyaya git farkını yaptığınız gibi.
master
ve ne ekleyerek origin
bunu biraz daha açık hale getirebilirsiniz ve örneğin bir yerelde olduğum branch1
ve request-pull
yerel bir özellik dalında bir yapmak istiyorsam ne olacak branch2
? Hala ihtiyacım var origin
mı? Tabii ki, her zaman belgeleri okuyabilirsiniz.
Henüz kimsenin yama kullanmasını önermediğine şaşırdım.
Eğer bir birleştirme test etmek isterim Say your_branch
içine master
(Ben varsayarak yaşıyorum master
teslim):
$ git diff master your_branch > your_branch.patch
$ git apply --check your_branch.patch
$ rm your_branch.patch
Hile yapmalı.
Gibi hatalar alırsanız
error: patch failed: test.txt:1
error: test.txt: patch does not apply
bu, yamanın başarılı olmadığı ve birleşmenin çatışmalara yol açacağı anlamına gelir. Çıktı yok, yamanın temiz olduğu ve dalı kolayca birleştirebileceğiniz anlamına gelir
Not Bu edeceğini değil aslında (tabii yama dosyası oluşturma kenara ama güvenle sonradan o silebilirsiniz) sizin çalışma ağacı değiştirin. Git-Apply belgelerinden:
--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".
Git ile benden daha akıllı / daha deneyimli olan herkese dikkat edin: Lütfen burada yanlış olup olmadığımı bana bildirin ve bu yöntem normal bir birleşmeden farklı davranışlar gösteriyor. 8 yıldan fazla bir süredir bu sorunun kimsenin bulunmadığı garip görünen bu çözümü önermeyecektir.
git diff master your_branch | git apply --check
.
Bu ilginç olabilir: Belgelerden:
Karmaşık çakışmalarla sonuçlanan ve yeniden başlamak istiyorsanız, git merge --abort ile kurtarabilirsiniz .
Ama bunu naif (ama yavaş) bir şekilde de yapabilirsiniz:
rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)
(Not: Taahhüt edilmeyen değişikliklerin çakışmayacağından emin olmak için / tmp'ye klonlama işe yaramaz, bir kopyasına ihtiyacınız olacaktır).
cp -r repository/.git /tmp/repository/.git
, cd /tmp/repository
, git reset --hard
, git add --all
, git reset --hard
(iyi ölçmek için), git status
(temiz olduğunu kontrol etmek için).
Bunun eski bir soru olduğunun farkındayım, ancak bir Google aramasında ilk ortaya çıkan soru.
Git birleştirilirken yalnızca --ff seçeneği kullandı.
Gönderen: http://git-scm.com/docs/git-merge
--ff okunur
Geçerli HEAD zaten güncel değilse veya birleştirme bir hızlı ileri sarma olarak çözülmedikçe birleştirme ve sıfır dışında bir durumla çıkmayı reddetme.
Bunu yapmak birleştirmeyi ve hızlı ileri sarmayı dener ve eğer yapamazsa hızlı ileri alma işleminin gerçekleştirilemeyeceğini, ancak çalışma dalınızı dokunmadan bırakmanızı ister. Hızlı ileri alabilirse, çalışma dalınızda birleştirme gerçekleştirir. Bu seçenek ayrıca mevcuttur git pull
. Böylece, aşağıdakileri yapabilirsiniz:
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
Ana daldan bir özellik dalında nelerin değiştiğini görmek için git günlüğünü kullanıyorum
git log does_this_branch..contain_this_branch_changes
ör. - master ile birleştirilen / birleştirilmeyen bir özellik dalında hangi taahhütlerin olduğunu görmek için:
git log master..feature_branch
B'den A'ya hızlı ileri sarmak istiyorsanız, git log B'nin size hiçbir şey göstermediğinden emin olmalısınız, yani A'nın B'de olmayan bir şeyi yoktur. Ancak B..A'da bir şey olsa bile, yine de çatışmalar olmadan birleşebilirsiniz, bu nedenle yukarıdakiler iki şeyi gösterir: bir hızlı ileri olacak ve böylece bir çatışma yaşamayacaksınız.
Benim çözümüm geriye doğru birleşmek.
Şubenizi uzak "hedef" şubeye birleştirmek yerine, şubeyi kendinize birleştirin.
git checkout my-branch
git merge origin/target-branch
Herhangi bir çatışma olup olmadığını göreceksiniz ve bunları nasıl çözeceğinizi planlayabilirsiniz.
Bundan sonra birleştirme git üzerinden iptal edilebilir merge --abort
veya (herhangi bir çakışma ve birleşme olmadıysa) üzerinden önceki taahhüdüne geri dönebilirsiniz.git reset --hard HEAD~1