Zmiana rozmiaru zatwierdzenia Git merge
Weź następujący przypadek:
Mam trochę pracy w gałęzi tematycznej i teraz jestem gotowy do połączenia z powrotem do master:
* eb3b733 3 [master] [origin/master]
| * b62cae6 2 [topic]
|/
* 38abeae 1
Wykonuję merge od mistrza, rozwiązuję konflikty i teraz mam:
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | eb3b733 3 [origin/master]
|/
* 38abeae 1
Teraz scalanie Zajęło mi trochę czasu, więc wykonuję kolejny fetch i zauważam, że zdalna gałąź master ma nowe zmiany:
* 8101fe3 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
| | * e7affba 4 [origin/master]
| |/
|/|
* | eb3b733 3
|/
* 38abeae 1
Jeśli spróbuję 'Git rebase origin / master' Z master, jestem zmuszony ponownie rozwiązać wszystkie konflikty, a także stracić połączenie commit:
* d4de423 2 [master]
* e7affba 4 [origin/master]
* eb3b733 3
| * b62cae6 2 [topic]
|/
* 38abeae 1
Czy istnieje czysty sposób na rebase commit merge, aby skończyć z historią podobną do tej, którą pokazuję poniżej?
* 51984c7 Merge branch 'topic' [master]
|\
| * b62cae6 2 [topic]
* | e7affba 4 [origin/master]
* | eb3b733 3
|/
* 38abeae 1
5 answers
Są dwie opcje.
Jeden jest zrobić interaktywny rebase i edytować commit merge, ponowić scalanie ręcznie i kontynuować rebase.
Innym jest użycie opcji -p
Na git rebase
, która jest opisana w następujący sposób z podręcznika: "zamiast ignorować merge, spróbuj je odtworzyć."To pytanie wyjaśnia dalej: co dokładnie robi" rebase --preserve-merges " Gita (i dlaczego?)
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-23 12:26:36
Ok, to stare pytanie i już zaakceptowało odpowiedź przez @siride
, ale ta odpowiedź nie była wystarczająca w moim przypadku, ponieważ --preserve-merges
zmusza cię do rozwiązania wszystkich konfliktów po raz drugi. Moje rozwiązanie oparte na pomyśle by @Tobi B
ale z dokładnymi poleceniami krok po kroku
Więc zaczniemy od takiego stanu na podstawie przykładu w pytaniu:
* 8101fe3 Merge branch 'topic' [HEAD -> master]
|\
| * b62cae6 2 [topic]
| |
| | * f5a7ca8 5 [origin/master]
| | * e7affba 4
| |/
|/|
* | eb3b733 3
|/
* 38abeae 1
Zauważ, że mamy przed sobą 2 commity, więc cherry-pick nie zadziała.
-
Po pierwsze, niech Utwórz poprawną historię, którą chcemy:
git checkout -b correct-history # create new branch to save master for future git rebase -s ours -p origin/master
-p
oznacza--preserve-merges
, używamy go, aby zapisać nasz commit scalający w historii-s ours
oznacza--strategy=ours
, używamy go do ignorowania wszystkich konfliktów scalania, ponieważ nie dbamy o to, jaka zawartość będzie w tym commicie scalania, potrzebujemy teraz tylko ładnej historii.Historia będzie wyglądała tak (ignorując mistrza):
* 51984c7 Merge branch 'topic' [HEAD -> correct-history] |\ | * b62cae6 2 [topic] * | f5a7ca8 5 [origin/master] * | e7affba 4 * | eb3b733 3 |/ * 38abeae 1
-
Zróbmy teraz poprawny indeks.
git checkout master # return to our master branch git merge origin/master # merge origin/master on top of our master
Możemy mieć tu dodatkowe konflikty scalania, ale to byłoby tylko konflikty z plików zmienionych pomiędzy
8101fe3
if5a7ca8
, ale nie obejmują już rozwiązanych konfliktów ztopic
Historia będzie wyglądała tak (ignorując poprawną-historię):
* 94f1484 Merge branch 'origin/master' [HEAD -> master] |\ * | f5a7ca8 5 [origin/master] * | e7affba 4 | * 8101fe3 Merge branch 'topic' | |\ | | * b62cae6 2 [topic] |/ / * / eb3b733 3 |/ * 38abeae 1
-
Ostatni etap to połączenie naszej gałęzi z poprawną historią i gałęzi z poprawnym indeksem.]}
git reset --soft correct-history git commit --amend
Używamy
reset --soft
aby zresetować naszą gałąź (i historię), aby poprawić-historię, ale pozostawiamy indeks i działające drzewo tak, jak jest. Następnie używamycommit --amend
aby przepisać nasz commit merge, który kiedyś mieć Nieprawidłowy indeks, z naszym dobrym indeksem od mistrza.W końcu będziemy mieć taki stan (zwróć uwagę na inny id top commit):
* 13e6d03 Merge branch 'topic' [HEAD -> master] |\ | * b62cae6 2 [topic] * | f5a7ca8 5 [origin/master] * | e7affba 4 * | eb3b733 3 |/ * 38abeae 1
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-12-15 10:36:36
Biorąc pod uwagę, że właśnie straciłem dzień próbując to rozgryźć i znalazłem rozwiązanie z pomocą współpracownika, pomyślałem, że powinienem się odezwać.
Mamy dużą bazę kodu i mamy do czynienia z 2 gałęziami mocno modyfikowanymi w tym samym czasie. Istnieje główna gałąź i gałąź Drugorzędna, jeśli ty, która.
Podczas gdy scalam gałąź drugorzędną do gałęzi głównej, prace trwają w gałęzi głównej i zanim skończę, nie mogę przesunąć zmian, ponieważ są nie do pogodzenia.
Dlatego muszę "rebase" moje "połączenie".
Tak w końcu to zrobiliśmy:
1) zanotuj SHA. ex.: c4a924d458ea0629c0d694f1b9e9576a3ecf506b
git log -1
2) Utwórz właściwą historię, ale to spowoduje przerwanie połączenia.
git rebase -s ours --preserve-merges origin/master
[[7]}3) zanotuj SHA. ex.: 29dd8101d78
git log -1
4) Teraz zresetuj się do miejsca, w którym byłeś wcześniej
git reset c4a924d458ea0629c0d694f1b9e9576a3ecf506b --hard
5) Teraz połącz bieżący master z działającą gałęzią
git merge origin/master
git mergetool
git commit -m"correct files
6) Teraz, gdy ty mieć właściwe pliki, ale złą historię, uzyskać właściwą historia na szczycie zmian z:
git reset 29dd8101d78 --soft
7) a następnie -- popraw wyniki w oryginalnym commicie merge
git commit --amend
Voila!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-12-14 16:53:25
Wygląda na to, że chcesz usunąć pierwsze połączenie. Można wykonać następującą procedurę:
git checkout master # Let's make sure we are on master branch
git reset --hard master~ # Let's get back to master before the merge
git pull # or git merge remote/master
git merge topic
To da ci to, czego chcesz.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
2011-01-24 18:10:57
- From your merge commit
- Cherry-wybierz nową zmianę, która powinna być łatwa
- Kopiuj swoje rzeczy
- powtórz scalanie i rozwiązuj konflikty, kopiując pliki z lokalnej kopii;)
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-30 16:26:45