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