Birleştirme işleminden sonra kesinleştirme işleminde Git hatası - ölümcül: birleştirme sırasında kısmi kesinleştirme yapılamaz


280

git pullBir çatışmayla sonuçlanan bir tane çalıştırdım . Çatışmayı çözdüm ve şimdi her şey yolunda (mergetool da kullandım).

Çözülen dosyayı teslim git commit file.php -m "message"aldığımda hatayı alıyorum:

fatal: cannot do a partial commit during a merge.

Daha önce aynı sorunu vardı ve -ataahhütte kullanmak mükemmel çalıştı. Bence bu mükemmel bir yol değil çünkü tüm değişiklikleri yapmak istemiyorum. Dosyaları ayrı yorumlarla ayrı ayrı işlemek istiyorum. Bunu nasıl yapabilirim? Git neden kullanıcıların birleştirme işleminden sonra dosyaları ayrı ayrı işlemesine izin vermiyor? Bu soruna tatmin edici bir cevap bulamadım.


5
Ve biliyorsun, git tam arama "tam taahhüdü" gerçekleştirmek neredeyse hiçbir işe yaramaz. Git'in man sayfalarındaki ilgili bir belge değil. Bu çok sefil bir araç.
jww

6
@Torek - Git tarafından yaratılan başka bir karmaşa hakkında konuşun ... Neden bu kadar tanrı, çatışmanın önlenmesi, bu dalın içine eklenmesi ve daha sonra işlenmesi için başka bir şubeden çakışan bir dosyayı teslim almak zor? Ve WTF kısmi bir taahhüttür? Üzerinde herhangi bir belge bulamıyorum ... Kullanıcılar aşağıdaki tahminleri denemek zorunda ...
jww

Bunu nasıl yaptın? Bir çatışmam var ve hiçbir şey yapamıyorum
Niklas R.

Yanıtlar:


442

Taahhüt komutuna "-i" eklemenin benim için bu sorunu çözdüğünü buldum. -İ temel olarak, işlemeden önce ek dosyalar yerleştirmesini söyler. Yani:

git commit -i myfile.php

18
Ne anlama Stage additional filesgeliyor?
jcalfee314

9
@ jcalfee314 aşaması git dosyalama taahhüt için hazırlamaktır. Bu özel durumda, taahhütte bulunmadan önce dosyayı komut satırı aracılığıyla aşamalandırır. -İ bayrağı çoğunlukla birleştirme işlemi yaptığınızda kullanılır. Burada taahhüt bayrakları hakkında daha fazla bilgi edinebilirsiniz .
MikaelHalen

4
@ jcalfee314 kontrol ettim belgelere ve diyor "Bir şimdiye kadar sahnelenen içeriğinin dışarı taahhüt yapmadan önce, sahne de. Bu, bir çatışma birleştirme sonuçlandırılması sürece istediğini genelde değil komut satırında verilen yolların içeriği olarak" . Benim tahminim, bu şartlar altında, evreleme alanında çözülemeyen git add, git commitbaşarısızlığa uğrayan bir çeşit tutarsızlık var . Eklemek -igit'e aynı anda ekleme ve ekleme yapmalarını söylerdi. Hala neden olduğundan emin değilim ama mantıklı geliyor.
JonSlowCN

5
Benim gibi noobs için, tırnak işaretleri olmayan boşluklar içeren bir mesajı denerseniz de aynı hatayı alırsınız. Örneğin. [git commit -m bir iki üç] Doğru: [git commit -m "bir iki üç"]
Skychan

2
@ Skychan'ın yorumu benim için biletti.
tehbeardedone

106
git commit -am 'Conflicts resolved'

Bu benim için çalıştı. Bunu da deneyebilirsiniz.


1
Şaşırtıcı, bunu bilmiyordum!
JeanValjean

11
Bu, değiştirilemeyen ve istenmeyebilecek dosyalar olsa dahi , değiştirilen tüm dosyaları işleme ekler . Kullanıcılar 'a' bayrağını bırakmak isteyebilir
Chase Sandmann

