Dlaczego git mówi: "Ściąganie nie jest możliwe, ponieważ masz niezapisane pliki"?

Kiedy próbuję pobrać katalog projektu w terminalu, widzę 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ć?

Author: mu 無, 2014-10-15

9 answers

Obecnie dzieje się tak, że masz pewien zestaw plików, które próbowałeś połączyć wcześniej, ale wywołały konflikty scalania. Najlepiej, jeśli dojdzie do konfliktu scalania, powinien on rozwiązać je ręcznie i zatwierdzić zmiany za pomocą git add file.name && git commit -m "removed merge conflicts". Teraz inny użytkownik zaktualizował dane pliki w swoim repozytorium i wprowadził zmiany do wspólnego repo.

Tak się składa, że Twoje konflikty scalające z (prawdopodobnie) ostatniego commita nie zostały rozwiązane, więc Twoje pliki nie są scalane w porządku, a zatem U(unmerged) Flaga dla plików. Więc teraz, kiedy robisz git pull, git wyrzuca błąd, ponieważ masz jakąś wersję pliku, która nie jest poprawnie rozwiązana.

Aby rozwiązać ten problem, musisz rozwiązać konflikty scalania, o których mowa, oraz dodać I zatwierdzić zmiany, zanim będziesz mógł wykonać git pull.

Przykładowe odtworzenie i rozwiązanie problemu:

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

Najpierw stwórzmy repozytorium struktura

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 zrobisz git pull, będzie to wywoływać 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 zrobimy więcej commitów 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, otrzymujemy

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 file jest teraz w stanie niezaangażowanym i jeśli 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

Więc, aby rozwiązać ten problem, musimy najpierw rozwiązać konflikt scalania, który zignorowaliśmy wcześniej

repo_clone $ vi file

I ustaw jego zawartość na

text2
text1
text1

A następnie dodać go i zatwierdzić zmiany

repo_clone $ git add file && git commit -m "resolved merge conflicts"
[master 39c3ba1] resolved merge conflicts
 145
Author: mu 無,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-29 03:07:36

Próbujesz dodać jeszcze jeden nowy commit do lokalnej gałęzi, podczas gdy twój katalog roboczy nie jest czysty. W rezultacie, Git odmawia wykonania pull. Rozważ poniższe diagramy, aby lepiej zobrazować scenariusz:

Zdalne: A
local: A
(*oznacza, że masz kilka plików, które zostały zmodyfikowane, ale nie zostały zatwierdzone.)

Istnieją dwie możliwości rozwiązania tej sytuacji. Możesz albo odrzuć zmiany w plikach, albo zachowaj je.

Opcja pierwsza: wyrzuć zmiany
Możesz użyć git checkout dla każdego niezmergowanego pliku, lub możesz użyć git reset --hard HEAD aby zresetować wszystkie pliki w gałęzi do HEAD. Nawiasem mówiąc, głowa w lokalnym oddziale jest B, bez gwiazdki. Jeśli wybierzesz tę opcję, schemat stanie się:

Zdalne: A
local: A

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

Local: A

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 IDE i szukać następujących symboli:

// Twoja wersja kodu
=======
// the zdalna wersja kodu
>>>>>>>

Git prezentuje dwie wersje kodu. Kod zawarty w znacznikach HEAD jest wersją z Twojej bieżącej lokalnej gałęzi. Druga wersja jest tym, co pochodzi z pilota. Po wybraniu wersji kodu (i usunięciu drugiego kodu wraz ze znacznikami), możesz dodać każdy plik do swojego miejsca postoju, wpisując git add. Ostatnim krokiem jest zatwierdzenie wyniku przez wpisanie git commit -m z odpowiednim wiadomość. W tym momencie nasz diagram wygląda tak:

Zdalne: A
local: A

Tutaj oznaczyłem commit, który właśnie zrobiliśmy jako C', ponieważ różni się on od commita C na pilocie. Teraz, jeśli spróbujesz pociągnąć, otrzymasz błąd nie przewijania do przodu. Git nie może odtworzyć zmian w zdalnym w Twojej gałęzi, ponieważ zarówno twoja gałąź, jak i zdalny odbiegają od wspólnego commita przodka B. W tym momencie, jeśli chcesz pociągnąć, możesz wykonać inną git merge, lub git rebase swoją gałąź na pilocie.

Opanowanie Gita wymaga zrozumienia i manipulacji jednokierunkowymi listami. Mam nadzieję, że to Wyjaśnienie sprawi, że pomyślisz we właściwym kierunku o używaniu Gita.

 32
Author: Tim Biegeleisen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-01 11:36:49

Jest na to proste rozwiązanie. Ale w tym celu musisz najpierw nauczyć się następujących

vimdiff

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

git mergetool

Powyższe polecenie otwiera plik lokalny, plik mieszany, plik zdalny (w sumie 3 pliki) dla każdego skonfliktowanego pliku. Pliki lokalne i zdalne są tylko w celach informacyjnych, a za ich pomocą możesz wybrać, co ma zawierać (lub nie) w mieszanym pliku. I po prostu zapisz i zamknij plik.

 20
Author: Pawan Seerwani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-03 19:04:08

Masz kilka plików lokalnie, które muszą zostać połączone, zanim będziesz mógł je wyciągnąć. Możesz pobrać pliki, a następnie przeciągnąć, aby zastąpić pliki lokalne.

git checkout app/config/app.php app/config/database.php app/routes.php
git pull origin master
 5
Author: Nick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-29 13:08:12

Jeśli chcesz ściągnąć zdalną gałąź, aby działać lokalnie (np. w celach przeglądania lub testowania), a kiedy $ git pull pojawią się lokalne konflikty merge:

$ 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)
 3
Author: user5245397,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-03 16:25:44

Jeśli nie chcesz scalić zmian i nadal chcesz zaktualizować swój lokalny, przejdź do polecenia.

git reset HEAD —hard

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

 1
Author: Santosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-11 12:51:06

W przypadku wystąpienia konfliktu scalania można otworzyć pojedynczy plik. Dostaniesz " > > > > > " symbole. Odnoszą się one do Twoich zmian i zmian obecnych na zdalnym. Można ręcznie edytować wymaganą część. następnie zapisz plik, a następnie wykonaj : git add

Konflikty scalania zostaną rozwiązane.

 0
Author: dfordevy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-11 09:44:58

Był ten sam problem ze mną
W moim przypadku kroki są jak poniżej -

  1. usunięto wszystkie pliki, które zaczynały się od U (unmerged) symbol. as -

U   project/app/pages/file1/file.ts
U   project/www/assets/file1/file-name.html
  1. ściągnij kod z master

$ git pull origin master
  1. sprawdzone dla statusu

 $ git status

Oto wiadomość, która się pojawiła -
i mają odpowiednio 2 i 1 Inny commit.
(use "git pull" to merge the remote branch into yours)
Masz unmerged / align = "left" /
(fix conflicts and run "git commit")

Unmerged paths:
(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. Commit changes on head-

$ git commit -am "resolved conflict of the app."
  1. popchnął kod-

$ git push origin master

Który obrót może rozwiązać problem z tym obrazem - Tutaj wpisz opis obrazka

 0
Author: S.Yadav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-10 07:30:13

Po prostu uruchom to polecenie:

git reset --hard
 -1
Author: Grace Green,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-14 14:11:00