2009-10-26 10 views
74

Załóżmy, że mam tę gałąź funkcji "foo". Teraz chcę połączyć go z powrotem w master, ale dodałem kod debuggowania, którego nie chcę w master.Jak mogę połączyć wiele zatwierdzeń, ale zostawić jedną?

Kod debugowania jest w jego własnym zatwierdzeniu, więc mógłbym użyć git cherry-pick dla każdego zatwierdzenia i pominąć to zatwierdzenie. Ale to będzie dość męczące.

Czy jest jakiś "odwrotny kilof", który to robi, lub interaktywne scalanie?

Odpowiedz

54

Wykorzystanie interaktywnych rebase:

git rebase -i SHA-OF-FIRST-COMMIT-IN-BRANCH 

To otworzy coś takiego w $ Redaktor:

pick 8ac4783 folders and folders 
    pick cf8b1f5 minor refactor 
    pick 762b37a Lots of improvement. Folders adn shit. 
    pick 3fae6e1 Be ready to tableview 
    pick b174dc0 replace folder collection view w/ table view 
    pick ef1b65b more finish 
    pick ecc407f responder chain and whatnot 
    pick 080a847 play/pause video 
    pick 6719000 wip: movie fader 
    pick c5f2933 presentation window fade transition 

    # Rebase e6f77c8..c5f2933 onto e6f77c8 
    # 
    # Commands: 
    # p, pick = use commit 
    # e, edit = use commit, but stop for amending 
    # s, squash = use commit, but meld into previous commit 
    # 
    # If you remove a line here THAT COMMIT WILL BE LOST. 
    # However, if you remove everything, the rebase will be aborted. 
    # 

Więc co robisz jest po prostu usunąć wiersz zawierający debug popełnienia, napisać zapisz i zamknij edytor, a git powie Ci coś podobnego:

Successfully rebased and updated refs/heads/master. 

Teraz ty możesz po prostu wtopić się w tę gałąź, by opanować.

UPDATE: Należy zauważyć, że zmieniając historię z rebase powinno się zdarzyć tylko na gałęziach prywatnych. Jeśli ten oddział był publicznie dostępny, użyj git revert zgodnie z propozycją innego odbierającego.

+0

nice .. i tam jest to dobry sposób, aby uzyskać SHA-of-first-commit-in-Branch? –

+0

@DaveVogt yes! Zobacz http://stackoverflow.com/questions/1527234/finding-a-branch-point-with-git – boycy

67

Pomimo tego, co stosują inne SCM, w git, git revert jest odwrotnym wyborem wiśni.

+9

'git revert' zapisuje nowy commit z usuniętymi odpowiednimi zmianami. –

+11

@mikem: co jest, jak sądzę, intuicyjnie oznacza odwrotny pick-pick. Zarówno 'revert', jak i' cherry-pick' również mają opcję '-n', która nie wykonuje zatwierdzenia, ale pozostawia zmiany w obszarze pamięci podręcznej/indeksu/miejsca postoju, dzięki czemu polecenia są bardzo podobne. –

+0

krótki i słodki - zachęca do wypróbowania go, myśląc "nie ma mowy, żeby to było tak proste! pokażę mu! "... a potem to jest takie proste. wydaje się działać nawet dla kodu, który zacząłem wybierać wiśniowo, ale potem po prostu popełnia się normalnie (oops?), co wydaje mi się mieć sens, ponieważ ostatecznie 'git' to wszystko na temat różnic między migawkami, a nie zdarzeniami zależnymi. nie wiem. Ciągle uczę się o takich funkcjach i oczekuję, że złapie, ale po prostu wydają się działać, za każdym razem! –

2

Użyj interaktywnego rebase, aby usunąć zatwierdzenia, których nie chcesz.

Na nowy oddział „foo-Merge” utworzonego z „foo”:

git rebase -i master 

Gdy jesteś w popełnić trybu edycji, usunąć wiersze zawierające debug zobowiązuje, zapisać i wyjść z edytora.

Po podścielanie, wystarczy pociągnąć bla-scalić mistrza:

git checkout master 
git pull . foo-merge 
+0

Powtarzanie dużo? –

+1

Trochę trudno współtworzyć poprzez komentarze, kiedy nie wolno ci. FWIW, Głosowałem za twoją odpowiedzią, zanim zdecydowałem, że moja będzie na tyle odmienna, aby być oddzielnym wpisem, a następnie składać. –

7

Innym pomysłem jest dodanie powrócił popełnić w jednym z debugowania kodu i scalić ją do gałęzi master. Następnie usuwamy to dodatkowe zatwierdzenie w gałęzi foo.

git checkout foo 
git revert COMMIT_REF_WITH_DEBUG_CODE 

git checkout master 
git merge foo 

git checkout foo 
git reset --hard HEAD~1 

Upewnij się, że drzewo robocze jest czyste. Najpierw utwórz cofnięte zatwierdzenie. Następnie połącz go z mistrzem. Następnie zresetuj wskaźnik gałęzi gałęzi foo do rodzica cofniętego zatwierdzenia, aby powrócił do pierwotnego stanu.

Jeśli nie lubisz korzystać z git reset, możesz utworzyć tymczasową gałąź, w której utworzysz wycofane zatwierdzenie. Na koniec usuniesz gałąź tymczasową.

Powiązane problemy