Ponowne wykonanie cofniętego merge w Git

Natknąłem się na mały problem: miałem specyficzną gałąź 28s W Git, którą połączyłem w gałąź general develop. Okazało się, że zrobiłem to zbyt szybko, więc użyłem git-revert, aby cofnąć połączenie. Teraz jednak nadszedł czas, aby połączyć 28s z develop, ale polecenie git-merge widzi oryginalne scalenie i z radością ogłasza, że wszystko jest dobrze i gałęzie zostały już połączone. Co mam teraz zrobić? Create a ' Revert "Revert" 28s -> develop "" commit? To nie wygląda na dobry sposób. żeby to zrobić, ale nie wyobrażam sobie innego w tej chwili.

Jak wygląda struktura drzewa:

Git log output

Author: Scott Weldon, 2009-07-03

6 answers

Musisz "przywrócić przywrócenie". Zależy od tego, jak to przywróciłeś, może to nie być takie proste, jak się wydaje. Spójrz na oficjalny dokument na ten temat .

---o---o---o---M---x---x---W---x---Y
              /
      ---A---B-------------------C---D

Aby umożliwić:

---o---o---o---M---x---x-------x-------*
              /                       /
      ---A---B-------------------C---D
Ale czy to wszystko działa? Pewnie, że tak. Można przywrócić połączenie, a z czysto techniczny kąt, git zrobił to bardzo naturalnie i nie miał prawdziwego kłopoty.
Uznał to za zmianę z "stan przed scaleniem" na "stan po połączeniu" i tyle.
Nic. skomplikowane, nic dziwnego, nic niebezpiecznego. Git zrobi to bez zastanowienia. Więc z technicznego punktu widzenia, nie ma nic złego w przywróceniu połączenia, ale z punktu widzenia przepływu pracy jest to coś, co generalnie powinieneś spróbować unikać .

Jeśli w ogóle to możliwe, na przykład, jeśli znajdziesz problem, który został scalony do głównego drzewa, zamiast odwracać połączenie, spróbuj naprawdę trudno :

  • bisect problem w gałęzi, którą połączyłeś, i po prostu go napraw,
  • } lub spróbuj odwrócić indywidualny commit, który go spowodował.

Tak, to jest bardziej skomplikowane, i nie, to nie zawsze będzie działać (czasami odpowiedź brzmi: "UPS, naprawdę nie powinienem był tego łączyć, ponieważ nie było gotowy jeszcze, i naprawdę muszę cofnąć wszystkie połączenia"). Więc ty naprawdę powinno się przywrócić połączenie, ale kiedy chcesz ponownie połączyć, musisz teraz trzeba to zrobić poprzez odwrócenie Odwróć.

 131
Author: J-16 SDiZ,
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
2009-07-03 10:59:15

Załóżmy, że masz taką historię

---o---o---o---M---W---x-------x-------*
              /                      
      ---A---B

Gdzie A, B nie powiodły się commity i W - jest odwróceniem M

Więc zanim zacznę naprawiać znalezione problemy, nie muszę wybierać W w commit do mojej gałęzi

git cherry-pick -x W

Potem przywracam w commit na mojej gałęzi

git revert W 
Po tym, jak będę mógł kontynuować naprawę.

Ostateczna historia może wyglądać następująco:

---o---o---o---M---W---x-------x-------*
              /                       /     
      ---A---B---W---W`----------C---D

Kiedy wysyłam PR, to wyraźnie pokazuje, że PR jest undo revert i dodaje kilka nowych commitów.

 36
Author: Maksim Kotlyar,
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
2013-03-26 20:21:19

Aby przywrócić przywracanie bez zbytniego spieprzenia przepływu pracy:

  • Tworzenie lokalnej kopii kosza develop
  • Przywróć commit revert na lokalnej kopii develop
  • Scal tę kopię do swojej gałęzi feature i wypchnij ją na serwer git.

Twoja gałąź funkcji powinna być teraz możliwa do scalenia jak zwykle, gdy będziesz na to gotowy. Jedynym minusem jest to, że będziesz miał kilka dodatkowych commitów merge/revert w swojej historii.

 4
Author: Sam Dufel,
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-22 18:32:28

Zamiast git-revert mogłeś użyć tego polecenia w gałęzi devel do throw away (undo) niewłaściwy commit merge (zamiast tylko go cofnąć).

git checkout devel
git reset --hard COMMIT_BEFORE_WRONG_MERGE

Spowoduje to również odpowiednie dostosowanie zawartości katalogu roboczego. uważaj :

  • Zapisz swoje zmiany w gałęzi develop (od błędnego scalenia), ponieważ również zostaną usunięte przez git-reset. Wszystkie commity po tym, który określisz jako argument git reset będzie odejdź!
  • nie rób tego również, jeśli twoje zmiany zostały już pobrane z innych repozytoriów ponieważ reset zmieni historię.

Zalecam dokładne przestudiowanie git-reset man-page przed wypróbowaniem tego.

Teraz po resecie możesz ponownie zastosować zmiany w devel, a następnie wykonać

git checkout devel
git merge 28s

Będzie to prawdziwe połączenie z 28s do devel Jak początkowe (które jest teraz wymazane z historii Gita).

 2
Author: knweiss,
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
2009-07-05 14:35:47

Właśnie znalazłem ten post, gdy borykam się z tym samym problemem. Znajduję powyżej wayyy przerażające zrobić reset hards itp. Skończę usuwając coś, czego nie chcę i nie będę w stanie go odzyskać.

Zamiast tego sprawdziłem commit, do którego chciałem wrócić np. git checkout 123466t7632723. Następnie przekształcony w gałąź git checkout my-new-branch. Następnie usunąłem gałąź, której już nie chciałem. Oczywiście będzie to działać tylko wtedy, gdy jesteś w stanie wyrzucić gałąź, którą namieszałeś.

 1
Author: Claire,
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-13 10:34:16

Aby przywrócić przywrócenie:

git revert <commit-hash-of-previous-revert>
 0
Author: Richard,
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-08-09 21:06:47