4
Bu tam olarak kullanıcının yapmamasını istediği şeydir, bu da tüm dosyaları işlemekten kaçınmaktır.
Michael

33

git commit -iÇoğu durumda kullanabilirsiniz , ancak çalışmadığı takdirde

Yapmanız gerek git commit -m "your_merge_message". Birleştirme çakışması sırasında tek bir dosyayı birleştiremezsiniz.

  1. Yalnızca çakışan dosyayı aşamalandır ( git add your_file.txt)
  2. git commit -m "your_merge_message"

16

Muhtemelen taahhütte bulunmadığınız bir şeyde çatışmanız var. git, işleri bağımsız olarak yapmanıza izin vermeyecektir (çünkü bunların hepsi birleştirme işleminin bir parçası, sanırım), bu yüzden git addo dosyaya ve sonra ihtiyacınız var git commit -m "Merge conflict resolution". İçin -ibayrak git commitsizin için eklenti yapar.


5
1.9.0 commit -ideğilgit add; git commit
LeeGee

14

-mGit git birleştirme çatışmasını çözerken benim git taahhüdümü unuttuğumda bunu aldım .

git commit "commit message"

olmalı

git commit -m "commit message"

2
Ah ah! Tekrar unuttum!
user2705463

9

Hata mesajında ​​belirtildiği gibi, birleştirme işleminden sonra kısmi bir işlem yapamazsınız. Sadece file.phptaahhüt etmek yerine tüm değişiklikleri yapmalısınız.

Bu çalışmalı.

git commit -m "Fixing merge" 

Teşekkürler, yardımcı oldu
Narendra Pandey

Benim için olduğu gibi çalıştı
Shashank Bodkhe

6

Birleştirme işlemin ortasında durdu. Dosyalarınızı eklemeli ve ardından 'git commit':

git add file_1.php file_2.php file_3.php git commit

Şerefe


5

Sadece tüm kiraz toplamadan kurtulmak ve dosyaları istediğiniz herhangi bir sette işlemek istiyorsanız,

git reset --soft <ID-OF-THE-LAST-COMMIT>

seni oraya götürür.

Yumuşak sıfırlamanın yaptığı şey, mevcut HEAD'ı gösteren işaretçiyi verdiğiniz kesinliğe (ish) hareket ettirmek ancak dosyaları değiştirmemesidir. Donanımdan sıfırlama, işaretçiyi hareket ettirir ve ayrıca tüm dosyaları bu komuttaki (ish) duruma döndürür. Bu, yumuşak sıfırlama ile birleştirme durumunu temizleyebilir, ancak gerçek dosyalardaki değişiklikleri koruyabilir ve daha sonra bunları her isteğinize göre ayrı ayrı kaydedebilir veya sıfırlayabilirsiniz.


Bunu daha fazla açıklayabilir misiniz? Muhtemelen ihtiyacım olan budur, ancak nasıl çalışacağını takip etmiyorum ... Buradaki tüm cevaplar sadece 'dosyaları ekleyin, sonra taahhüt edin!', Ama bu çok açık bir şekilde açık; Burada olmamın nedeni, taahhütte bulunmadan önce bu dosyaları eklemek istemiyorum. -_-;
Kyle Baker

Bu yardımcı olur. Teşekkürler. :)
Kyle Baker

5
  1. proje dizininize gidin
    1. gizli dosyaları görüntüle (.git klasörü görünecektir)
    2. .git klasörünü aç
    3. MERGE_HEAD kaldır
    4. tekrar taahhüt et
    5. git size git'in kilitli olduğunu söylerse .git klasörüne geri dönün ve index.lock dosyasını kaldırın
    6. tekrar taahhüt her şey bu sefer iyi çalışacaktır.

Harika! Bu benim için işe yarar. Bu arada, MacOS'ta, terminalden `` open .git '' diyebilirsiniz, cadı Finder'da '.git' içeriğini
gösterecektir

Bu benim için de geçerli. Bu cevap olarak kabul edilmelidir.
vandu

3

