Git yeniden taban - tüm birleştirme çakışmaları çözüldüğünde bile şikayetlere devam edin


115

Nasıl çözeceğimi bilmediğim bir sorunla karşı karşıyayım.

Şubemden ustaya karşı bir geri ödeme yaptım:

git rebase master

ve aşağıdaki hatayı aldım

 First, rewinding head to replay your work on top of it...
 Applying: checkstyled.
 Using index info to reconstruct a base tree...
 Falling back to patching base and 3-way merge...
 Auto-merging AssetsLoader.java
 CONFLICT (content): Merge conflict in AssetsLoader.java
 Failed to merge in the changes.
 Patch failed at 0001 checkstyled.

Bu yüzden favori düzenleyicime gittim, 1 satır çakışmasını düzelttim, dosyayı kaydettim ve git durumu yaptım ve aşağıdaki çıktıyı aldım:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   PassengerContactHandler.java
 #
 # Unmerged paths:
 #   (use "git reset HEAD <file>..." to unstage)
 #   (use "git add/rm <file>..." as appropriate to mark resolution)
 #
 #  both modified:      AssetsLoader.java
 #

Git add AssetsLoader.java ve git durumu yaptım ve aşağıdakileri aldım:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   AssetsLoader.java
 #  modified:   PassengerContactHandler.java
 #

ve git rebase yaptığımda - devam edin:

git rebase --continue
You must edit all merge conflicts and then
mark them as resolved using git add

Yamayı atlayıp yeniden ödemeye devam edebileceğimi biliyorum, ancak PassengerContactHandler.java'daki değişikliklerin şubeme yeniden yüklenip yüklenmeyeceğinden emin değilim.

bu yüzden emin değilim, Nasıl ilerlemeliyim?

Düzenleme: Çatışmanın çözüldüğü dosya tam olarak orijinal sürümle aynı olabilir mi?

Çok teşekkürler Lucas

Düzenle, bana yine oldu:

Yine başıma geldi

(307ac0d...)|REBASE)$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   assets/world/level1/Level-1.xml
#   modified:   George.java
#   modified:   DefaultPassenger.java
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   mb-art/originalAssets/27dec/

((307ac0d ...) | REBASE) $ git yeniden taban - devam

You must edit all merge conflicts and then
mark them as resolved using git add

git --version

git version 1.7.1

Tam çıktısı bu git status, değil mi? Altında eksik bölüm yok mu?
Cascabel

git-rebaseyoksa çözülmemiş çatışmalar olduğunu asla bildirmemelidir. Sorunu daha basit bir test durumunda yeniden oluşturmayı başarabilirseniz, hata ayıklamak çok daha kolay olacaktır, ancak yine de, git statusherhangi bir çakışma bildirmediyseniz git rebase --continueve Git sürümünüz güncelse Git dev'e e-posta göndermeyi deneyebilirsiniz. posta listesi git@vger.kernel.org adresinden alabildiğiniz kadar çok tanılama bilgisi ile.
Cascabel

1
Bana yine oldu, (307ac0d ...) | REBASE) $ git status # Şu anda herhangi bir dalda değil. # Gerçekleştirilecek değişiklikler: # (aşamayı kaldırmak için "git reset HEAD <file> ..." kullanın) # # değiştirildi: assets / world / level1 / Level-1.xml # değiştirildi: George.java # değiştirildi: DefaultPassenger.java # # İzlenmeyen dosyalar: # (kaydedilecek olanları dahil etmek için "git add <dosya> ..." kullanın) # # mb-art / originalAssets / 27dec /
Lucas

GITKRAKEN'i kullanmanız gerektiğini düşünüyorum, çatışmalarınızı çözmede size yardımcı olacaktır
Nikhil Bhardwaj

Yanıtlar:


115

Bunun nedeni, bir çatışmayı düzeltirken, yeniden desteklediğiniz şubeye uygulanan yamadaki tüm kodu kaldırmış olmanızdır. Devam git rebase --skipetmek için kullanın .

Biraz daha ayrıntı:

Normalde, yeniden oluşturma sırasında bir çakışmayı düzeltirken, çakışan dosyayı düzenlersiniz ve şu anda yeniden tabanladığınız şubeye uygulanmakta olan yamadaki kodun bir kısmını veya tamamını saklarsınız. Yamayı düzelttikten ve yaptıktan sonra

git add your/conflicted/file
git status

