“Git merge -s ours” ın “onların” versiyonu var mı?


876

Konu dalını "B" kullanarak "A" ile birleştirirken git merge, bazı çakışmalar alıyorum. Tüm çatışmaların "B" sürümü kullanılarak çözülebileceğini biliyorum.

Farkındayım git merge -s ours. Ama istediğim şey git merge -s theirs.

Neden yok? Mevcut gitkomutlarla çakışan birleştirmeden sonra aynı sonucu nasıl elde edebilirim ? ( git checkoutB'den birleştirilmemiş her dosya)

GÜNCELLEME: A dalından herhangi bir şeyi (ağacın birleştirme kesinleştirme noktası olan B sürümüne) atmanın "çözümü" aradığım şey değil.


1
Ayrıca bu cevaba bakınız: stackoverflow.com/questions/928646/… - A yerine B sürümünü kullanma örneğini değiştirmek önemsiz
Robie Basak

8
SO cevap bakınız başka benzeri bir dal yapmak için git komutu için tüm mevcut olası yolları taklitgit merge -s their .
VonC

4
Bu yüzden gerçekten git merge -s theirs(kolayca elde edilebilen git merge -s oursve geçici bir dalla) aramıyorsunuz , çünkü bizimki birleştirme dalındaki değişiklikleri tamamen görmezden geliyor ...
Nicolò Martini

21
@Torek - Git DEVS yok gerçekten bulmak o saldırgan sağlamak için theirsek olarak ours??? Bu, Git'teki üst düzey mühendislik ve tasarım sorunlarından birinin bir belirtisidir: tutarsızlık.
jww

3
@jww Buradaki sorun "git merge -s bizimki" nin saldırgan olması değil, bunun karşı-sezgisel olmasıyla ilgili. OP sorusuna göre, böyle bir özellik eklenirse, gerçekte yapmak istediği bir "git merge -s özyinelemeli -X onların" olduğunda yanlışlıkla kullanacağını görebilirsiniz. Diğer daldaki sürümle çakışmaları geçersiz kılan başka bir dalı birleştirmek yaygındır, ancak geçerli dalın değişikliklerini tamamen atarak başka bir dal ile tamamen geçerli olanın üzerine yazmak gerçekten bir istisnadır.
ThomazMoura

Yanıtlar:


1019

-XSeçeneğini ekleyin theirs. Örneğin:

git checkout branchA
git merge -X theirs branchB

Her şey istenilen şekilde birleşecek.

Sorunlara neden olduğunu gördüğüm tek şey, dosyaların branchB'den silinmiş olmasıdır. Git git dışında bir şey kaldırılırsa çakışma olarak ortaya çıkarlar.

Düzeltme kolaydır. git rmSilinen dosyaların adlarıyla çalıştırın :

git rm {DELETED-FILE-NAME}

Bundan sonra, -X theirsbeklendiği gibi çalışmalıdır.

Tabii ki, git rmkomutla fiili kaldırma işlemi ilk etapta çatışmanın olmasını engelleyecektir.


Not : Daha uzun bir form seçeneği de vardır.

Kullanmak için değiştirin:

-X theirs

ile:

--strategy-option=theirs

6
Orijinal soruya daha iyi bir çözüm (Paul Pladijs) için diğer cevaba bakınız.
Malcolm

204
Bunun "birleştirme stratejisi theirs" ile aynı olmadığını belirtmek gerekir . -Xtheirs, yinelemeli stratejiye uygulanan strateji seçeneğidir . Bu, özyinelemeli stratejinin yine de yapabileceği her şeyi birleştireceği ve yalnızca çatışma durumunda "onların" mantığına geri döneceği anlamına gelir. Yukarıdaki gibi çoğu durumda bu ihtiyaç duyulan şey olsa da, bu "her şeyi B dalından olduğu gibi al" ile aynı değildir. Bunun yerine gerçek birleşmeyi yapar.
Timur

2
Diğer komutlarla da çalışır. Sadece bir 'git cherry-pick sha1 -X onlarınki' yaptım. Teşekkürler!
Max Hohenegger

48
Bu korkunç bir cevap, çünkü doğru görünüyor, ama aslında yanlış. "git birleştirme -X onların" değil yapacağını "git birleştirme onların -s" yap. Geçerli dalı, birleştirilmiş dalın içeriği ile değiştirmez. "Onların" değişikliklerini tercih eder, ancak sadece çatışma durumunda. Bu nedenle, sonuçta ortaya çıkan taahhüt, "onların" şubesinden oldukça farklı olabilir. Soru posterinin aklında olan şey bu değildi.
Ivan Krivyakov

7
@ user3338098: evet, haklısın. Soruyu tekrar okudum ve bu da o kadar iyi değil. Ne yazık ki, karışıklığın temel nedeni soru değil, cevap değildir. Birleştirme stratejisine ve birleştirme stratejisi 'özyinelemeli' seçeneğine aynı adı 'bizim' vermek için git yazarların tasarım tercihidir. Bu durumda karışıklık pratikte kaçınılmazdır.
Ivan Krivyakov

218

B dalını kullanıma alınmış dal A'ya birleştirmek için olası ve test edilmiş bir çözüm:

# in case branchA is not our current branch
git checkout branchA

# make merge commit but without conflicts!!
# the contents of 'ours' will be discarded later
git merge -s ours branchB    

# make temporary branch to merged commit
git branch branchTEMP         

# get contents of working tree and index to the one of branchB
git reset --hard branchB

# reset to our merged commit but 
# keep contents of working tree and index
git reset --soft branchTEMP

# change the contents of the merged commit
# with the contents of branchB
git commit --amend

# get rid off our temporary branch
git branch -D branchTEMP

# verify that the merge commit contains only contents of branchB
git diff HEAD branchB

Otomatikleştirmek için, argüman olarak branchA ve branchB'yi kullanarak bir komut dosyasına sarabilirsiniz.

Bu çözüm, beklediğiniz gibi birleştirme taahhüdünün birinci ve ikinci ebeveyni korur git merge -s theirs branchB.


S: Neden branchTEMP'e ihtiyacınız var? Sadece yapamaz mıydın git reset --soft branchA?
cdunn2001

4
@ cdunn2001: Bir şekilde aynı şeyi düşündüm, ama hayır. git reset --hardHangi branchAnoktaya işaret eden değişiklikler olduğunu unutmayın .
Tsuyoshi Ito

5
aptalca bir soru sorduğum için üzgünüm ama bu yöntem neden -xtheirs'den daha iyi? avantajları / dezavantajları
nelerdir

9
@ chrispepper1989 -x onların çatışmaları etkiler , eğer bir parçamız temiz bir şekilde uygulanabiliyorsa, sonuçta ortaya çıkan birleşmeye geçecektir. Bu durumda, son komutun gösterdiği gibi, çatışma olup olmadığına bakılmaksızın branchB ile tamamen aynı olan bir birleşme elde ediyoruz .
UncleZeiv

2
@UncleZeiv açıklama için teşekkür ederim, bu yüzden temelde bir "onların" yapmak çakışan değişiklikleri ve çekilen kodla özdeş olmayan int kodu sonuç dosya tutar.
chrispepper1989

89

Git'in eski sürümleri "onların" birleştirme stratejisini kullanmanıza izin verdi:

git pull --strategy=theirs remote_branch

Ancak bu, Junio ​​Hamano (Git sürdürücüsü) tarafından bu mesajda açıklandığı gibi kaldırıldı . Bağlantıda belirtildiği gibi, bunun yerine şunları yaparsınız:

git fetch origin
git reset --hard origin

Bununla birlikte, bunun gerçek bir birleştirmeden farklı olduğuna dikkat edin. Çözümünüz muhtemelen gerçekten aradığınız seçenektir.


7
Junio ​​Hamano'nun açıklamasını gerçekten anlamıyorum. git reset --hard originOnların tarzı birleştirme için bir çözüm nasıl ? BranchB'yi BranchA ile birleştirmek isteseydim (Alan W. Smith'in cevabı gibi), resetyöntemi kullanarak nasıl yaparım ?
James McMahon

3
James McMahon: Junio ​​C Hamano'nun amacı git reset --hard“onların” tarzı bir birleşim değil. Tabii ki, git reset --hardherhangi bir birleştirme taahhüdü veya bu konuda herhangi bir taahhüt oluşturmaz. Onun amacı, HEAD'deki her şeyi başka bir şeyle değiştirmek için birleştirme kullanmamamız gerektiğidir . Yine de aynı fikirdeyim.
Tsuyoshi Ito

11
theirsGerekçe eksik olduğu için kaldırılması bir utanç . Kodun iyi olduğu durumlara izin veremedi, sadece yukarı akış farklı bir felsefi temelde tutuldu, bu nedenle bu anlamda 'kötü', bu yüzden her ikisi de yukarı akışla güncel kalmak istiyor, ancak aynı zamanda iyi kod 'düzeltmeleri' olanları korur [git & msysgit, farklı hedef platformlarının felsefeleri nedeniyle bu “çatışma” nın bir kısmına sahiptir]
Philip Oakley

1
Ayrıca şu anda takıldığım, başka biriyle bir şubeyi paylaştığım ve aynı zamanda değişiklikleri (farklı dosyalarda) ittiğimiz kullanım durumunu da kaçırıyor. Bu yüzden yerel olarak sahip olduğum tüm eski sürümleri gizlemek ve onun yerine yeni sürümlerini kullanmak istiyorum. Güncellediğim dosyalar için de aynısını yapmak istiyor. 'Sıfırlanacak' bir şey yok. Ve her dosyayı tek tek kullanıma alma çözümü ~ 20 dosya olduğunda pratik değildir.
szeitlin

2
Felsefeyi gerçekten anlamıyorum. Ben sadece theirsiki ayrı dalda bazı dosyaları yanlışlıkla değiştirmişti ve her dosya için elle yapmak zorunda kalmadan bir değişiklik atmak istedim çünkü kullandım .
sudo

65

İstediğiniz sonucun ne olduğu tamamen açık değildir, bu nedenle cevaplarda ve yorumlarında "doğru" yolla ilgili bazı karışıklıklar vardır. Genel bir bakış sağlamaya çalışıyorum ve aşağıdaki üç seçeneği görüyorum:

Birleştirmeyi deneyin ve B'yi çatışmalar için kullanın

Bu değil "için onların sürümü git merge -s ours" ama "onların sürümü git merge -X ours(kısaltılmışı" git merge -s recursive -X ours):

git checkout branchA
# also uses -s recursive implicitly
git merge -X theirs branchB

Bu örneğin budur Alan W. Smith'in cevabı yok.

Yalnızca B'deki içeriği kullan

Bu, her iki dal için bir birleştirme taahhüdü oluşturur ancak tüm değişiklikleri atar branchAve yalnızca içeriği tutar branchB.

# Get the content you want to keep.
# If you want to keep branchB at the current commit, you can add --detached,
# else it will be advanced to the merge commit in the next step.
git checkout branchB

# Do the merge an keep current (our) content from branchB we just checked out.
git merge -s ours branchA

# Set branchA to current commit and check it out.
git checkout -B branchA

Birleştirme işleminin ilk üst öğeyi şimdi gerçekleştirdiğini branchBve yalnızca ikincisinin ait olduğunu unutmayın branchA. Örneğin Gandalf458'in cevabı budur .

Yalnızca B'deki içeriği kullanın ve doğru ebeveyn siparişini koruyun

Bu gerçek "onların sürümü git merge -s ours". Önceki seçenekte olduğu gibi aynı içeriğe sahiptir (yani yalnızca bu branchBöğeden), ancak ebeveynlerin sırası doğrudur, yani ilk ebeveyn gelir branchAve ikinci ebeveyn gelir branchB.

git checkout branchA

# Do a merge commit. The content of this commit does not matter,
# so use a strategy that never fails.
# Note: This advances branchA.
git merge -s ours branchB

# Change working tree and index to desired content.
# --detach ensures branchB will not move when doing the reset in the next step.
git checkout --detach branchB

# Move HEAD to branchA without changing contents of working tree and index.
git reset --soft branchA

# 'attach' HEAD to branchA.
# This ensures branchA will move when doing 'commit --amend'.
git checkout branchA

# Change content of merge commit to current index (i.e. content of branchB).
git commit --amend -C HEAD

Bu nedir Paul Pladijs cevabı (geçici şube gerektirmeden) yapar.


Seçenek 3'ün daha temiz bir versiyonu:git checkout branchA; git merge -s ours --no-commit branchB; git read-tree -um @ branchB; git commit
jthill

@jthill: Sürümünüz daha özlü olsa da read-tree, ortalama git kullanıcısının kullanamayacağı düşük seviye ("sıhhi tesisat") komutunu da kullanır (en azından ben değilim ;-)). Yanıttaki çözümler yalnızca git kullanıcılarının bilmesi gereken üst düzey ("porselen") komutları kullanır. Onları tercih ederim ama yine de versiyonunuz için teşekkür ederim!
siegi

