Git yeniden taban: çatışmalar ilerlemeyi engellemeye devam


120

Dün master'dan yapılmış bir git dalım (v4 adında) var. V4.0'a girmek istediğim, ustalaşmam gereken birkaç değişiklik vardı. Yani, v4'te, ana bilgisayardan bir geri ödeme yapmayı denedim ve bir dosya işleri alt üst etmeye devam ediyor: sürüm numarasını içeren tek satırlık bir metin dosyası. Bu dosya app/views/common/version.txt, yeniden oluşturmadan önce şu metni içerir:

v1.4-alpha-02

İşte yaptığım şey:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

version.txtŞimdi şöyle görünür:

<<<<<<< HEAD:app/views/common/version.txt
v1.4-alpha-02
=======
v1.4-alpha-01
>>>>>>> new version, new branch:app/views/common/version.txt

Ben de düzelttim ve şimdi şöyle görünüyor:

v1.4-alpha-02

ve sonra devam etmeye çalıştım: ilk başta bir taahhüdü denedim:

> git commit -a -m "merged"
# Not currently on any branch.
nothing to commit (working directory clean)

Orada şans yok. Yani, dosyayı eklemeye çalışıyordum:

git add app/views/common/version.txt

Cevap yok. Hiçbir haber iyi haber değildir, sanırım. Bu yüzden devam etmeye çalışıyorum:

> git rebase --continue
Applying: new version, new branch
No changes - did you forget to use 'git add'?

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

İşte tam bu noktada, bununla dönüp durduktan sonra, kafamı masadan vuruyorum.

Burada neler oluyor? Neyi yanlış yapıyorum? Biri beni düzeltebilir mi?

EDIT - unutbu için

Dosyayı önerdiğiniz gibi değiştirdim ve aynı hatayı alıyorum:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

10
bu soruyu sorduğunuz için teşekkürler .. Ben de aynı sorunla karşı karşıyaydım
Archan Mishra

6
bir cevabı onaylarsanız iyi olur
holms

3
@MaxWilliams, bence siz (benim gibi) @unutbu'nun tavsiyesini yanlış yorumladınız : 1) önce koşun git rebase master ve başarısız olmasına izin verin ; 2) daha sonra düzenleyip version.txto noktaya bakması gerektiği gibi yaparsınız ve düzenlemeyi kaydedersiniz; 3) o zaman siz git add .../version.txt; 4) o zaman do git rebase --continue( değil 'taahhüt' )! rebase --continueBurada başarılı olursa , zaten taahhüt edilmiştir ( git commitburada gerek yok!) - yani tek yapmanız gereken git push(uzak bir depo kullanıyorsanız). Umarım bu yardımcı olur, eğer doğru yaparsam :)- şerefe!
sdaau

