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
Author: jipumarino, 2011-01-24

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?)

 97
Author: siride,
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.

  1. 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
    
  2. 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 i f5a7ca8, ale nie obejmują już rozwiązanych konfliktów z topic

    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
    
  3. 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żywamy commit --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
    
 12
Author: Ivan Naydonov,
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!
 3
Author: Claude Peloquin,
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.
 1
Author: Antoine Pelisse,
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;)
 0
Author: Tobi B,
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