2011-09-17 23 views
14

właśnie zrobiłJak cofnąć squash git merge?

git merge --squash feature-branch 

do mojego develop gałęzi.

Problem polega na tym, że powyższe polecenie zaktualizowało nagłówek bez tworzenia nowego zatwierdzenia. Moją intencją było stworzenie jednego zobowiązania do zgłoszenia się do szefa develop.

W skrócie, dziennik gałęzi develop przed i po scaleniu jest dokładnie taki sam.

Czy istnieje sposób, aby przywrócić develop do tego, co było przed git merge?

Dziękuję.

Rozwiązanie

podstawie komentarza od Dan D. i zaakceptowanej odpowiedzi poniżej I był w stanie rozwiązać mój problem. Zobacz poniżej, co zrobiłem w przypadku, gdy jesteś w tej samej łodzi:

1 - Uruchomiłem git reflog i wymienione wszystkie zatwierdzenia i kasacje zrobiłem z moim oddziałem develop.

2 - Zamiast proponować git reset [email protected]{1} zgodnie z sugestią, znalazłem numer, gdy wykonałem ostatnie zatwierdzenie do opracowania, które chciałem zachować. W moim przypadku był to [email protected]{188}. Więc wpisałem git reset [email protected]{188}.

3 - Przebiegłem git log i miał czysty dziennik pokazujący tylko zatwierdzenia, które miałem przed wykonaniem złego scalenia.

4 - Uruchomiłem git add -A ., aby wystawić wszystkie nowe pliki utworzone podczas mojego rozwijania funkcji.

5 - Pobiegłem git commit -m "install feature-x"

6 - W rezultacie teraz mam oddział develop z odpowiednich plików i log jest czysty - pokazano tylko jeden commit dla wszystkich zmian, które zrobiłem podczas rozwoju feature-x.

Nadal muszę się dowiedzieć, dlaczego mój oryginalny git merge --squash feature-branch nie działa zgodnie z przeznaczeniem.

Rozwiązanie 2

odpowiedź Mark Longair jest ostateczne rozwiązanie mojego problemu. Właśnie to przetestowałem i działa. Zobacz poniżej procesie używam teraz zgnieść wszystkie wewnętrzne zobowiązuje obrębie feature-branch i obejmują tylko jeden zobowiązać się do develop oddziału:

git checkout develop 
git merge --squash feature-branch 
git commit -m "install of feature-branch" 

Powyższa sekwencja działa jak czar.

+2

Użyj 'git reflog'. –

Odpowiedz

17

Jeśli uruchomisz git merge --squash <other-branch> drzewo robocze i indeks zostaną zaktualizowane o wynik scalenia, ale nie utworzy ono zatwierdzenia.Wszystko, co musisz zrobić, to uruchomić:

git commit 

Jednakże, jeśli zmienisz zdanie przed popełnieniem i po prostu chcą, aby przerwać seryjnej, wystarczy uruchomić:

git reset --merge 

Nie potrzeba używać reflogu.

+0

Uau, dziękuję. Pracuję w nowej gałęzi funkcji i przetestuję Twoją sugestię, aby sprawdzić, czy działa. Zaktualizuję to pytanie wraz z wynikami. Dziękuję Ci. – jdias

+0

Właśnie testowane i działa. Dziękuję Mark. Właśnie zaktualizowałem moje pytanie z twoją odpowiedzią. – jdias

+0

+1 Kolejne wyprasowane cienko wyprasowane. Dzięki! (w nieco sfrustrowanej notatce: to dlatego, że w git wszystkie podkomendy zachowują się nieznacznie niekonsekwentnie - scalaj, stosuj się, kasa z lokalnymi zmianami, wszystkie zachowują się inaczej, nie wspominając o mnóstwie 'git checkout HEAD -' kontra 'git checkout HEAD - .', 'git rebase --abort', ale nie' git merge --abort', 'git push -all', ale nie' git pull -all' i wiele takich subtelnych instancji :)) – sehe

0

Jeśli zmienisz zdanie przed podjęciem, masz następujące opcje:

przerwać łączą się z nowoczesnym składni git:

git merge --abort 

iz starszą składnię:

git reset --merge 

i bardzo old-school:

git reset --hard 

Ale tak naprawdę, warto zauważyć, że git merge --abort jest tylko równoważny git reset --merge, ponieważ obecny jest MERGE_HEAD. Można to odczytać w pomocy git dla polecenia scalania.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present. 

Po nieudanej seryjnej, gdy nie ma MERGE_HEAD, nieudane scalenie można cofnąć z git reset --merge ale niekoniecznie z git merge --abort, więc nie są one tylko stare i nowe składnia samo. Osobiście uważam, że git reset --merge jest o wiele bardziej przydatny w codziennej pracy.

Powiązane problemy