Jak zakończyć scalanie po rozwiązaniu moich konfliktów scalania?


282

Przeczytałem sekcję Podstawowe rozgałęzianie i scalanie w Git Community Book.

Więc śledzę je i utworzyć jeden oddział: experimental.

Potem ja:

  1. przejdź do gałęzi eksperymentalnej (git Checkout eksperymentalna)
  2. dokonać wielu zmian
  3. commit it (git commit -a)
  4. przejdź do gałęzi master (git checkout master)
  5. wprowadź zmiany i zatwierdź je
  6. przełącz się z powrotem na eksperymentalny (git Checkout eksperymentalny)
  7. scal master master do eksperymentalnego (git merge master)
  8. są pewne konflikty, ale po ich rozwiązaniu „dodałem mój plik”

  9. A teraz utknąłem, nie mogę wrócić do mistrza

kiedy robię

 $ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

i zrobiłem:

$ git rebase --abort

Nie trwa proces naliczania?

i zrobiłem :

$  git add res/layout/socialhub_list_item.xml
$ git checkout master
error: Entry 'res/layout/my_item.xml' would be overwritten by merge. Cannot merge.

Co mogę zrobić, aby móc wrócić do głównej gałęzi?


Po naprawieniu konfliktu dokonam dodania, a następnie spróbuję wykonać zatwierdzenie git commit gf2n.cpp -m "Hand merge gf2n.cpp due to conflicts", spowoduje to fatal: cannot do a partial commit during a merge.. I oczywiście „częściowe zatwierdzenia” nie wydają się być dokumentowane ani omawiane nigdzie na stronach git man. Wykonanie git mergepoprawki po zakończeniu powoduje, Please, commit your changes before you can merge.że narzędzie What a broken ass ...
jww

2
git commit z wyraźnymi ścieżkami jest udokumentowany na stronie podręcznika w OPISIE jako „3”. przez wyświetlenie listy plików jako argumentów dla komendy commit, w którym to przypadku zatwierdzenie zignoruje zmiany wprowadzone w indeksie i zamiast tego zapisze aktualną zawartość wymienionych plików (które muszą być już znane Gitowi); "oraz również w '- -only ". Jestem prawie pewien, że wiadomość o scaleniu została napisana przez kogoś, kto założył, że przeczytasz, jak działa polecenie commit, i może rozpoznać znaczenie słowa„ częściowy ”w tym opisie, jeśli nie już, to przynajmniej jeszcze raz i ostrożniej. @jww
jthill

1
Dlaczego więc to studium przypadku zasługuje na uważną lekturę dla zrozumienia, skoro strony podręcznika nie? @jww
jthill

1
Cóż, używanie git wyraźnie wymaga lepszego czytania ze zrozumieniem, niż jesteś przygotowany do przyswojenia. Być może jestem nawet bardziej niepewny, czy to wina git, niż jesteś tego pewien.
jthill

1
Z Git 2.12 (Q1 2017), wkrótce po prostu zrobisz git merge --continue. Zobacz moją odpowiedź poniżej
VonC

Odpowiedzi:


267

Jeśli podczas łączenia występuje konflikt, musisz zakończyć zatwierdzanie scalania ręcznie. Wygląda na to, że wykonałeś dwa pierwsze kroki, aby edytować konflikt plików, a następnie uruchomić git addje, aby oznaczyć je jako rozwiązane. Na koniec musisz wykonać scalenie git commit. W tym momencie będziesz mógł ponownie przełączać gałęzie.


Jeśli użyjesz polecenia „git gui &” do wykonania zatwierdzenia - możesz nie zdawać sobie sprawy, że stan twojego oddziału przestał się „scalać”. Pomoc w uzyskaniu statusu „git” jest pomocna, aby upewnić się, że status oddziału jest prawidłowy.
Tony Ashworth,

4
Spróbuj git commit -am "your commit message"wykonać dodawanie i zatwierdzanie jednocześnie.
vaheeds

3
git commitdziała. I najlepiej go użyć, aby wypełnić domyślną wiadomość zatwierdzenia scalania.
Unikam

1
Spróbować git push.
alper

Sytuację tę dostałem w poniższym scenariuszu -> połączyłem gałąź X z gałęzią Y. Potem zdałem sobie sprawę, że zrobiłem coś złego w gałęzi Y, więc to naprawiłem, a następnie „poprawiam” moje zmiany w gałęzi Y. Z powodu zmiany git nie utworzył nowego zatwierdzenia. Więc kiedy połączyłem gałąź X ze zaktualizowaną gałęzią Y, wywołało to konflikt. BTW dziękuję za tę odpowiedź.
doga 13.03.18

157

Jak zakończyć scalanie po rozwiązaniu moich konfliktów scalania?

Dzięki Git 2.12 (Q1 2017) będziesz miał bardziej naturalne polecenia:

git merge --continue

