2012-01-26 18 views
12

Załóżmy, że moje repozytorium Git ma początkowo dwie gałęzie: Foo i Bar.Rebase a merge commit

 
... ─ Foo 

... ─ Bar 

Tworzę trzeci oddział, FooBar, w którym zatwierdzam scalenie dwóch pozostałych gałęzi.

 
... ─ Foo ──┐ 
      FooBar 
... ─ Bar ──┘ 

FooBar jest obecnie jednym popełnić wyprzedzając zarówno Foo i Bar. Następnie wykonuję więcej pracy, popełniając kilka razy tylko na Foo.

 
... ── A ───┬── B ── C ── D ── Foo 
      FooBar 
... ─ Bar ──┘ 

Pytanie brzmi: ponieważ pierwszy rodzic oddziału foobar nie jest już Foo, mogę rebase scalanie popełnić w branży foobar, aby ponownie mieć Foo i bar, a jego dwóch rodziców? Innymi słowy, czy mogę włączyć rozwój w Foo do wcześniej połączonego FooBar wraz z niezmienionym batonem?

 
... ── A ── B ── C ── D ── Foo ──┐ 
           FooBar 
... ─ Bar ───────────────────────┘ 
+0

Zobacz także [używanie git-replace do zmiany wskaźnika rodzica] (http://stackoverflow.com/a/3811217/90527), choć ma to inne konsekwencje. – outis

+0

Zobacz także [Jak korzystać z git rebase -i po git merge bez komplikowania?] (Http://stackoverflow.com/q/4152936/90527) – outis

Odpowiedz

1

Nie można zmieniają bazę pod oddziału FooBar bez zmiany co definiuje FooBar. Co możesz zrobić, to połączyć FooBar i Foo. To ma tę samą zawartość, której pragniesz.

+0

Tak, ale chodzi o to, aby nie dopuścić do scalenia. Właśnie dlatego chcę zmienić nazwę 'BranchFooBar'. – nccc

+0

Być może jestem zmieszany z tym, co chcesz. Mówisz, że chcesz uniknąć scalania, ale interpretuję twoje pytanie tak, jak chcesz, aby ostateczne wyniki były połączeniem między 'branchFoo' i' branchBar'. – Andy

+0

Masz rację, to nie było wystarczająco jasne. Chcę uniknąć * 2 * zatwierdzenia scalania. 'BranchFooBar' zawsze będzie commitem scalającym, ale chcę, aby był to * tylko * scalony commit z' BranchFoo' i 'BranchBar' jako rodzicami. – nccc

0

W zasadzie próbujesz wymazać wszystkie ślady wcześniej wykonanego scalenia.

Jeśli naprawdę chcesz, aby wyrzucić wszystko zobowiązuje, który istnieje tylko w FooBar (aw katalogu roboczym), a następnie postępować w następujący sposób: najpierw zrobić git checkout FooBar, a następnie dokonać git zapomnieć o jego historii i zrobić git reset --hard Foo (jeśli zamiarem połączyć Bar w Foo). Następnie odtwarzasz scalenie za pomocą git merge Bar.

12

Zdaję sobie sprawę, że jest to dość stary temat, ale odkąd znalazłem to pytanie w obliczu podobnej sytuacji, równie dobrze mogłem powiedzieć, czego użyłem w końcu.

git checkout FooBar 
git rebase -p --onto Foo A 

Próbowałem użyć nazwisk z pierwotnego pytania. Zwróć uwagę, że A oznacza zatwierdzenie oznaczone jako A w sztuce ascii. Prawdopodobnie użyjesz skrótu zatwierdzenia zamiast tego lub innego sposobu wskazania zatwierdzenia, w którym oddzielne gałęzie są oddzielne.

Flaga -p jest również znana jako --preserve-merges i ma prawie wszystko, co mówi.

Należy zauważyć, że gałąź Bar nie odgrywa tutaj roli, więc linia zatwierdzeń może być nazwaną gałęzią lub nie - nie ma znaczenia.

+3

Należy zauważyć, że nie spowoduje to żadnych zmian w zatwierdzeniu scalenia. – Tgr

+2

Dzięki, to nam bardzo pomogło. Istotne jest, aby pamiętać, że "A" jest ostatnim zatwierdzeniem docelowej gałęzi, która wciąż była zawarta w pierwotnym scaleniu. – Dibbeke

+1

to powinna być zaakceptowana odpowiedź! – wutzebaer