değiştirilen dosyayı gösteren (genellikle yeşil) bir çizgi alacaksınız

değiştirildi: / çakışan / dosyanız

git rebase --continue bu durumda iyi çalışacaktır.

Ancak bazen, çatışmayı çözerken, yeni yamanızdaki her şeyi kaldırırsınız ve yalnızca yeniden belirttiğiniz şubedeki kodu saklarsınız. Şimdi dosyayı eklediğinizde, tam olarak üzerinde yeniden temel almaya çalıştığınız dosya gibi olacaktır. git durumu, değiştirilen dosyaları gösteren yeşil bir çizgi göstermeyecektir. Şimdi eğer yaparsan

git rebase --continue

git şikayet edecek

Değişiklik yok - 'git add' kullanmayı unuttunuz mu?

Git'in bu durumda gerçekten yapmanızı istediği şey,

git rebase --skip

yamayı atlamak için. Daha önce bunu hiç yapmadım, çünkü yaparsam aslında neyin atlanacağından her zaman emin değildim, "bu yamayı atla" nın gerçekte ne anlama geldiği benim için açık değildi. Ama yeşil bir çizgi almazsan

değiştirildi: / çakışan / dosyanız

Çakışan dosyayı düzenledikten, ekledikten ve git durumunu yaptıktan sonra, tüm yamayı kaldırdığınızdan oldukça emin olabilirsiniz ve bunun yerine kullanabilirsiniz.

git rebase --skip

devam etmek.

Orijinal gönderi bunun bazen işe yaradığını söyledi:

git add -A
git rebase --continue
# works magically?

... ancak buna güvenmeyin (ve artık dosyaları depo klasörlerinize eklemediğinizden emin olun)


1
Aynı sorun ve aynı çözüme sahip gibiydim, aynı zamanda büyülü görünüyordu!
bspink

Aynı sorunu yaşadım, görünüşe göre yeniden yapılan şubede yeniden düzenlenmiş ve yeni dosyalar eklediyseniz ve sonra birleştirme çözümleme işlemi bu yeni dosyalarda değişiklikler yaptı, bunları açıkça tekrar eklemeniz gerekiyor.
İbrahim

Deponuzdaki tüm gereksiz dosyaları izlemek istemiyorsanız bunu yapmayın.
Jed Lynch

git add ...uzun yollarla bir dosya yığınını değiştirdikten sonra yazmak gerçekten can sıkıcı oluyor. git add --all-the-files-i-changedDaha önce koşabileceğim bir var mı git rebase continue?
jozxyqk

3
Git rebase --skip komutunu kullanırken dikkatli olmak için, çalışmanızı kaybedebilirsiniz (düzenlenmiş dosyalar)
Youness Marhrani


8

Hazırlanmamış dosyalarım olduğunda bu uyarıyı aldım. Hazırlanmamış dosyanız olmadığından emin olun. Hazırlanmamış dosyaların değişmesini istemiyorsanız, değişiklikleri kaldırın.

git rm <filename>  

2
O kadar basit ki bir yorum olabilir; çok yardımcı oldu, bir cevap olmalı. Teşekkürler!
Lucas Lima

4

Bunu komut satırınızda çalıştırmayı deneyin:

$ git mergetool

Anlaşmazlıkları çözmenize izin veren etkileşimli bir düzenleyici getirmelidir. Manuel olarak yapmaya çalışmaktan daha kolay ve ayrıca git, birleştirmeyi yaptığınızda bunu tanıyacaktır. Ayrıca, manuel olarak yapmaya çalıştığınızda meydana gelebilecek kazayla tamamen birleşmediğiniz durumlardan da kaçınır.


Daha kolay olabileceğini ve gelecekte böyle durumlardan kaçınmanıza izin vereceğini düşündüm.
Batkins

1
Akşamımı kurtardın. Basit bir araç olsa da, bu araç olmadan çatışmalarımı nasıl çözeceğimi asla anlayamayacağım.
eonil

4

Çakışmayı düzelttikten sonra, değiştirilen dosyaların hazırlanmış dosyalarınıza eklendiğinden emin olun. Bu benim için sorunu çözdü.


Bu benim için hile yaptı. OP'de açıklanan mesajı aldıktan sonra Sourcetree'yi kontrol ettim ve komut penceresinde belirtilen iki dosyayı hemen aşamasız olarak gördüm. Dosyaları hazırladım, "git rebase --continue" çalıştırdım ve yoluma geri döndüm.
Mass Dot Net