Kendim için bu, tüm dosyaları çözmeden önce birleştirme yapmaya çalıştığımda SourceTree'de oldu. Daha sonra çözülen son dosyayı işaretledim ve yine de taahhütte bulunmaya çalışırken bana bu hatayı verdi. SourceTree'yi kapattım ve yeniden açtım ve sonra iyi işledi.


1
teşekkürler, ama ne yazık ki bu benim için işe yaramadı. Can sıkıcı bir şekilde, birleşmeyi gerçekleştirmeme izin vermeden önce bir görüş-özel ve birleştirme yapmak zorunda kaldım.
Coxy

3

Bunu sadece Xcode'un Kaynak Kontrolünü kullanarak tamamen farklı bir yaklaşımla çözdüm.

Arka plan: Başka bir ekip Uzak Git deposundaki değişiklikleri itti (Beanstalk aracılığıyla). Sonunda, .xcodeproj dosyaları farklı bir dizin altında geldi ve değişiklikler almadı. Daha sonra, taahhüt etmeye çalıştığımda, Xcode'da bir Tree Conflict hatası aldım.

Önizleme Oyun Ağaç Çatışması

Xcode kullanarak düzeltmek neredeyse imkansız olan .xcodeprojdosyayı Git sunucusundan indirilen bir sürümle değiştirdim . Sonuç ... Xcode projesi temizlenmiş gibi göründü, ancak bozuk Pull'un tüm güncellemeleri yaptığım değişiklikler olarak görünüyordu ve bir Taahhüt için Hazırlandı.

Tüm bu Modlara ve Eklenen dosyalara bakın

Ancak, taahhütte bulunmaya çalışırken, burada tartışılan aynı "ölümcül: bir birleştirme sırasında kısmi bir taahhütte bulunamıyorum" hatasını aldım.

Sorunu şu şekilde çözdüm ... (Şimdi, bir çaylak programcısı olduğumu anlayın, bu yüzden biraz anlayışım olmayabilir ... ama cehaletim bunu yapmanın başka bir yolunu bulmamı sağladı.) İlk olarak, efendimi klonladım Şube ikincil bir şubeye dönüşerek bu şubeye geçti. Sonra bir Çalışma Kopyası oluşturdum ve dizini o çalışma kopyasına orijinal proje dizininin dışına yerleştirdim. (Bunun gerekli olup olmadığını bilmiyorum, ama diğer sorun giderme tekniklerini okuduğumda yaptığım şey bu.) Daha sonra şubeleri değiştirdim, burada tüm Staged dosyalarının (Değişiklik değişiklikleri) gittiğini fark ettim. Tüm dosyaların karşı taraf tarafından yapılan en son değişikliklerle güncellendiğinden emin olmak için, tüm dosyaları çoğaltan ThirdBranch adlı yeni bir şube oluşturdum, Git Sunucusuna itti ve Beanstalk'ın ana dalın sunucu versiyonumu yeni ittiğim ThirdBrach dalıyla (satır satır) karşılaştırmasına izin verdim ve diğer tarafın tüm değişiklikleri Xcode'umda mevcuttu. Bu, ana veri havuzumun ve Git ana veri havuzumun aynı olduğu anlamına geliyordu, bu da sorunu yalnızca Xcode kullanarak çözdüğümü doğrular.

Nasıl tarif ettiğimin ötesinde bana sorma ... ve kesinlikle bıraktığım boşlukları doldur. Bu konuda yeniyim ve her şeyi anlamıyorum. Belki deneyimli bir programcı ilgisiz bilgileri ilgili olandan ayırabilir ve bu tekniği daha net bir şekilde yeniden oluşturabilir, bu da kısmen bunu neden gönderiyorum.

Bu, aşağıdaki gibi yinelenen soruya yinelenen bir yanıttır: Başarısız Xcode Git Merge sıkışmış


2
Lütfen yinelenen cevaplar göndermeyin. Altta yatan sorun aynı olsa da, cevabınız çok daha spesifik bir sorundur ve sadece bu genel sorunun cevaplarını bulutlandırır. Bu durumda, orijinal cevabınıza bağladığınız soruya bir yorum daha uygun olduğunu düşünüyorum.
Fookatchu