Zobacz commit c7d227d (15 grudnia 2016 r.) Autor: Jeff King ( peff) .
Zobacz zatwierdzenie 042e290 , zatwierdzenie c261a87 , zatwierdzenie 367ff69 (14 grudnia 2016 r.) Autor: Chris Packham ( cpackham) .
(Połączone przez Junio ​​C Hamano - gitster- w commit 05f6e1b , 27 grudnia 2016)

Zobacz informacje o wersji 2.12 .

merge: dodaj --continueopcję „ ” jako synonim „ git commit

Teach „ git mergezwany dalej” --continueopcja, która pozwala na „stałe” scalanie wypełniając go.
Tradycyjnym sposobem wykonania scalenia po rozwiązaniu konfliktu jest użycie ' git commit'.
Teraz z poleceniami takimi jak „ git rebase” i „ git cherry-pick” posiadającymi --continueopcję „dodanie” takiej opcji do „ git merge” przedstawia spójny interfejs użytkownika.


Przygotowywałem się do skomentowania tego, jak ostatnio został on dodany w 2.12 w I kwartale 2017 r., Ale potem ponownie przeczytałem pierwszy wiersz Twojej odpowiedzi. Nic dziwnego, że nie znaleziono dla mnie opcji w wersji 2.10!
cjsimon

1
Próbowałem git merge - kontynuuj, a Git Bash nie był w stanie rozpoznać tego jako polecenia. Ale zadziałało git commit -m „Commit message”
Mimi

2
@Mimi OK, ale używasz Git 2.12 lub więcej?
VonC

@VonC masz rację, używam starszej wersji Git!
Mimi

23

Na wypadek, gdybyś utknął podczas łączenia / rebase, zawsze możesz

git reset --hard

aby przywrócić pracę do stanu ostatniego zatwierdzenia. Spowoduje to utratę zmian w działającym drzewie, więc jeśli miałeś lokalne modyfikacje przed scaleniem, znikną one po tym - dlatego wskazane jest, aby nie rozpoczynać scalania, gdy masz lokalne modyfikacje. :)


16
obowiązkowe ostrzeżenie: git reset --hardodrzuca niezaangażowane zmiany
Geoffrey Hale

2
Dlaczego nie tylko git merge --abort, który nie ma ryzyka utraty niczego?
Alexander George


11

Ilekroć łączysz dwie gałęzie za pomocą polecenia git merge brancha branchb, istnieją dwie możliwości:

  1. Do jednej gałęzi (powiedzmy gałęzi) można dotrzeć do drugiej gałęzi (powiedzmy gałęzi b), śledząc historię zatwierdzeń. W tym przypadku git po prostu szybko przewiń do przodu, aby wskazać najnowszą gałąź (w tym przypadku gałąź b).

    2. Ale jeśli dwie gałęzie rozeszły się w jakimś starszym punkcie, git tworzy nową migawkę i dodaje nowe zatwierdzenie, które wskazuje na nią. Jeśli więc nie ma konfliktu między łączonymi gałęziami, git płynnie tworzy nowe zatwierdzenie.

Uruchom, git logaby zobaczyć zatwierdzenie po scaleniu dwóch niespójnych gałęzi.

Teraz wracam do interesującego przypadku, w którym występują konflikty scalania między łączącymi się gałęziami. Cytuję to na stronie https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

Git nie utworzył automatycznie nowego zatwierdzenia scalania. Wstrzymał proces podczas rozwiązywania konfliktu. Jeśli chcesz zobaczyć, które pliki zostaną rozmontowane w dowolnym momencie po konflikcie scalania, możesz uruchomićgit status


Więc w przypadku konfliktów scalania, musisz rozwiązać konflikt, a następnie dodać zmiany, które wprowadziłeś do obszaru pomostowego za pomocą, git add filenamea następnie zatwierdzić zmiany za pomocą polecenia, git commit które zostało wstrzymane przez git z powodu konfliktu. Mam nadzieję, że to wyjaśnia pytanie. Odwiedź także powyższy link, aby uzyskać szczegółowe informacje. W przypadku jakichkolwiek pytań prosimy o komentarz poniżej, chętnie pomogę.


7

Kolejne kroki po ręcznym rozwiązaniu konfliktów to: -

  1. git add.
  2. status git (pokaże to, które polecenia są konieczne, aby kontynuować procedurę automatycznego scalania)
  3. [polecenie git wskazuje, na przykład git merge --continue, git cherry-pick --continue, git rebase --continue]

16
Nie ma git merge
Hola Soy Edu Feliz Navidad

@HolaSoyEduFelizNavidad To jest nieprawidłowe. Zie git poniżej po konflikcie: - error: Failed to merge in the changes. Patch failed at 0001 ADD: _type to styleguide The copy of the patch that failed is found in: .git/rebase-apply/patch When you have resolved this problem, run "git rebase --continue". If you prefer to skip this patch, run "git rebase --skip" instead. To check out the original branch and stop rebasing, run "git rebase --abort".
Timidfriendly

