Git neden “Birleştirilmemiş dosyalarınız olduğu için çekme mümkün değil” diyor?


197

Terminaldeki proje dizinimi çekmeye çalıştığımda aşağıdaki hatayı görüyorum:

harsukh@harsukh-desktop:~/Sites/branch1$ git pull origin master
U app/config/app.php
U app/config/database.php
U app/routes.php
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

Git neden diyor "Pull is not possible because you have unmerged files"ve nasıl çözebilirim?


1
Benim durumumda sadece bu komutları "git add." sonra "git commit -m" Test "ve sonunda" git push "Hata kaldırıldı
Akhzar Nazir

Taahhüt edilecekleri güncellemek veya geri yüklemek (çalışma dizinindeki değişiklikleri atmak için) için "$ git add <file>" ... eklemeniz yeterlidir, ardından "$ git commit" komutunu ve ardından birleştirme işlemini tamamlamak için "$ git push" komutunu eklemeniz yeterlidir.
find_X

Yardımcı olması durumunda: Sadece "git add" yapmanın farkına vardım. sonra taahhüt işe yaramadı. Tek tek dosyayı adıyla eklemek zorunda kaldım, sonra taahhüt edip çekin / ittim.
ouonomos

Yanıtlar:


215

Şu anda olan şey, daha önce birleştirmeyi denediğiniz belirli bir dosya grubunuz olması, ancak birleştirme çakışmaları oluşturmasıdır. İdeal olarak, bir birleşme çatışması olursa, bunları manuel olarak çözmeli ve değişiklikleri kullanarakgit add file.name && git commit -m "removed merge conflicts" . Şimdi, başka bir kullanıcı, söz konusu dosyaları deposunda güncelledi ve değişikliklerini ortak yukarı akış deposuna aktardı.

Öyle ki, birleştirme çakışmalarınız (muhtemelen) son taahhütten çözülmedi, bu nedenle dosyalarınız düzgün bir şekilde birleştirilmedi ve dolayısıyla dosyalar için U( unmerged) bayrağı. Şimdi, bir yaptığınızda git pull, git hatayı atıyor, çünkü dosyanın doğru bir şekilde çözülmemiş bazı sürümüne sahipsiniz.

Bu sorunu çözmek için, söz konusu birleştirme çakışmalarını çözmeniz ve bir değişiklik yapmadan önce değişiklikleri eklemeniz ve uygulamanız gerekir. git pull .

Sorunun örnek üretimi ve çözümü:

# Note: commands below in format `CUURENT_WORKING_DIRECTORY $ command params`
Desktop $ cd test

Önce depo yapısını oluşturalım

test $ mkdir repo && cd repo && git init && touch file && git add file && git commit -m "msg"
repo $ cd .. && git clone repo repo_clone && cd repo_clone
repo_clone $ echo "text2" >> file && git add file && git commit -m "msg" && cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

Şimdi repo_clone'dayız ve eğer yaparsanız git pull, çatışmalara yol açar

repo_clone $ git pull origin master
remote: Counting objects: 5, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/anshulgoyal/Desktop/test/test/repo
 * branch            master     -> FETCH_HEAD
   24d5b2e..1a1aa70  master     -> origin/master
Auto-merging file
CONFLICT (content): Merge conflict in file
Automatic merge failed; fix conflicts and then commit the result.

Klondaki çatışmaları görmezden gelirsek ve şimdi orijinal repoda daha fazla taahhütte bulunursak,

repo_clone $ cd ../repo
repo $ echo "text1" >> file && git add file && git commit -m "msg" && cd ../repo_clone

Sonra da yok git pull, biz olsun

repo_clone $ git pull
U   file
Pull is not possible because you have unmerged files.
Please, fix them up in the work tree, and then use 'git add/rm <file>'
as appropriate to mark resolution, or use 'git commit -a'.

Not fileşimdi birleştirilmemiş bir durumda ve biz yaparsak git status, biz açıkça aynı görebilirsiniz:

repo_clone $ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)

You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

        both modified:      file

Bu nedenle, bunu çözmek için önce daha önce görmezden geldiğimiz birleştirme çakışmasını çözmemiz gerekiyor

repo_clone $ vi file

ve içeriğini

text2
text1
text1

sonra ekleyin ve değişiklikleri uygulayın

repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts

1
Tamamlamak için, çatışmaları çözmek için 'git mergetool'u kullanmak için @ Pawan'ın cevabını eklerdim. İkinci-son adım çok pratik olmayabilir ("birleştirmeyi çözün ... [ayarlayarak ... ... içindekileri: [bazı metinler]").
inkar edilemezrob

Alternatif olarak, @ user261'nin tavsiyesini kullanarak birleştirebilirsiniz. Her iki durumda da, pratik anlamda nasıl birleştirileceğine dair bir adım eklemek bu cevabı tamamlayacağını düşünüyorum.
inkar edilemezrob

