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

Przeczytałem podstawowe rozgałęzianie i scalanie część Podręcznika społeczności Gita.

Więc podążam za nim i tworzę jedną gałąź: experimental.

Potem Ja:

  1. switch to experimental branch (git checkout experimental)
  2. dokonaj kilku zmian
  3. commit it (git commit-a)
  4. switch to master branch (Git checkOut master)
  5. wprowadzić pewne zmiany i zatwierdzić tam
  6. switch back to experimental (Git checkout experimental)
  7. merge Master zmiana na experimental (git merge master)
  8. Istnieją pewne konflikty, ale po ich rozwiązaniu zrobiłem 'git add myfile'

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

When I do

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

I zrobiłem:

$ git rebase --abort

Brak rebase w toku?

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ć, abym mógł wrócić do mojej gałęzi mistrza?

 197
Author: Vadim Kotov, 2010-03-19

9 answers

Gdy dojdzie do konfliktu podczas scalania, musisz zakończyć commit scalający ręcznie. Wygląda na to, że wykonałeś dwa pierwsze kroki, aby edytować pliki, które były skonfliktowane, a następnie uruchomić git add na nich, aby oznaczyć je jako rozwiązane. Na koniec musisz zatwierdzić połączenie za pomocą git commit. W tym momencie będziesz mógł ponownie przełączać gałęzie.

 198
Author: Jimmy Cuadra,
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
2010-03-18 23:52:38

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

W Git 2.12 (Q1 2017), będziesz miał bardziej naturalne polecenie:

git merge --continue

Zobacz commit c7d227d (15 Dec 2016) by Jeff King (peff).
Zobacz commit 042e290, commit c261a87, commit 367ff69 (14 Dec 2016) by Chris Packham (cpackham).
(dodany przez Junio C Hamano -- gitster -- in commit 05f6e1b, 27 gru 2016)

Zobacz uwagi do wydania 2.12 .

merge: Dodaj opcję "--continue " jako synonim dla 'git commit'

Teach' git merge 'the --continue option which allows 'continuing' a / align = "left" /
Tradycyjnym sposobem zakończenia scalania po rozwiązaniu konfliktów jest użycie "git commit".
Teraz z poleceniami takimi jak "git rebase " i "git cherry-pick "mając opcję" --continue "dodanie takiej opcji do" git merge " daje spójny UI.

 66
Author: VonC,
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-05-30 17:16:58

Jeśli kiedykolwiek utkniesz podczas scalania / rebase zawsze możesz

git reset --hard

Aby przywrócić pracę do stanu ostatniego commita. Spowoduje to utratę Twoich zmian z działającego drzewa, więc jeśli miałeś lokalne modyfikacje przed połączeniem, zostaną one usunięte po tym-dlatego wskazane jest, aby nie rozpoczynać scalania, gdy masz lokalne modyfikacje. :)

 21
Author: Bombe,
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
2010-03-20 11:33:57

Po prostu git commit to.

Opcjonalnie git abort to:
wpadłem w konflikt scalający. Jak mogę przerwać połączenie?

Aby ułatwić życie z on merges zainstaluj kdiff3 i skonfiguruj go jako mergetool. Instrukcje: http://doodkin.com/2016/05/29/git-merge-easy-github-this-branch-has-conflicts-that-must-be-resolved-use-the-command-line/

Ta strona zawiera ten film: https://www.youtube.com/watch?v=Cc4xPp7Iuzo

 9
Author: Shimon Doodkin,
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-11-01 16:01:51

Ilekroć łączysz dwie gałęzie używając polecenia git merge brancha branchb, są dwie możliwości:

  1. Jedna gałąź (powiedzmy brancha) może zostać osiągnięta przez drugą gałąź (powiedzmy branchb), wykonując jej commity history.In w tym przypadku git po prostu przesuwa głowę do przodu, aby wskazać ostatnią gałąź (w tym przypadku branchb).

    2.Ale jeśli dwie gałęzie rozeszły się w jakimś starszym punkcie, to git tworzy nową migawkę i dodaje nowy commit, który do niej wskazuje. Tak więc w przypadku, jeśli jest brak konfliktu między gałęziami, które łączysz, git płynnie tworzy nowy commit.

Uruchom git log, aby zobaczyć commit po połączeniu dwóch niezwiązanych ze sobą gałęzi.

Teraz wróćmy do interesującego przypadku, gdy między scalającymi się gałęziami występują konflikty. Cytuję to ze strony https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

