Dlaczego git mówi „Pull nie jest możliwe, ponieważ masz nie scalone pliki”?

195

Podczas próby pobrania katalogu projektu w terminalu pojawia się następujący błąd:

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'.

Dlaczego git mówi "Pull is not possible because you have unmerged files"i jak mogę to rozwiązać?

Harsukh Makwana
źródło
1
W moim przypadku po prostu użyłem tych poleceń „git add”. potem „git commit -m” Test ”, a na końcu„ git push ”Błąd usunięty
Akhzar Nazir
Musisz po prostu dodać „$ git add <file>” ... aby zaktualizować to, co zostanie zatwierdzone lub przywrócić (aby odrzucić zmiany w katalogu roboczym), a następnie zatwierdzić „$ git commit”, a następnie „$ git push”, aby zakończyć scalanie.
find_X
Na wypadek, gdyby to pomogło: zauważyłem, że po prostu robię „git add”. wtedy zatwierdzanie nie działało. Musiałem dodać indywidualny plik według nazwy, a następnie zatwierdzić i pociągnąć / nacisnąć.
ouonomos

Odpowiedzi:

212

Obecnie dzieje się tak, że masz pewien zestaw plików, które próbowałeś scalić wcześniej, ale powodowały one konflikty scalania. Idealnie, jeśli ktoś dostanie konflikt scalania, powinien rozwiązać go ręcznie i zatwierdzić zmiany za pomocą git add file.name && git commit -m "removed merge conflicts". Teraz inny użytkownik zaktualizował pliki w swoim repozytorium i przekazał swoje zmiany do wspólnego repozytorium nadrzędnego.

Zdarza się, że twoje konflikty scalania z (prawdopodobnie) ostatniego zatwierdzenia nie zostały rozwiązane, więc twoje pliki nie są scalone w porządku, a zatem flaga U( unmerged) dla plików. Więc teraz, kiedy to zrobisz git pull, git wyrzuca błąd, ponieważ masz pewną wersję pliku, która nie została poprawnie rozwiązana.

Aby rozwiązać ten problem, musisz rozwiązać sporne konflikty scalania oraz dodać i zatwierdzić zmiany, zanim będziesz mógł to zrobić git pull.

Przykładowa reprodukcja i rozwiązanie problemu:

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

Najpierw stwórzmy strukturę repozytorium

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

Teraz jesteśmy w repo_clone, a jeśli to zrobisz git pull, spowoduje to konflikty

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.

Jeśli zignorujemy konflikty w klonie i dokonamy teraz większej liczby zatwierdzeń w oryginalnym repo,

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

A potem robimy git pull, rozumiemy

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'.

Zauważ, że fileteraz jest w stanie nie połączonym, a jeśli to zrobimy git status, możemy wyraźnie zobaczyć to samo:

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

Aby rozwiązać ten problem, musimy najpierw rozwiązać konflikt scalania, który wcześniej zignorowaliśmy

repo_clone $ vi file

i ustaw jego zawartość na

text2
text1
text1

a następnie dodaj go i zatwierdź zmiany

repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts
mu 無
źródło
1
Aby zakończyć, dodam odpowiedź @ Pawana, by użyć „git scaletool” do rozwiązywania konfliktów. Przedostatni krok może nie być zbyt praktyczny („rozstrzygnij scalenie ... [ustawiając] ... jego zawartość na: [jakiś tekst]”).
undeniablyrob
Alternatywnie możesz połączyć korzystając z porady @ user261. Tak czy inaczej, myślę, że dodanie kroku, w jaki sposób połączyć w sensie praktycznym, uzupełniłoby tę odpowiedź.
undeniablyrob
3
Ta odpowiedź działa naprawdę dobrze, gdy masz proste konflikty do usunięcia na pojedynczych plikach. Na przykład jeden lub dwa wiersze kodu, które są różne. Jeśli masz wiele plików, które zostały mocno zmodyfikowane, jest to trudna poprawka. Powoduje to jednak pomysł, że z Git powinieneś często angażować się w unikanie trudnych konfliktów.
Vaughn D. Taylor
46