İkinci - son adımı açıklayabilir misiniz (ödeme şubesiA)? Orada olmamalı gibi görünüyor.
Patrick

@Patrick, bu adım gerekli. Bunu atlarsanız, aynı taahhüdü alırsınız, ancak bu taahhüdü gösteren bir şubeniz olmaz. Böylece, başka bir işleme / şubeye geçtiğiniz anda, son komutla ( …commit --amend…) yaptığınız işlem "kaybolacaktır". Bunları yapmak için vaktim olur olmaz bu cevaba grafiksel açıklamalar eklemeyi planlıyorum… ;-)
siegi

62

O zamandan beri Paul Pladijs'ın cevabını kullandım. Ben öğrendim, "normal" birleştirme yapabilirsiniz, çatışmalar oluşur, böylece

git checkout --theirs <file>

diğer şubedeki revizyonu kullanarak çatışmayı çözmek. Her dosya için bunu yaparsanız, beklediğiniz gibi davranırsınız

git merge <branch> -s theirs

Her neyse, çaba birleştirme stratejisiyle olduğundan daha fazla! (Bu, git 1.8.0 sürümü ile test edilmiştir)


1
dosya listesi alınabilseydi harika olurdu. Örneğin, git ls-files --modified | xargs git addher iki tarafta birleştirmek için bunu yapmak istedim birleştirme: /
andho