Git nie stworzył automatycznie nowego połączenia / align = "left" / To wstrzymało proces podczas rozwiązywania konfliktu. Jeśli chcesz zobaczyć, które pliki są niezergowane 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 strefy przejściowej za pomocą git add filename, a 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 twoje pytanie . Również odwiedź powyższy link do zrozum wszystko w szczegółach . W razie jakichkolwiek pytań proszę o komentarz poniżej, chętnie pomogę.

 8
Author: Sourav Prem,
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-06-20 05:57:31

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

  1. git add .
  2. Git status (pokaże ci, które polecenia są niezbędne do kontynuowania procedury automatycznego scalania)
  3. [polecenie git sugeruje, np. git merge --continue, git cherry-pick --continue, git rebase --continue]
 5
Author: Timidfriendly,
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-19 14:00:46

Pierwszą rzeczą, którą chcę wyjaśnić jest to, że nazwy gałęzi są tylko aliasem do określonego commita. commit jest tym, co git działa, kiedy ciągniesz, naciskasz merge i tak dalej. Każdy commit ma unikalny identyfikator.

Kiedy wykonujesz $ git merge, to dzieje się tak, że git próbuje przewijać Twoją bieżącą gałąź do zatwierdzonego commita (innymi słowy obie nazwy gałęzi wskazują na ten sam commit.) Ten scenariusz jest najłatwiejszy w obsłudze dla git, ponieważ nie ma nowego / align = "left" / Pomyśl o mistrzu skaczącym na lilipada, na którym Twoja gałąź się ochładza. Można ustawić flagę --no-FF, w którym to przypadku git utworzy nowy commit niezależnie od tego, czy doszło do konfliktu kodu.

W sytuacji, gdy występują konflikty kodu pomiędzy dwiema gałęziami, które próbujesz scalić (zwykle dwie gałęzie, których historia zmian ma wspólne zmiany w przeszłości), szybkie przewijanie nie będzie działać. git może nadal być w stanie automatycznie scalić pliki, o ile ta sama linia nie została zmieniona przez obie gałęzie w pliku kolidującym ze sobą. w takim przypadku, git Scali dla Ciebie kolidujące ze sobą pliki i automatycznie zatwierdzi je. Możesz sprawdzić, jak zrobił git, wykonując $ Git diff --cached. Możesz też przekazać flagę --no-commit komendzie merge, która pozostawi zmodyfikowane pliki w indeksie, które musisz dodać I zatwierdzić. Ale możesz $ git diff te pliki, aby sprawdzić, co zmieni się scalenie.

Trzeci scenariusz jest wtedy, gdy są konflikty git nie może automatycznie rozwiąż. W takim przypadku musisz ręcznie połączyć je. Moim zdaniem jest to najłatwiejsze do zrobienia z merge taken, jak Araxis merge lub p4merge (free). Tak czy inaczej, musisz zrobić każdy plik jeden po drugim. Jeśli połączenie kiedykolwiek wydaje się zablokowane, użyj $ git merge --continue, aby go popchnąć. Git powinien ci powiedzieć, jeśli nie może kontynuować, a jeśli tak, to dlaczego nie. Jeśli czujesz, że połączyłeś się w pewnym momencie, możesz zrobić $ git merge --abort, a każde scalenie cofnie się i możesz zacząć od nowa. Kiedy gotowe, każdy scalony plik będzie zmodyfikowanym plikiem, który należy dodać i zatwierdzić. Możesz sprawdzić, gdzie znajdują się pliki za pomocą $ Git status. Jeśli scalone pliki nie zostały jeszcze zatwierdzone. Musisz to zrobić, aby zakończyć połączenie. Musisz zakończyć scalanie lub przerwać scalanie, zanim będziesz mógł przełączyć gałęzie.

 1
Author: Harry Robbins,
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-09-25 01:32:24

Konflikt scalania występuje, gdy dwie gałęzie, które próbujesz połączyć, zmieniły tę samą część tego samego pliku. Listę konfliktów można wygenerować za pomocą git status.

W przypadku napotkania konfliktowej linii, Git będzie edytował zawartość dotkniętych plików za pomocą wizualnych wskaźników, które zaznaczają obie strony konfliktu.

<<<<<<< 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 add i git commit, aby wygenerować commit scalający. Raz wprowadzono commit, git push zmiany w gałęzi.

Artykuł referencyjny: Git merge.

 1
Author: Nesha Zoric,
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-05-22 12:06:38

Po dodaniu wszystkich plików, następnym krokiem jest " git commit".

"Git status" podpowie, co zrobić: pliki do dodania są wymienione na dole, a gdy wszystkie zostaną wykonane, zasugeruje commit na górze, gdzie wyjaśnia status scalenia bieżącej gałęzi.

 1
Author: hobgoblin,
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-06-19 12:44:39