3
Tek bir dosyada düzeltmek için basit çakışmalarınız olduğunda bu yanıt gerçekten işe yarar. Örneğin, farklı bir veya iki kod satırı. Çok değiştirilmiş birden fazla dosyanız varsa, bu zor bir çözümdür. Ancak Git ile zor çatışmalardan kaçınmanız gerektiği fikrini evine götürüyor.
Vaughn

46

Çalışma dizininiz temiz değilken yerel şubenize bir yeni taahhüt daha eklemeye çalışıyorsunuz. Sonuç olarak Git, çekmeyi yapmayı reddediyor. Senaryoyu daha iyi görselleştirmek için aşağıdaki diyagramları göz önünde bulundurun:

uzak: A <- B <- C <- D
yerel: A <- B *
(* değiştirilmiş ancak işlenmemiş birkaç dosyanız olduğunu gösterir.)

Bu durumla başa çıkmak için iki seçenek vardır. Dosyalarınızdaki değişiklikleri atabilir veya saklayabilirsiniz.

Birinci seçenek: Değişiklikleri atın Her birleştirilmemiş dosya için
kullanabilirsiniz git checkoutveya şubenizdeki git reset --hard HEADtüm dosyaları HEAD'e sıfırlamak için kullanabilirsiniz . Bu arada, yerel şubenizdeki HEAD yıldız işareti olmadan B'dir. Bu seçeneği seçerseniz, diyagram şöyle olur:

uzak: A <- B <- C <- D
yerel: A <- B

Artık çektiğinizde, master'dan gelen değişikliklerle dalınızı hızlı ileri alabilirsiniz. Çekildikten sonra, dalınız usta gibi görünecektir:

yerel: A <- B <- C <- D

İkinci seçenek: Değişiklikleri koru Değişiklikleri
korumak istiyorsanız, önce her dosyadaki birleştirme çakışmalarını çözmek istersiniz. IDE'nizdeki her dosyayı açabilir ve aşağıdaki simgeleri arayabilirsiniz:

<<<<<<< KAFA
// kodunuzun sürümü
=======
// uzaktan kumandanın kodu
>>>>>>>

Git size iki kod sürümü sunuyor. HEAD işaretlerinin içindeki kod, geçerli yerel şubenizdeki sürümdür. Diğer sürüm uzaktan kumandadan gelen şeydir. Kodun bir sürümünü seçtikten (ve diğer kodu işaretçilerle birlikte kaldırdıktan sonra), yazarak her dosyayı hazırlama alanınıza ekleyebilirsiniz git add. Son adım, git commit -m uygun bir mesaj yazarak sonucunuzu taahhüt etmektir . Bu noktada, şemamız şöyle görünür:

uzak: A <- B <- C <- D
yerel: A <- B <- C '

Burada, sadece C 'olarak yaptığımız taahhüdü etiketledim çünkü uzaktan kumandadaki C komutundan farklı. Şimdi, çekmeye çalışırsanız hızlı olmayan bir ileri hata alırsınız. Git, dalınızdaki uzaktan kumandayı değiştiremez, çünkü hem dalınız hem de uzaktan kumandanız ortak atadan B'den ayrılmıştır. Bu noktada, çekmek isterseniz başka bir tane git mergeveya git rebaseuzaktan kumandadaki dalınızı yapabilirsiniz.

Git konusunda uzmanlık kazanmak, tek yönlü bağlantılı listeleri anlayabilmeyi ve değiştirebilmeyi gerektirir. Umarım bu açıklama Git'i kullanma konusunda doğru yönde düşünmenizi sağlar.


33

Bunun için basit bir çözüm var. Ama bunun için önce aşağıdakileri öğrenmeniz gerekecek

vimdiff

İhtilafları kaldırmak için şunu kullanabilirsiniz:

git mergetool

Yukarıdaki komut temelde, çakışan her dosya için yerel dosyayı, karışık dosyayı, uzak dosyayı (toplam 3 dosya) açar. Yerel ve uzak dosyalar yalnızca referans amaçlıdır ve bunları kullanarak karışık dosyaya nelerin dahil edileceğini (veya eklenmeyeceğini) seçebilirsiniz. Ve sadece kaydedin ve dosyadan çıkın.


2
Vimdiff'in gerekli olmadığını söyleyebilirim (WinMerge veya OSX'in yerleşik FileMerge gibi seçtiğiniz herhangi bir birleştirme / fark aracını kullanabilirsiniz). Bunu söyledikten sonra, bu @ mu'nin cevabına harika bir ektir.
inkar edilemezrob

32

Değişiklikleri birleştirmek istemiyor ve yine de yerel ayarlarınızı güncellemek istiyorsanız çalıştırın:

git reset --hard HEAD  

Bu, yerelinizi HEAD ile sıfırlayacak ve daha sonra git pull kullanarak uzaktan kumandanızı çekecektir.

Birleştirmenizi zaten yerel olarak gerçekleştirdiyseniz (ancak henüz uzaktan kumandaya itmediyseniz) ve geri almak istiyorsanız:

git reset --hard HEAD~1 

7

Yerel olarak çalıştırmak için uzak bir dalı aşağı çekmek istiyorsanız (inceleme veya test amacıyla söyleyin) ve $ git pullyerel birleştirme çakışmaları aldığınızda:

$ git checkout REMOTE-BRANCH
$ git pull  (you get local merge conflicts)
$ git reset --hard HEAD (discards local conflicts, and resets to remote branch HEAD)
$ git pull (now get remote branch updates without local conflicts)

5

Çekmeden önce yerel olarak birleştirilmesi gereken bazı dosyalarınız var. Dosyaları teslim alabilir ve ardından yerel dosyalarınızın üzerine yazmak için çekebilirsiniz.

git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master

Birleştirme, iki dosyanın içeriğini birleştirir. Şu anda yerel dosyalarınız uzak sunucudakilerden farklıdır. Birleştirme uzak sunucuda yapılmalıdır. Dolayısıyla, düzenlenmiş dosyalarınızı aşamalandırır ve aktarırsanız, değişiklikleriniz depodaki dosyalara eklenir. Ardından dosyalarınız senkronize olur ve tüm projeyi diğer değişikliklerle çekebilirsiniz. Git'i kullanmaya başladığımda git yardım kitabını çok yararlı buldum. Burada bulabilirsiniz: git-scm.com/book/en/Getting-Started
Nick

Ben OP olmadığımı unutmayın. "Dosyaların birleştirilmesi" uygunsuz terminolojidir. Kesin olarak, dosyaları değil, taahhütleri birleştirirsiniz.
jub0bs

Ah evet bu doğru, özür dilerim. Basit bir cevap vermeye çalışıyordum
Nick

Bir taahhüdü birleştirirken çakışmalarınız varsa, evet, çakışan, birleştirilmemiş dosyalarınız olacak ve bunları birleştirmeniz gerekecek.
Edward Thomson

3

Takip edilecek adımlar :

step-1 : git reset --hard HEAD  (if you want to reset it to head)
step-2 : git checkout Master 
step-3 : git branch -D <branch Name>
(Remote Branch name where you want to get pull) 
step-4 : git checkout <branch name>
step-5 : git pull. (now you will not get any
error)

Teşekkürler Sarbasish


2

Benimle aynı sorun vardı
Benim durumumda, adımlar aşağıdaki gibidir-

  1. U (birleştirilmemiş) simgesiyle başlayan tüm dosyalar kaldırıldı . gibi-

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. Master'dan kod çekin

$ git pull origin master
  1. Durum kontrol edildi

 $ git status

Görünen
ve sırasıyla 2 ve 1 farklı taahhüde sahip olan mesaj . Birleştirilmemiş yollarınız var.
(use "git pull" to merge the remote branch into yours)

(fix conflicts and run "git commit")

Birleştirilmemiş yollar:
(çözünürlüğü işaretlemek için "git add ..." kullanın)

both modified:   project/app/pages/file1/file.ts
both modified:   project/www/assets/file1/file-name.html
  1. Tüm yeni değişiklikler eklendi -

    $ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
  1. Değişiklikler

$ git commit -am "resolved conflict of the app."
  1. Kodu zorladı -

$ git push origin master

Hangi dönüş bu görüntü ile çözülebilir - resim açıklamasını buraya girin


1

Birleştirme çakışması oluştuğunda, tek tek dosyayı açabilirsiniz. "<<<<<<< veya >>>>>>>" sembolleri alacaksınız. Bunlar değişikliklerinizi ve uzaktan kumandadaki değişiklikleri ifade eder. Gereken parçayı elle düzenleyebilirsiniz. Bundan sonra dosyayı kaydedin ve yapın: git add

Birleştirme çakışmaları çözülecektir.


-1

Bu komutu çalıştırın:

git reset --hard

3
Komutun ne yaptığını açıklamalısınız, çünkü bazı insanlar mevcut tüm yerel değişikliklerini sildiğini öğrenirlerse çok hayal kırıklığına uğrayacaklar: /
Joseph Budin

Bu, değişikliklerinizi harici bir geçici kaynağa kopyalarsanız çalışır. Mükemmel bir proje için yapılandırma dosyaları gibi yalnızca birkaç dosyanız varsa. Komutu yerine getirin ve ardından değişikliklerinizi geri alın. Benim için çalışıyor!
cwiggo
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.