Próbujesz dodać jeszcze jedno zatwierdzenie do lokalnego oddziału, podczas gdy katalog roboczy nie jest czysty. W rezultacie Git odmawia wykonania tej czynności. Rozważ następujące diagramy, aby lepiej zobrazować scenariusz:

zdalny: A <- B <- C <- D
lokalny: A <- B *
(* oznacza, że ​​masz kilka plików, które zostały zmodyfikowane, ale nie zostały zatwierdzone).

Istnieją dwie opcje radzenia sobie z tą sytuacją. Możesz albo odrzucić zmiany w swoich plikach, albo je zachować.

Opcja pierwsza: Wyrzuć zmiany
Możesz użyć albo git checkoutdla każdego nie połączonego pliku, albo możesz użyć, git reset --hard HEADaby zresetować wszystkie pliki w oddziale do HEAD. Nawiasem mówiąc, HEAD w twoim lokalnym oddziale to B, bez gwiazdki. Jeśli wybierzesz tę opcję, schemat stanie się:

zdalne: A <- B <- C <- D
lokalne: A <- B

Teraz, gdy pociągniesz, możesz szybko przewinąć gałąź ze zmianami od mistrza. Po wyciągnięciu gałąź wyglądałaby jak master:

lokalne: A <- B <- C <- D

Opcja druga:
zachowaj zmiany Jeśli chcesz zachować zmiany, najpierw musisz rozwiązać wszelkie konflikty scalania w każdym z plików. Możesz otworzyć każdy plik w swoim IDE i poszukać następujących symboli:

<<<<<<< HEAD
// twoja wersja kodu
=======
// wersja kodu
pilota >>>>>>>

Git przedstawia dwie wersje kodu. Kod zawarty w znacznikach HEAD to wersja z bieżącego oddziału lokalnego. Druga wersja pochodzi z pilota. Po wybraniu wersji kodu (i usunięciu drugiego kodu wraz ze znacznikami) możesz dodać każdy plik do obszaru testowego, pisząc git add. Ostatnim krokiem jest zatwierdzenie wyniku przez wpisanie git commit -m odpowiedniego komunikatu. W tym momencie nasz schemat wygląda następująco:

zdalne: A <- B <- C <- D
lokalnie: A <- B <- C '

Tutaj oznaczyłem zatwierdzenie, które właśnie wykonaliśmy, jako C ', ponieważ różni się od zatwierdzenia C na pilocie. Teraz, jeśli spróbujesz pociągnąć, pojawi się błąd szybkiego przewijania. Git nie może odtworzyć zmian w pilocie na gałęzi, ponieważ zarówno gałąź, jak i pilot odeszły od wspólnego zatwierdzenia B wspólnego przodka. W tym momencie, jeśli chcesz wyciągnąć, możesz wykonać inną git mergealbo git rebasegałąź na pilocie.

Opanowanie Git wymaga umiejętności zrozumienia i manipulowania jednokierunkowymi połączonymi listami. Mam nadzieję, że to wyjaśnienie sprawi, że zaczniesz myśleć we właściwym kierunku o korzystaniu z Git.

Tim Biegeleisen
źródło
33

Istnieje proste rozwiązanie tego problemu. Ale w tym celu musisz najpierw nauczyć się następujących

vimdiff

Aby usunąć konflikty, możesz użyć

git mergetool

Powyższe polecenie zasadniczo otwiera plik lokalny, plik mieszany, plik zdalny (łącznie 3 pliki) dla każdego pliku będącego w konflikcie. Pliki lokalne i zdalne są tylko w celach informacyjnych, a korzystając z nich możesz wybrać, co chcesz dołączyć (lub nie) do pliku mieszanego. Po prostu zapisz i zamknij plik.

Pawan Seerwani
źródło
2
Powiedziałbym, że vimdiff nie jest wymagany (możesz użyć dowolnego narzędzia do scalania / porównywania , takiego jak WinMerge lub wbudowanego FileMerge OSX itp.). To powiedziawszy, to świetny dodatek do odpowiedzi @ mu.
undeniablyrob
32

Jeśli nie chcesz scalić zmian i nadal chcesz zaktualizować swój lokalny, uruchom:

git reset --hard HEAD  

Spowoduje to zresetowanie lokalnego za pomocą HEAD, a następnie pociągnięcie pilota za pomocą git pull.