Aslında git her iki taraftaki dosyalara eklenenleri döndürür, git ls-files --modifiedbu yüzden bu da geçerli bir çözümdür.
andho

1
Bunu da eklediğiniz için teşekkürler. Daha sıklıkla dosya bazında gerekli değildir. Ayrıca git durumu en altta "Birleştirilmemiş Yollar" ı gösterir. Çözümlenmemiş yolların listesini almak için şu diğer adı kullanıyorum:git config --global alias.unresolved '!git status --short|egrep "^([DAU])\1"'
Melvyn

anlamı -Xnedir -Xve arasındaki fark -snedir? herhangi bir belge bulamıyor.
Lei Yang

21

Kullanarak sorunumu çözdüm

git checkout -m old
git checkout -b new B
git merge -s ours old

"eski" daldan "B" dal
elmarco

13

"B" konu dalını git birleştirme kullanarak birleştirirken, bazı çakışmalar alıyorum. Ben tüm çatışmaların "B" sürümü kullanılarak çözülebileceğini biliyorum.

Git birleştirme - bizimkinin farkındayım. Ama istediğim git birleştirme gibi bir şey.

Master'dan bir şube oluşturduğunuzu ve şimdi master'daki eski şeyleri geçersiz kılarak master'a geri dönmek istediğinizi varsayıyorum. Bu yazıyla karşılaştığımda tam olarak bunu yapmak istedim.