5
Jest rebase - kontynuuj, nie scalaj
Hola Soy Edu Feliz Navidad

git merge --continue, co właśnie próbuję zrobić, skutkuje error: unknown option 'continue'. Jestem pewien, że twoja odpowiedź jest zła, ponieważ git-mergestrona podręcznika nie zawiera jej. Jakiej wersji Git używasz? Używam git version 1.8.5.2 (Apple Git-48). Próbowałem także z MacPorts git version 2.9.3.
jww

1
W przypadku git 2.10 dla prostego scalenia polecenie jest po prostu staregit commit
Chris Charabaruk

2

Konflikt scalania występuje, gdy dwie gałęzie, które próbujesz scalić, zmieniły tę samą część tego samego pliku. Możesz wygenerować listę konfliktów z git status.

Gdy napotkamy konfliktową linię, Git edytuje zawartość dotkniętych plików za pomocą wskaźników wizualnych, które oznaczają obie strony sprzecznej treści.

<<<<<<< HEAD
conflicted text from HEAD
=======
conflicted text from merging_branch
>>>>>>> merging_branch

Gdy naprawisz skonfliktowane pliki i będziesz gotowy do scalenia, wystarczy uruchomić git addi git commitwygenerować zatwierdzenie scalania. Po dokonaniu zatwierdzenia git pushzmiany w gałęzi.

Artykuł referencyjny: Git merge .


2

Po dodaniu wszystkich plików następnym krokiem jest „ git commit ”.

„git status” zasugeruje, co należy zrobić: pliki jeszcze do dodania są wymienione na dole, a gdy wszystkie zostaną wykonane, zasugeruje zatwierdzenie u góry, gdzie wyjaśnia stan scalenia bieżącej gałęzi.


1

Pierwszą rzeczą, którą chcę wyjaśnić, jest to, że nazwy gałęzi są tylko aliasem dla konkretnego zatwierdzenia. zatwierdzenie jest tym, co działa git, kiedy ciągniesz, pchasz scalanie i tak dalej. Każde zatwierdzenie ma unikalny identyfikator.

Kiedy wykonujesz $ git merge, git próbuje szybko przewinąć bieżącą gałąź do zatwierdzenia, do którego odwołuje się gałąź (innymi słowy, obie nazwy gałęzi wskazują na to samo zatwierdzenie.) Ten scenariusz jest najłatwiejszy dla git do czynienia, ponieważ nie ma nowego zatwierdzenia. Pomyśl o mistrzu wskakującym na lilipada, na którym odpoczywa twoja gałąź. Możliwe jest ustawienie flagi --no-ff, w którym to przypadku git utworzy nowe zatwierdzenie, niezależnie od tego, czy wystąpiły konflikty kodu.

W sytuacji, gdy występują konflikty kodu między dwiema gałęziami, które próbujesz scalić (zwykle dwie gałęzie, których historia zatwierdzeń ma wspólne zatwierdzenie w przeszłości), szybkie przewijanie do przodu nie działa. git może nadal być w stanie automatycznie scalać pliki, o ile ta sama linia nie została zmieniona przez obie gałęzie w pliku powodującym konflikt. w takim przypadku git połączy dla ciebie pliki powodujące konflikt i automatycznie je zatwierdzi. Możesz zobaczyć podgląd działania git, wykonując $ git diff --cached. Możesz też przekazać flagę --no-commit do polecenia scalania, co spowoduje pozostawienie zmodyfikowanych plików w indeksie, które musisz dodać i zatwierdzić. Ale możesz $ git różnicować te pliki, aby sprawdzić, co zmieni scalanie.

Trzeci scenariusz dotyczy konfliktów, których git nie może automatycznie rozwiązać. W takim przypadku musisz je ręcznie scalić. Moim zdaniem jest to najłatwiejsze do wykonania ze scaleniem, takim jak scalenie araxis lub p4merge (za darmo). Tak czy inaczej, musisz wykonać każdy plik jeden po drugim. Jeśli scalanie wydaje się być zablokowane, użyj $ git merge - kontynuuj, aby przesuwać go dalej. Git powinien powiedzieć ci, czy nie może kontynuować, a jeśli tak, to dlaczego nie. Jeśli w pewnym momencie poczujesz, że scaliłeś scalenie, możesz wykonać $ git merge --abort, a wszelkie scalenia zostaną cofnięte i możesz zacząć od nowa. Po zakończeniu każdy scalony plik będzie plikiem zmodyfikowanym, który należy dodać i zatwierdzić. Możesz sprawdzić, gdzie znajdują się pliki ze statusem $ git. Jeśli scalone pliki nie zostały jeszcze zatwierdzone. Musisz to zrobić, aby zakończyć scalanie.


0

Może być późno Dzieje się tak, ponieważ twoja git HEAD nie została zaktualizowana. to pochwała rozwiązałoby to git reset HEAD.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.