Jeśli scalenie zostało już zatwierdzone lokalnie (ale nie zostało jeszcze przekazane zdalnie), a także chcesz je przywrócić:

git reset --hard HEAD~1 
Santosh
źródło
6

Jeśli chcesz ściągnąć zdalną gałąź, aby działała lokalnie (powiedzmy do celów przeglądu lub testowania), a gdy $ git pullpojawią się lokalne konflikty scalania:

$ 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)
użytkownik5245397
źródło
5

Masz lokalnie niektóre pliki, które należy scalić, zanim będzie można je pobrać. Możesz pobrać pliki, a następnie pociągnąć, aby zastąpić pliki lokalne.

git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master
Nacięcie
źródło
Scalanie łączy zawartość dwóch plików. Obecnie twoje lokalne pliki różnią się od plików na zdalnym serwerze. Scalanie musi być wykonane na zdalnym serwerze. Jeśli więc wyedytujesz edytowane pliki i wypchniesz je, zmiany zostaną dodane do plików w repozytorium. Następnie Twoje pliki będą zsynchronizowane i możesz pobrać cały projekt z innymi zmianami. Uważam, że książka pomocy git była bardzo pomocna, kiedy zacząłem używać git. Można go znaleźć tutaj: git-scm.com/book/en/Getting-Started
Nick
Pamiętaj, że nie jestem OP. „Scalanie plików” to niewłaściwa terminologia. Ściśle mówiąc, scalasz zatwierdzenia, a nie pliki.
jub0bs
Ach tak, to prawda, moje apoligie. Próbowałem udzielić prostej odpowiedzi
Nick
Cóż, jeśli masz konflikty podczas scalania zatwierdzenia, to tak, będziesz mieć sprzeczne, nie scalone pliki i będziesz musiał je scalić.
Edward Thomson
3

Kroki do naśladowania :

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)

Dzięki, Sarbasish

Sarbasish Mishra
źródło
2

Wystąpił ze mną ten sam problem.
W moim przypadku kroki są następujące:

  1. Usunięto cały plik, który zaczynał się od symbolu U (nie połączonego) . tak jak-

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. Wyciągnij kod z mistrza

$ git pull origin master
  1. Sprawdzono status

 $ git status

Oto komunikat, który się pojawił -
i każdy ma 2 i 1 inny zatwierdzenie. Masz nieuziemione ścieżki.
(use "git pull" to merge the remote branch into yours)

(fix conflicts and run "git commit")

Nie scalone ścieżki:
(użyj „git add ...”, aby zaznaczyć rozdzielczość)

both modified:   project/app/pages/file1/file.ts
both modified:   project/www/assets/file1/file-name.html
  1. Dodano wszystkie nowe zmiany -

    $ git add project/app/pages/file1/file.ts
project/www/assets/file1/file-name.html
  1. Zatwierdź zmiany na głowie

$ git commit -am "resolved conflict of the app."
  1. Przekazałem kod -

$ git push origin master

Która kolej może rozwiązać problem z tym obrazem - wprowadź opis zdjęcia tutaj

S.Yadav
źródło
1

W przypadku wystąpienia konfliktu scalania można otworzyć pojedynczy plik. Otrzymasz symbole „<<<<<<< lub >>>>>>>”. Odnoszą się one do twoich zmian i zmian obecnych na pilocie. Możesz ręcznie edytować wymaganą część. następnie zapisz plik, a następnie wykonaj: git add

Konflikty scalania zostaną rozwiązane.

dfordevy
źródło
-1

Po prostu uruchom to polecenie:

git reset --hard
Grace Green
źródło
3
Powinieneś wyjaśnić, co robi polecenie, ponieważ niektórzy ludzie będą bardzo rozczarowani, jeśli spróbują dowiedzieć się, że usunęli wszystkie bieżące zmiany lokalne: /
Joseph Budin
Działa to, jeśli po prostu skopiujesz zmiany do zewnętrznego tymczasowego źródła .. jeśli masz tylko kilka plików, na przykład pliki konfiguracyjne dla projektu, jest idealny. Wykonaj polecenie, a następnie cofnij zmiany. Pracuje dla mnie!
cwiggo