Tam olarak ne yapmak istediğinizi yapın, önce bir dalı diğerine birleştirmek dışında. Sadece yaptım ve harika çalıştı.

git checkout Branch
git merge master -s ours

Ardından, master'a göz atın ve şubenizi birleştirin (şimdi sorunsuz bir şekilde gidecek):

git checkout master
git merge Branch

1
Teşekkürler. Bu kabul edilen cevap, en basit ve en doğru cevap olmalıdır. Şubeniz geride kalıyorsa / ustayla çatışıyorsa, o zaman şube, ustalaşmak için her şeyi birleştirmeden önce her şeyin çalışmasını sağlamaktır.
StackHola

Bu harika çalıştı, teşekkürler.
Kodie Grantham

12

A dalındaysanız şunları yapın:

git merge -s recursive -X theirs B

Git 1.7.8 sürümünde test edildi


8

Yalnızca birleştirdiğiniz daldan girdi alan bir birleştirmeyi gerçekten düzgün yapmak için şunları yapabilirsiniz:

git merge --strategy=ours ref-to-be-merged

git diff --binary ref-to-be-merged | git apply --reverse --index

git commit --amend

Bildiğim hiçbir senaryoda çatışma olmayacak, ek dallar yapmak zorunda değilsiniz ve bu normal bir birleştirme taahhüdü gibi davranıyor.

