Git Çekme Mümkün Değil, Birleştirilmemiş Dosyalar


90

Bununla ilgili tüm benzer soruları okudum; Aşağıdakilerden hiçbiri işe yaramadı gibi görünüyor:

Delete offending files
git reset --hard HEAD
git stash
git pull

Neredeyse her kombinasyon, değişikliklerin saklanması ve depodan çekilmesi, birleştirilemeyen dosyalar ile sonuçlanır. Tüm yerel değişiklikleri atmak ve sadece uzaktan kumandayı kullanmak istiyorum, ancak tekrar klonlayamıyorum (geliştiricinin bunu yapmaya çalıştığı bant genişliği ve internet kullanım sınırlamaları). Bunu nasıl yaparım?

Denedim:

git stash
git pull

Ayrıca işe yaramadı.

Daha fazla bilgi

Bir yerel taahhüt vardır ve yukarı akışta da taahhüt vardır. Bu yüzden denedim git pull --rebaseama hala düzgün çalışmıyor ... Bu bana hatalar veriyor - "çözülmemiş bir çatışma nedeniyle çıkıyorum". Bunu yaparsam git stash, git reset --hard HEAD, git pull --rebase, "çekmek mümkün değil, birleştirilmemiş değişiklikler ..." hatası alıyorum.

Yanıtlar:


202

Uzaktan kumandanın originve şubenin olduğunu masterve zaten masterkontrol ettiğinizi söyleyin , aşağıdakileri deneyebilir:

git fetch origin
git reset --hard origin/master

Bu temelde sadece geçerli dalı alır ve onu HEADuzaktaki şubeye işaret eder.

UYARI : Açıklamalarda belirtildiği gibi, bu yerel değişiklikleri atmak olacak ve kökeni ne olursa olsun on ile üzerine .

Veya esasen aynısını yapmak için sıhhi tesisat komutlarını kullanabilirsiniz:

git fetch <remote>
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
git reset --hard

DÜZENLEME: Bunun neden işe yaradığını kısaca açıklamak istiyorum.

.gitKlasör depoları herhangi bir sayı için kaydedilmesini tutabilir. Commit hash'i aslında commit içeriği için bir doğrulama metodu olduğundan ve sadece rastgele oluşturulmuş bir değer olmadığından, depolar arasındaki commit setlerini eşleştirmek için kullanılır.

Dal, belirli bir hash için yalnızca adlandırılmış bir göstericidir. İşte bir örnek set:

$ find .git/refs -type f
.git/refs/tags/v3.8
.git/refs/heads/master
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master

Bu dosyaların her biri, bir işleme işaret eden bir karma içerir:

$ cat .git/refs/remotes/origin/master
d895cb1af15c04c522a25c79cc429076987c089b

Bunların tümü dahili git depolama mekanizması içindir ve çalışma dizininden bağımsız olarak çalışır . Aşağıdakileri yaparak:

git reset --hard origin/master

git, geçerli dalı, origin / master'ın işaret ettiği aynı hash değerine işaret edecektir. Daha sonra, bu karmadaki dosya yapısını / içeriğini eşleştirmek için çalışma dizinini zorla değiştirir.

Bunu iş yerinde görmek için devam edin ve aşağıdakileri deneyin:

git checkout -b test-branch
# see current commit and diff by the following
git show HEAD
# now point to another location
git reset --hard <remote>/<branch>
# see the changes again
git show HEAD

2
En son onaylanan düzenlemeden, başlangıca büyük bir uyarı ekleyerek, daha önce belirtildiği gibi: "Sonra [git], çalışma dizinini o karmadaki dosya yapısı / içeriği ile eşleşecek şekilde zorla değiştirir." Ama tahmin et bu yeterince açık değildi.
Trevor Norris


6

Aşağıdaki komut seti kullanılarak çözüldü:

git reset --hard
git pull --rebase
git rebase --skip
git pull

İşin püf noktası değişiklikleri yeniden sıralamak ... Önemsiz bir commit'i yeniden sıralamakta biraz sorun yaşadık ve bu yüzden git rebase --skip (dosyaları kopyaladıktan sonra) kullanarak onu atladık.


3

Bir git fetchve sonra çalıştırdıktan sonra bu sorunu yaşarsanız, git git pullbir birleştirme çakışması nedeniyle çalışmanıza izin vermiyorsa ( hem değiştirilmiş / birleştirilmemiş dosyalar hem de sizi daha fazla hayal kırıklığına uğratmak için, size herhangi bir çakışma işaretçisi göstermez. dosya henüz birleştirilmediğinden). Çalışmanızı kaybetmek istemiyorsanız, aşağıdakileri yapabilirsiniz.

dosyayı hazırlayın.

$ git add filename

ardından yerel değişiklikleri saklayın.

$ git stash

çalışma dizininizi çekin ve güncelleyin

$ git pull

yerel değiştirilmiş dosyanızı geri yükleyin (git, yapabiliyorsa otomatik olarak birleştirir, aksi takdirde çözer)

$ git stash pop

Umarım yardımcı olur.


2

Yerel değişikliklerinizi kaldırmak istemeseniz bile bir çözüm var. Sadece birleştirilmemiş dosyaları düzeltin ( git addveya ile git remove). O zaman yap git pull.


1

Sahip olduğunuz değişiklikleri atmak istediğinizi varsayarak, önce çıktısını kontrol edin git status. Yanında "unmerged" yazan herhangi bir dosya için çalıştırın git add <unmerged file>. Ardından ile takip edin git reset --hard. Bu, izlenmeyen dosyalar dışındaki tüm yerel değişikliklerden kurtulacaktır.


Oh, doğru. "Birleştirilmemiş" demeyebilir. Ayrıca "her ikisi de değiştirildi" veya bir veya iki başka şey de yazabilir. Çıktısı nedir git status?
Ryan Stewart

Bu gönderdikten sonra denemek için ekip üyesini söylüyorum git rebase --abortve git pull --rebaseöneri gereğince git ile
Christian Stewart

1

Git ile çözülmemiş dosyayı yerel olarak kaldır.

$ git rm <the unmerged file name>
$ git reset --hard
$ git pull --rebase
$ git rebase --skip
$ git pull
Already up-to-date.

Daha sonra git commit'i gönderdiğimde:

$ git commit . -m "my send commit"
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

0

Ryan Stewart'ın cevabı neredeyse oradaydı. Aslında durumda değil yerel değişiklikleri silmek istiyorsanız, birleştirme için kullanabileceğiniz bir iş akışı var:

  • Çalıştır git status. Size birleştirilmemiş dosyaların bir listesini verecektir.
  • Onları birleştirin (elle vb.)
  • Çalıştırmak git commit

Git, yalnızca birleştirmeleri yeni bir işleme koyacaktır . (Benim durumumda, diskte bu işleme eklenmemiş ek dosyalarım vardı.)

Git daha sonra birleştirmenin başarılı olduğunu düşünür ve ilerlemenize izin verir.

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.