2

Birleşme sırasında Git, her türlü nedenden dolayı ana şubeleri takip etmek ister. Yapmak istediğiniz şey git'in gördüğü gibi bir birleştirme değildir. Muhtemelen manuel olarak bir rebase veya cherry-pick yapmak isteyeceksiniz.


1
Daha önce hiç rebase veya cherry-pick kullanmadım, şimdi el kitabından geçtim, bu yüzden ne çatışır çatışmanın işe yarayacağını "git rebase master" önerirsiniz?
pMan

1
Paralel bir iş akışı. Bkz. Stackoverflow.com/questions/804115/git-rebase-vs-git-merge Temel olarak, "birleştirme" nin ayrı olmasını istiyorsanız, bunun yerine kaynak dalı hedef dalın sonuna yeniden birleştirin.
Talljoe

1
Sadece git her dosya eklemek sonra -a olmadan taahhüt.
Peter DeWeese

4
soruyu gerçekten cevaplamadınız, sadece aramak için daha fazlasını verdiniz. Şimdi "kiraz toplama nedir" ve "rebase nedir" bilmek zorundayız.
sürükleyici

2
Bu cevabın neden düşük oy kullanıldığını merak ediyorum. Birisi bana daha önce hiç bilmediğim şeyleri söylediğinde her zaman çocuğun merakı vardı. Yukarıda yorumladığım gibi, şimdi kiraz toplama ve rebase hakkında biliyorum. Bu ilerici / yardımcı olmadı mı?
pMan

2

git commit -i -m 'merge message'benim için çalışmadı. O dedi:

fatal: No paths with --include/--only does not make sense.

FWIW, ben üzerinden burada var bu ilgili soruya bu mesajı başlamıştı çünkü:

fatal: You have not concluded your merge (MERGE_HEAD exists).

Ayrıca, birleştirme aracı denedim No files need merging. Çok kafa karıştırıcı! Yani MERGE_HEAD birleştirme- bir dosyada değil ??

Son olarak, sadece değiştirilmiş dosyaları eklemek için bu hileyi kullandım (ağacımda tüm dosyaları eklemek istemedim, çünkü izlemediğim bazı tutmak zorundayım):

git ls-files -m | xargs git add

Sonra nihayet (!) Taahhütte bulunabildim ve itebildim. Git size bu durumlarda ne yapacağınıza dair daha iyi ipuçları verirse iyi olur.


1

O ise Kaynak Ağacı çakışmalar çözüldüğünde sonra çözüldü olarak, biz açıkça bir dosya işaretlemelisiniz. Çakışmayacak şekilde çözülen dosyayı seçin . Ardından Eylemler -> Çakışmaları Çöz -> Çözümlendi Olarak İşaretle . Birden fazla dosyanız varsa, herkes için aynısını yapın. Şimdi Katıl.


1

Tüm yorumları okuduktan sonra. Bu benim kararımdı:
Ben taahhüt yerine tekrar "Ekle" vardı:

$ git commit -i -m support.html "doit once for all" [master 18ea92e] support.html

1

Kaynak ağacı veya başka bir GUI kullanıyorsanız, tüm dosyaların işaretlendiğinden emin olun (birleştirmeden sonra).


0

Bazen birleşme sırasında, çatışmalar ortaya çıkarsa ve manuel çözüme ihtiyaç duyan deltalar varsa. Bu durumda, belirtilen dosyalar için manuel çözünürlüğü düzeltin.

Şimdi sorun çıkarırsanız,

git status Lib/MyFile.php

Çıktı gibi göreceksiniz

On branch warehouse
Your branch and 'origin/warehouse' have diverged,
and have 1 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:

    modified:   Lib/MyFile.php

Taahhüdünü zaten hazırladığınızdan, sadece sorun duymanız gerekir

git commit

Ve taahhüdünüz herhangi bir sorun olmadan yapılacaktır.

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.