Ancak bu, alt modüller ile hoş değil.


-R burada ne yapıyor?
P. Myer Nore

Bu şekilde "taşınmış ve değiştirilmiş" dosyaların geçmişini kaybedersiniz. Haklı mıyım?
elysch

1
-R, tersine, cevabı daha kendi kendini belgelemek için güncelledim.
Elijah Lynn

Birleştirmeye çalıştığınız dosyalar gelen dalda silinirse bu işe yaramaz.
solvingJ

7

Neden yok?

Ben nasıl benzetmek için " bir dalı başka bir dal yapmak için git komut " söz ederken git merge -s theirs, Git 2.15 (Q4 2017) şimdi daha açık olduğunu unutmayın:

-X<option>Birleşimler için ' ' dokümantasyonu yanıltıcı bir şekilde yazılmış ve " -s theirs" durumun böyle olmadığını gösteriyor.

Bkz c25d98b taahhüt tarafından (2017 25 Eyl) Junio C Hamano ( gitster) .
(Göre Birleştirilmiş - Junio Cı Hamano gitster- içinde 4da3e23 tamamlama 2017 28 Eki)

birleştirme stratejileri: " -s theirs" olduğunu ima etmekten kaçının

-XoursBirleştirme seçeneğinin açıklaması , okuyuculara çok farklı olduğunu söyleyen bir parantez notuna sahiptir -s ours, bu doğrudur, ancak bunun açıklaması -Xtheirsdikkatsizce "bunun tersidir" diyor oursve okuyucuların da ihtiyaç duyduğu yanlış bir izlenim veriyor -s theirsgerçekte var olmayandan çok farklı olduğu konusunda uyarılmalıdır .

-Xtheirsyinelemeli stratejiye uygulanan bir strateji seçeneğidir . Bu, özyinelemeli stratejinin yine de yapabileceği her şeyi birleştireceği ve yalnızca theirsçatışma durumunda mantığa geri döneceği anlamına gelir .

theirsBirleştirme stratejisinin uygunluğu ya da olmaması konusundaki tartışmalar bu Eylül 2017 başlığında tekrar gündeme getirildi .
Daha eski (2008) konuları kabul eder

Kısacası, önceki tartışma " -s theirsyanlış iş akışını teşvik ettiği için" istemiyoruz "şeklinde özetlenebilir .

Takma addan bahseder:

mtheirs = !sh -c 'git merge -s ours --no-commit $1 && git read-tree -m -u $1' -

Yaroslav Halchenko bu strateji için bir kez daha savunmaya çalışıyor, ancak Junio ​​C. Hamano ekliyor :

Bizim ve onların simetrik olmamalarının nedeni siz değil onlarsınız --- tarihimizin ve tarihlerinin kontrolü ve mülkiyeti simetrik değildir.

