2013-01-13 14 views
36

Wprowadziłem kilka zmian w repozytorium git, które chcę cofnąć.Cofnij szybkie przewijanie do przodu

My git repo wyglądało tak:

A-B----  master 
    \ /
    C-D  * develop 

byłem na develop oddziału, zapomniał, że różnił się od master branży, dokonała zmiany na develop, połączyła je w master, a następnie przekazać je do mojego zdalny (o nazwie publish).

Ponieważ nie było zmian na wzorcu od B (wspólny przodek), git wykonał szybkie przewijanie do przodu.

Teraz moje repo wygląda następująco:

A-B-C-D master, develop, remotes/publish/master, remotes/publish/develop. 

Chciałem przywrócić ostatnią seryjnej, przywracając master do B.

Z tego co czytałem w How to undo last commit(s) in Git? użyłem git reset sha-of-B przywrócić mój master Branża korekcie B.

pytania:

  • Jak przywrócić develop do wersji D?
  • Jak następnie przenieść te zmiany z powrotem do zdalnego/publikowania?
+0

Podpis na blogu podsumowujący i przechodzący do nieco dokładniejszych informacji o tym, co zrobiłem, powinienem zrobić i jak to naprawiłem: http://www.capnfabs.net/software/git-undoing-a-fast -forward-fge-when -you-shouldve-just-used-a-new-branch/ –

+1

@SnowCrash zaktualizowany link: http://capnfabs.net/blog/2013/01/14/git-undoing-a-fast-forward-merge/ –

+0

Dla jedynych programistów to chyba wszystko dobrze, ale dla tych, którzy współpracują, czy nie byłoby sensu używać 'revert' zamiast' reset'? – Snowcrash

Odpowiedz

60

Po zresetowaniu gałęzi głównej nie będzie ona dotykała gałęzi rozwijanej. W celu Reput wszystko w porządku, należy zrobić:

git checkout master 
git reset --hard sha-of-B 
git checkout develop 
git reset --hard sha-of-D 
git checkout master 
git merge develop --no-ff 
+0

Dzięki za to - lokalne repozytorium git jest już w porządku. Jak mogę następnie wprowadzić te zmiany bez otrzymywania błędów z powodu "Odrzucenia aktualizacji, ponieważ wypchana końcówka gałęzi znajduje się za swoim zdalnym odpowiednikiem"? –

+3

Ah, po prostu wymuś push 'git push --force' –

+0

Wydaje się, że naprawiłeś to doskonale. Dziękuję bardzo za pomoc @SimonBoudrias! –

0

Jeśli wydaje się, że zostały sprawdzone się develop kiedy prowadził git reset, i to, co cię zawiedli.

można naprawić develop następująco:

git checkout develop 
git merge --ff-only D 

Teraz można przywrócić master z powrotem do B:

git checkout master 
git reset --hard B 

Wracaj do develop i przesunąć go:

git checkout develop 
git push develop 
+0

Dzięki za odpowiedź! Byłem zdecydowanie w gałęzi 'master', właśnie czytałem' gitk' gui źle. Odpowiednio edytuję moje pytanie. –

12
  • Wyobraź sobie nadal jesteś na mistrza gdzie połączyły się i pchnął
  • git reset --hard @{1}
    • ten resetuje gałąź „mistrz” do miejsca, gdzie był to jeden krok do tyłu na komputerze (tjna „B”)
  • dla rozwijać nic nie robić, bo w dalszym ciągu powinno być na „D”
  • git push publish develop --force-with-lease=master
    • to popycha oddział „rozwijać” w zwykły sposób:
    • a także popycha oddział „mistrz” tyłu, za zgodą zdobyte poprzez --force-with-lease w sposób bezpieczny
    • wykorzystanie --force potędze milczeniu zastępowania pracy z innymi, więc nigdy nie używać tego
+1

"Reset git --hard @ {1}" zadziałał idealnie w mojej sytuacji. I - ff to połączenie i miało ponad 100 zatwierdzeń i nie musiałem wykonywać miękkiego resetu dla każdego z nich. Dzięki! +1 –

+0

Przypadkowo zrobiłem 'git checkout develop && git merge -' zamiast' git checkout develop && git merge --no-ff -' (the - oznacza ostatnią gałąź). Powyższa odpowiedź zadziałała bardzo dobrze, ponieważ nie zrobiłem nic pośredniego i wciąż się rozwijałem: 'git reset --hard @ {1} && git merge --no-ff feature/my-feature-branch' –

Powiązane problemy