@MaxWilliams, bunun için hiç bir cevap aldınız mı : ruby-forum.com/topic/187288 (Bir başkası oraya ilk
ulaşmazsa bir cevaptan

Yanıtlar:


102

Rebase'de benzer bir sorunla karşılaştım. Sorunumun nedeni, yürütmemden birinin yalnızca bir dosyayı değiştirmesiydi ve çözerken, bu yürütmede sunulan değişikliği göz ardı ettim. Karşılık gelen commit ( git rebase --skip) 'i atlayarak sorunumu çözebildim .

Bu sorunu bir test havuzunda yeniden oluşturabilirsiniz. Önce depoyu oluşturun.

$ mkdir failing-merge
$ cd failing-merge
$ git init
Initialized empty Git repository in $HOME/failing-merge/.git/

Daha sonra orijinal içeriğini version.txtana olarak işleyin.

$ echo v1.4-alpha-02 > version.txt
$ git add version.txt
$ git commit -m initial
[master (root-commit) 2eef0a5] initial
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 version.txt

v4Şube oluşturun ve içeriğini değiştirin version.txt.

$ git checkout -b v4
Switched to a new branch 'v4'
$ echo v1.4-alpha-03 > version.txt
$ git add version.txt
$ git commit -m v4
[v4 1ef8c9b] v4
 1 files changed, 1 insertions(+), 1 deletions(-)

Geri ödeme sırasında bir çatışma olacak şekilde geri dönün masterve içeriğini değiştirin version.txt.

$ git checkout master
Switched to branch 'master'
$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git commit -m master
[master 7313eb3] master
 1 files changed, 1 insertions(+), 1 deletions(-)

Şubeye geri dönün v4ve yeniden ödemeyi deneyin. Planlandığı version.txtgibi bir çatışma ile başarısız olur .

$ git checkout v4
Switched to branch 'v4'
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: v4
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging version.txt
CONFLICT (content): Merge conflict in version.txt
Recorded preimage for 'version.txt'
Failed to merge in the changes.
Patch failed at 0001 v4

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".
$ cat version.txt
<<<<<<< HEAD
v1.4-alpha-04
=======
v1.4-alpha-03
>>>>>>> v4

Çatışmayı masteriçeriğini seçerek çözüyoruz version.txt. Dosyayı ekliyoruz ve yeniden ödememize devam etmeye çalışıyoruz.

$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git rebase --continue 
Applying: v4
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

Başarısız ! Bakalım gitdepomuzda hangi değişikliklerin olduğunu düşünelim .

$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

Ah ah, değişiklik yok. Önceki hata mesajını ayrıntılı olarak okuduysanız, gitbunu bize bildirin ve kullanmanızı tavsiye ederiz git rebase --skip. Bize "Sahneye hiçbir şey kalmadıysa, aynı değişiklikleri zaten başka bir şeyin getirmiş olma ihtimali vardır; bu yamayı atlamak isteyebilirsiniz" dedi. Bu yüzden sadece commit'i atlıyoruz ve rebase başarılı.

$ git rebase --skip
HEAD is now at 7313eb3 master

Dikkatli bir kelime : Lütfen bunun git rebase --skipyeniden temel gitalmaya çalışan taahhüdü tamamen bırakacağını unutmayın . Bizim durumumuzda, gitşikayet etmek boş bir taahhüt olduğu için bu tamam olmalıdır . Geri ödeme tamamlandığında değişiklikleri kaybettiğinizi düşünüyorsanız, yeniden ödemeden git reflogönce deponuzun commit kimliğini almak için kullanabilirsiniz ve deponuzu git reset --hardbu durumda geri almak için kullanabilirsiniz (bu başka bir yıkıcı işlemdir).


4
Sylvain bu uzun açıklamayı yazmaya zaman ayırdığınız için teşekkürler! Bu, daha net hale getirir. Sanırım işin kaybolabileceğini düşündüğümden bir yamayı atlamaktan her zaman gergindim: yani yama sadece çatışmanın olduğu değil, yeniden temelden etkilenen tüm dosyaları içeriyordu. O halde bir yama, tek bir dosyada tek bir birleştirme mi?
Max Williams

3
Hayır, bir yama, tek bir işlemde değiştirilen tüm dosyalardaki tüm farkı içerir. Ancak kullanırken git rebase --skip, yalnızca tek bir kaydı atlarsınız. git statusBu durumda olup olmadığımı görmek için genellikle bir taahhüdü atlamadan önce bir yayınlarım.
Sylvain Defresne

1
Harika bir açıklama yazmak için zaman ayırdığınız için teşekkür ederken Max'i yankılamak istedim - sonunda bunun neden olduğunu anladım. Ayrıca artık korkmuyorum rebase --skip:).
Ben Dolman

1
Uyarı - bir işlemede birkaç değişikliğiniz varsa, git rebase --skip yaparak işinizi kaybedebilirsiniz. Az önce yaptım
Chrissy H

@ChrissyH Bir yapmadıysanız git reflog purgeveya git reflog deletekullanarak değişikliklerinizi geri alabilirsiniz git reflog. Orada referans verilen farklı commit'i kontrol etmeye çalışın, bunlardan biri siz bütüne başlamadan önce ağacınızın durumu olmalıdır git rebase.
Sylvain Defresne

23

Buradan alıntı yapmak: http://wholemeal.co.nz/node/9

Ha?!? Hayır, git add kullanmayı unutmadım, yaptım ... 2 saniye önce!

Görünüşe göre, yamada değişiklik olmadığı için git, bir şeylerin ters gittiğinden şüpheleniyor. Git bir düzeltme ekinin uygulanmasını bekler ancak dosya değişmeden kalır.

Hata mesajı çok sezgisel değildir, ancak cevabı içerir. Rebase'e bu yamayı atlamasını söylememiz gerekiyor. Dosyadaki çakışma işaretlerini düzeltmek de gerekli değildir. Yeniden verdiğiniz şubeden dosya sürümüne sahip olacaksınız.

$ git rebase --skip

Git mergetool'u kullanıp değişiklikleri düzelttikten, sonra onları ekledikten ve teslim ettikten sonra, 'Şu anda herhangi bir dalda değil' iken <code> git rebase --skip </code> yazdım. Ve her şey düzeltildi. Teşekkürler!
geerlingguy

Aslında, sonunda durumumu düzelten, sürekli olarak git mergetool, ardından git rebase --continue, sonra git mergetool, vb. Kombinasyonunun bir kombinasyonuydu.
geerlingguy

6

Bu hata mesajı, sizin git commit -a -m "merged". Dosyayı sadece düzeltirseniz, ardından çalıştırın git add <file>ve git rebase --continueiyi çalışması gerekir. git rebase --continuebir commit yapmaya çalışıyor, ancak taahhüt etmek için bekleyen değişikliklerin olmadığını fark ediyor (çünkü onları zaten taahhüt ettiniz).


1
Bu, en azından genel durumda, bir atlama yapmaktan çok daha makul görünüyor. En iyi cevap olarak listelenmemesine şaşırdım.
Zümrüt D.

1
@EmeraldD., Çalışmıyor. Dosyayı düzeltip çalıştırmak git add <file>sorunu çözmez. git rebase --continue hala raporlarNo changes - did you forget to use 'git add'?
Pacerier

6

App / views / common / version.txt dosyasını şununla değiştirin:

v1.4-alpha-01

Rebase'de bu noktada, ana olmayanın ilerlemesini göstermek için birleştirme çatışmalarını çözdüğünüzü unutmayın. dalın .

Yani,

      A---B---C topic
     /
D---E---F---G master

için

              A*--B*--C* topic
             /
D---E---F---G master

Çözdüğünüz çelişki konu dalında nasıl A * oluşturulacağıyla ilgilidir.

Yani yaptıktan sonra git rebase --abortkomutlar

git checkout topic
git rebase master
< make edits to resolve conflicts >
git add .
git rebase --continue

3
Teşekkürler unutbu, bunu denedim ama şansım yok: yeni düzenleme için bkz. OP. şerefe
Max Williams

4

Gördüğünüz davranış, sadece bu çatışmanın olduğu tipik bir yeniden ödemeden beklediğim şey değil. Bu geri ödemeyi yapmak için ayrı bir şube kullanmayı düşünün (özellikle hızlı ileri aldığınız taahhütleri uzaktan zaten ittiyseniz). Ayrıca, git mergetoolçatışmaları çözmek ve a git add.

Bu minimal örnekte, geri ödeme beklendiği gibi çalışıyor. Gördüğünüz davranışı gösteren bir örnek verebilir misiniz?

#!/bin/bash

cd /tmp
mkdir rebasetest
cd rebasetest
git init
echo 'v1.0' > version.txt
git add version.txt
git commit -m 'initial commit'
git checkout -b v4
echo 'v1.4-alpha-01' > version.txt
git add version.txt
git commit -m 'created v4'
git checkout master
git merge v4
echo 'v1.4-alpha-01-rc1' > version.txt
git add version.txt
git commit -m 'upped version on master to v1.4-alpha-01-rc1'
git checkout v4
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git commit -m 'starting work on alpha-02'

git rebase master
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git rebase --continue

4

İşte bazı fikirler:

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.