Tarihlerinin ana hat olduğuna karar verdikten sonra, gelişim çizginize bir yan dal olarak davranmak ve bu yönde bir birleştirme yapmak istersiniz, yani ortaya çıkan birleşmenin ilk ebeveyni tarihlerine ve ikincisine bağlılıktır. ebeveyn geçmişinizin son kötü olanıdır. Böylece "checkout their-history && merge -s ours your-history ilk ebeveynliği mantıklı tutmak için " kullanabilirsiniz.

Ve bu noktada, " -s ours" kullanımı artık " -s theirs" eksikliği için geçici bir çözüm değildir .
İstenen anlambilimin uygun bir parçasıdır, yani hayatta kalan kanonik tarih çizgisi açısından, ne yaptığını korumak, diğer tarih çizgisinin yaptıklarını geçersiz kılmak istiyorsunuz .

Junio, Mike Beaton tarafından yorumlandığı gibi ekliyor :

git merge -s ours <their-ref>' <their-ref>dallarında kalıcı olarak göz ardı edilecek taahhütler olarak yapılan marka taahhütlerini' etkin bir şekilde söylüyor ;
ve bu önemlidir, çünkü daha sonra şubelerinin sonraki durumlarından birleşirseniz, daha sonra yapılan değişiklikler göz ardı edilen değişiklikler getirilmeden getirilecektir .


1
Bu yararlı bir cevap, ancak Junio ​​C'den az önce anladığım önemli bir noktadan bahsetmiyor. Hamano'nun cevabı: git merge -s ours <their-ref>etkin bir şekilde ' kendi- ' nde, onlardan <their-ref> 'e kadar yapılan taahhütlerin kalıcı olarak göz ardı edilme taahhütleri olduğunu söylüyor. '; ve bu önemlidir, çünkü daha sonra şubelerinin sonraki durumlarından birleşirseniz, daha sonra yapılan değişiklikler göz ardı edilen değişiklikler getirilmeden getirilecektir.
MikeBeaton

1
@MikeBeaton Teşekkür ederim. Daha fazla görünürlük için yorumunuzu cevaba ekledim.
VonC

5

Görmek Junio Hamano en yaygın anılan cevabı : Eğer taahhüt içeriği atmak gidiyoruz, sadece kaydedilmesini atmak veya herhangi bir oranda ana tarihin dışarı tutun. İleride okuyacak hiçbir şey olmayan taahhütlerden gelen mesajları okumak için neden rahatsız edesiniz ki?

Ancak bazen idari gereklilikler veya belki de başka bir neden vardır. Hiçbir şeye katkıda bulunmayan taahhütleri gerçekten kaydetmeniz gereken durumlar için:

(edit: wow, bunu daha önce yanlış yapmayı başardım. Bu işe yarıyor.)

git update-ref HEAD $(
        git commit-tree -m 'completely superseding with branchB content' \
                        -p HEAD -p branchB    branchB:
)
git reset --hard

3

Bu bir git tesisat komut okuma ağacı kullanır, ancak daha kısa bir genel iş akışı sağlar.

git checkout <base-branch>

git merge --no-commit -s ours <their-branch>
git read-tree -u --reset <their-branch>
git commit

# Check your work!
git diff <their-branch>

0

Bu, newBranch'ınızı mevcut baseBranch'ta birleştirir

git checkout <baseBranch> // this will checkout baseBranch
git merge -s ours <newBranch> // this will simple merge newBranch in baseBranch
git rm -rf . // this will remove all non references files from baseBranch (deleted in newBranch)
git checkout newBranch -- . //this will replace all conflicted files in baseBranch

Örneğinizin git commit --amendsonuna eklemenizi öneririm , yoksa kullanıcılar birleştirme git logişleminin tamamlandığını görebilir ve işlemin tamamlandığını varsayabilir.
Michael R

0

Aslında istediğin şey:

git checkout -B mergeBranch branchB
git merge -s ours branchA
git checkout branchA
git merge mergeBranch
git branch -D mergeBranch