3

AssetsLoader.java'da bir birleştirme çakışmasını kaçırdınız. Açın ve çakışma işaretlerini arayın (">>>>", "====", "<<<<<") ve sonra tekrar git add yapın. Bulmakta zorluk çekiyorsanız 'git diff - aşamalı' yapın.


3
İzlenen tüm dosyalar için bir grep yaptım ve herhangi bir çakışma işareti yoktu.
Lucas

git diff --stagedYararlı bir şey açığa çıkarıyor mu ? Bu, yeniden ödemenin bu noktasında birleştirme ihtilaflarını çözmek için hangi değişiklikleri yapmak üzere olduğunuzu gösterir. Dosyalardan birinde "oops, bu sorunu çözmek için yapmayı düşündüğüm şey bu değil" olmalı.
Ether

4
Git, ilerlemeye çalıştığınızda birleştirme çakışması işaretçileri aramıyor. Yalnızca dizinin temiz durumda olup olmadığını kontrol eder. İçinde hala çakışma işaretleri olan bir dosya hazırladıysanız, onu onlarla birlikte işlemek istediğinizi belirtmiş olursunuz. Muhtemelen her zaman bir hatadır, ancak bunu yapmanıza izin verir.
Cascabel

@Ether bu hiç bir sebep değil. İçinde git addçakışma işaretleri olan bir dosyayı bile yapabilirsiniz . Sonuçta, bu tür dosyalar tamamen yasal olabilir!
FGE

@Jefromi: bir ha, bilmek güzel! Her zaman işaretçilerin kontrol edildiğini ve eğer kasıtlı olsaydı birinin onu geçmek zorunda kalacağını varsaydım.
Ether

3

Az önce bu sorunu yaşadım ve birkaç nedeni olabileceğini düşünürken, işte benimki ...

Belirli koşullar altında taahhütleri reddeden bir git pre-commit kancam vardı. Bu, kancanın çıktısını göstereceğinden, manuel olarak taahhütte bulunurken iyidir ve bunu düzeltebilirim veya commit --no-doğrulama kullanarak onu yok saymayı seçebilirim.

Sorun şu ki, yeniden ödeme yapılırken, rebase --continue de kancayı çağıracak (en son değişiklikleri gerçekleştirmek için). Ancak yeniden taban, kanca çıktısını göstermez, yalnızca başarısız olduğunu görür ve ardından daha az belirgin bir hata verir: 'Tüm birleştirme çakışmalarını düzenlemelisiniz ve ardından git add kullanarak bunları çözülmüş olarak işaretlemelisiniz'

Düzeltmek için, tüm değişikliklerinizi hazırlayın ve 'git rebase --continue' yerine bir 'git commit' deneyin. Aynı kanca probleminden muzdaripseniz, neden başarısız olduğunu görmelisiniz.

İlginç bir şekilde git rebase, git hook'un çıktısını göstermezken, kancaları atlamak için bir --no-doğrulama kabul ediyor.


1
Benzer bir problemim vardı. Burada benim için başka hiçbir şey işe yaramadı, ancak sadece 'git commit' yapmak ve sonra iptal etmek, her ne olursa olsun, tutarsızlık sihirli bir şekilde çözüyor gibiydi ve sonra başarılı bir şekilde 'git rebase --continue' yapabildim.
patrickvacek

Sadece kayıt için, son zamanlarda benzer bir sorunla mücadele ettiğim için seçeneği git rebasekabul ediyor --no-verify. Ancak, yalnızca pre-rebasekancayı atlar , ancak bu seçenek sonraki çağrılarda uygulanmaz git commit.
pkrysiak

Geçerli bir nokta içerir (commit değişiklikleri), ancak iyi bir cevap için çok ayrıntılı.
Jack Miller

2

Değişikliklerinizi düzelttikten sonra 'git add -A' çalıştırmayı unutabilirsiniz.

git add -A
git rebase --continue

1

Ben sadece konuya tökezledim. Yapmam, git rebase --skip çünkü git statussaklamak istediğim aşamalı değişiklikleri açıkça göstermem. Beklenmedik bir şekilde gelen fazladan dosyalarım olmasına rağmen. İle çözdüm

git checkout .

aşamalı olmayan değişiklikleri kaldırmak için, sonra git rebase --continuebaşarılı oldu.

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.