Bu beceriksiz görünüyor, ama işe yaramalı. Bu çözüm hakkında gerçekten sevmediğim tek şey git geçmişinin kafa karıştırıcı olacağı ... Ama en azından tarih tamamen korunacak ve silinmiş dosyalar için özel bir şey yapmanız gerekmeyecek.


0

(Üst siparişi tutan) 'git merge -s theirs branchB' ile eşdeğerdir

Birleştirmeden önce:resim açıklamasını buraya girin

!!! Temiz durumda olduğunuzdan emin olun !!!

Birleştirme işlemini yapın:

git commit-tree -m "take theirs" -p HEAD -p branchB 'branchB^{tree}'
git reset --hard 36daf519952 # is the output of the prev command

Yaptığımız ? İki ebeveynimizin ve bizim ve yeni bir komite yarattık ve bu taahhüdün kontrolü branşB - onların

Birleştirmeden sonra:resim açıklamasını buraya girin

Daha kesin:

git commit-tree -m "take theirs" -p HEAD -p 'SOURCE^{commit}' 'SOURCE^{tree}'

0

Bu cevap Paul Pladijs tarafından verildi. Sadece emirlerini aldım ve kolaylık sağlamak için git takma adı yaptım.

.Gitconfig dosyanızı düzenleyin ve aşağıdakileri ekleyin:

[alias]
    mergetheirs = "!git merge -s ours \"$1\" && git branch temp_THEIRS && git reset --hard \"$1\" && git reset --soft temp_THEIRS && git commit --amend && git branch -D temp_THEIRS"

Sonra "git merge -s onlarınki A" çalıştırarak:

git checkout B (optional, just making sure we're on branch B)
git mergetheirs A

-1

Son zamanlarda bunu ortak bir geçmişi paylaşan iki ayrı depo için yapmam gerekiyordu. Şununla başladım:

  • Org/repository1 master
  • Org/repository2 master

Depo2'nin yapacağı tüm değişiklikleri kabul ederek tüm değişikliklerin repository2 masteruygulanmasını istedim repository1 master. Git'in terimleriyle, bu ANCAK var olmayan bir strateji olmalı-s theirs . Dikkatli olun, çünkü -X theirsistediğiniz gibi adlandırılır, ancak aynı DEĞİLDİR (hatta adam sayfasında bunu söyler).

Bunu çözme şeklim, repository2yeni bir dal yapmaktı repo1-merge. O dalda koştumgit pull git@gitlab.com:Org/repository1 -s ours ve sorunsuz bir şekilde birleşti. Sonra uzaktan kumandaya itiyorum.

Sonra geri dönüp repository1yeni bir dal yapıyorum repo2-merge. O dalda koşuyorumgit pull git@gitlab.com:Org/repository2 repo1-merge sorunları ile tamamlayacak .

Son olarak, repository1yeni master yapmak için bir birleştirme isteği vermeniz veya sadece bir şube olarak tutmanız gerekir.


-2

Bunu yapmanın basit ve sezgisel (bence) iki adımlı bir yolu

git checkout branchB .
git commit -m "Picked up the content from branchB"

bunu takiben

git merge -s ours branchB

(iki dalı birleştirildi olarak işaretler)

Tek dezavantajı, branşB'de silinen dosyaları geçerli şubenizden kaldırmamasıdır. Sonrasında iki dal arasındaki basit bir fark, bu tür dosyalar olup olmadığını gösterecektir.

Bu yaklaşım aynı zamanda revizyon günlüğünden sonra neyin yapıldığını ve neyin amaçlandığını da netleştirir.


bu orijinal soru için doğru olabilir, ancak OP soruyu 2008'de bu cevap yanlış olacak şekilde güncelledi.
user3338098

1
@ user3338098 Evet, yanıltıcı başlık bıraktı ve sadece bir nedenle görünmeyen güncelleştirme tokatladı böyle üzücü sonunda bu cevaplar çünkü .... soru vücudun yapar doğru başlık soruyu cevabı.
RomainValeri

@RomainValeri ile tamamen katılıyorum
AppleCiderGuy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.