W mojej gałęzi master zrobiłem git merge some-other-branch
lokalnie, ale nigdy nie wysłałem zmian do master master. Nie chciałem się połączyć, więc chciałbym to cofnąć. Po git status
scaleniu otrzymałem ten komunikat:
# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.
Na podstawie niektórych instrukcji, które znalazłem , próbowałem uruchomić
git revert HEAD -m 1
ale teraz otrzymuję ten komunikat z git status
:
# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.
Nie chcę, aby mój oddział wyprzedzał dowolną liczbę zatwierdzeń. Jak wrócić do tego punktu?
Odpowiedzi:
Z
git reflog
czeku, który popełnił jeden przed scalanie (git reflog
będzie lepszym rozwiązaniem niżgit log
). Następnie możesz go zresetować za pomocą:Jest też inny sposób:
Otrzymasz z powrotem 1 zatwierdzenie.
Należy pamiętać, że wszelkie zmodyfikowane i niezaangażowane / niezasadzone pliki zostaną przywrócone do stanu niezmodyfikowanego . Aby je ukryć, ukryj zmiany lub zobacz
--merge
opcję poniżej.Jak @Velmont zasugerował poniżej w swojej odpowiedzi, w tym bezpośrednim przypadku przy użyciu:
może przynieść lepsze wyniki, ponieważ powinien zachować twoje zmiany.
ORIG_HEAD
wskaże zatwierdzenie bezpośrednio przed wystąpieniem scalenia, więc nie musisz sam go szukać.Kolejną wskazówką jest użycie
--merge
przełącznika zamiast,--hard
ponieważ nie resetuje niepotrzebnie plików:źródło
git log
domyślnie wyświetla się - być może jest inny wynikgit log
lubgit reflog
może być do tego użyty)git log
wyniku chcesz spojrzeć na dwa zatwierdzenia nadrzędne. Jeden to najnowsze zatwierdzenie w oddziale, jeden to ostatnie zatwierdzenie w oddziale, w którym się połączyłeś. Chcesz, abygit reset --hard
rodzic zatwierdził oddział, w którym się połączyłeś.git reset --hard <commit_sha>
Zakładając, że twój lokalny mistrz nie wyprzedził pochodzenia / mistrza, powinieneś być w stanie to zrobić
Wówczas lokalny
master
oddział powinien wyglądać identycznieorigin/master
.źródło
Zobacz rozdział 4 w książce Git i oryginalny post Linusa Torvaldsa .
Aby cofnąć scalenie, które zostało już wypchnięte :
Pamiętaj, aby cofnąć wycofanie, jeśli ponownie popełniasz oddział, jak powiedział Linus.
źródło
git revert -m 1 <commit>
. Problem polega na tym, że zrobienie tego nie kasuje przypadkowego scalenia, które zrobił (i jeszcze nie pchnął). Inne odpowiedzi dotyczące twardego resetu są lepsze w przypadku problemu z oryginalnym plakatem.Dziwne, że brakowało najprostszego polecenia. Większość odpowiedzi działa, ale cofając właśnie wykonane połączenie, jest to prosty i bezpieczny sposób :
Referencja
ORIG_HEAD
wskaże pierwotne zatwierdzenie sprzed scalenia.(Ta
--merge
opcja nie ma nic wspólnego ze scaleniem. Jest po prostugit reset --hard ORIG_HEAD
bezpieczniejsza, ponieważ nie dotyka niezatwierdzonych zmian.)źródło
git reset --merge ORIG_HEAD
zachowaj te zmiany.git reset --hard HEAD~5
resetuje tylko HEAD (może usunąć zatwierdzenia zarówno w master, jak i branch1). Tylko--merge
opcja usuwamerge
.--merge
Opcja tak naprawdę nie usuwa scalenia, możesz go użyć--hard
, będzie również działał dobrze. Jest to wskazówka ORIG_HEAD, która jest wskazówką tutaj, jest ustalana przed wykonaniem scalenia z miejscem, w którym stoisz w tym momencie. :)git reset --hard ORIG_HEAD
Polecenie działało idealnie dla mnie - to może być wspomagane przez fakt, że nie dokonywała innych zmian w repozytorium po lokalnygit merge
starałem się cofnąć. Polecenie po prostu resetuje stan repozytorium z powrotem do stanu sprzed scalenia. Dzięki za świetną radę!W nowszych wersjach Git, jeśli jeszcze nie dokonałeś scalania i masz konflikt scalania , możesz po prostu:
Od
man git merge
:źródło
Powinieneś zresetować do poprzedniego zatwierdzenia. To powinno działać:
Lub nawet
HEAD^^
cofnąć zatwierdzenie przywrócenia. Zawsze możesz podać pełne odniesienie do SHA, jeśli nie jesteś pewien, ile kroków wstecz powinieneś zrobić.W przypadku problemów i braku zmian lokalnych w oddziale głównym, możesz zresetować do
origin/master
.źródło
ORIG_HEAD
dla ciebie ustawia , czemu by tego nie użyć?Ostatnio używałem
git reflog
do tego pomocy. Działa to głównie tylko wtedy, gdy nastąpiło scalenie JUST, i było na twoim komputerze.git reflog
może zwrócić coś takiego:Pierwszy wiersz wskazuje, że nastąpiło scalenie. Druga linia to czas przed moim połączeniem. Po prostu
git reset --hard 43b6032
zmuszam tę gałąź do śledzenia przed scaleniem i kontynuowania.źródło
reflog
do uzyskania SHA i przekazania go dogit reset
działania.Dzięki nowoczesnemu Git możesz:
Starsza składnia:
Stara szkoła:
Ale tak naprawdę warto zauważyć, że
git merge --abort
jest to odpowiednik tylkogit reset --merge
tego, coMERGE_HEAD
jest obecne. Można to odczytać w pomocy Git dotyczącej polecenia scalania.Po nieudanym scaleniu, gdy nie ma
MERGE_HEAD
, nieudanego scalenia można cofnąćgit reset --merge
, ale niekoniecznie za pomocągit merge --abort
, więc są one nie tylko starą i nową składnią tego samego .Osobiście uważam, że jest o
git reset --merge
wiele bardziej wydajny i użyteczny w codziennej pracy, więc tego zawsze używam.źródło
Dobra, odpowiedzi udzielone mi przez inne osoby były bliskie, ale to nie zadziałało. Oto co zrobiłem.
Robiąc to...
... dał mi następujący status.
Potem musiałem
git reset
jeszcze kilka razy wpisać to samo polecenie. Za każdym razem, gdy to robiłem, wiadomość zmieniała się o jedną, jak widać poniżej.W tym momencie zobaczyłem, że komunikat o statusie się zmienił, więc spróbowałem zrobić
git pull
, a to wydawało się działać:Tak krótko mówiąc, moje polecenia sprowadzały się do tego:
źródło
HEAD^^^^
origin/master
;)Możesz użyć,
git reflog
aby znaleźć poprzednią kasę. Czasami jest to dobry stan, do którego chcesz wrócić.Konkretnie,
źródło
Jeśli jesteś w trakcie łączenia, zawsze możesz go przerwać
git merge --abort
źródło
Byłem w stanie rozwiązać ten problem za pomocą jednego polecenia, które nie wymaga wyszukiwania identyfikatora zatwierdzenia.
Przyjęta odpowiedź nie działała dla mnie, ale to polecenie osiągnęło wyniki, których szukałem.
źródło
Jeśli jeszcze tego nie zrobiłeś, możesz tylko użyć
Cofnie scalenie (i wszystko, co zrobiłeś).
źródło
Przeszedłem do tego pytania, również chcąc przywrócić dopasowanie do źródła (tj. NO zatwierdza przed początkiem). Dalsze badania wykazały, że istnieje
reset
polecenie, które dokładnie to:git reset --hard @{u}
Uwaga:
@{u}
jest skrótem odorigin/master
. (I oczywiście potrzebujesz tego zdalnego repozytorium, aby to działało).źródło
Musisz zmienić HEAD, oczywiście nie twoja HEAD ....
Więc zanim odpowiemy, dodajmy trochę tła, wyjaśniając, co to jest
HEAD
.First of all what is HEAD?
HEAD
jest po prostu odniesieniem do bieżącego zatwierdzenia (najnowszego) w bieżącej gałęzi.W
HEAD
danym momencie może być tylko jeden . (nie liczącgit worktree
)Zawartość
HEAD
jest przechowywana w środku.git/HEAD
i zawiera 40 bajtów SHA-1 bieżącego zatwierdzenia.detached HEAD
Jeśli nie korzystasz z ostatniego zatwierdzenia, co oznacza, że
HEAD
nazywa się to wcześniejszym zatwierdzeniem w historiidetached HEAD
.W wierszu polecenia będzie to wyglądało tak: SHA-1 zamiast nazwy gałęzi, ponieważ
HEAD
nie wskazuje ona końca wierzchołka bieżącej gałęziKilka opcji odzyskiwania po odłączeniu HEAD:
git checkout
Spowoduje to pobranie nowej gałęzi wskazującej żądany zatwierdzenie.
To polecenie pobierze do danego zatwierdzenia.
W tym momencie możesz utworzyć gałąź i od tego momentu zacząć pracować.
git reflog
Zawsze możesz również użyć
reflog
.git reflog
wyświetli każdą zmianę, która zaktualizowałaHEAD
i sprawdzenie żądanego wpisu ponownego logowania spowodujeHEAD
powrót do tego zatwierdzenia.Za każdym razem, gdy HEAD zostanie zmodyfikowany, pojawi się nowy wpis w
reflog
Spowoduje to powrót do żądanego zatwierdzenia
git reset --hard <commit_id>
„Przenieś” HEAD z powrotem do żądanego zatwierdzenia.
możesz również korzystać z nich
git rebase --no-autostash
.git revert <sha-1>
„Cofnij” podany zakres zatwierdzania lub zatwierdzania.
Polecenie reset spowoduje „cofnięcie” wszelkich zmian dokonanych w danym zatwierdzeniu.
Nowe zatwierdzenie z łatką cofania zostanie zatwierdzone, podczas gdy oryginalne zatwierdzenie pozostanie również w historii.
Ten schemat ilustruje, które polecenie robi co.
Jak widać,
reset && checkout
zmodyfikujHEAD
.źródło
Najprostsza odpowiedź jest udzielona przez odinho - Velmont
Najpierw zrób
git reset --merge ORIG_HEAD
Dla tych, którzy chcą zresetować po wprowadzeniu zmian, zrób to (ponieważ jest to pierwszy post widziany w przypadku pytań dotyczących scalania resetowania git)
git push origin HEAD --force
Spowoduje to zresetowanie w taki sposób, że po ściągnięciu nie otrzymasz ponownie scalonych zmian.
źródło
Tylko dla dodatkowej opcji do obejrzenia, głównie podążałem za modelem rozgałęziania opisanym tutaj: http://nvie.com/posts/a-successful-git-branching-model/ i jako taki połączyłem się z
--no-ff
(nie przewijanie do przodu) zwykle.Właśnie przeczytałem tę stronę, ponieważ przypadkowo połączyłem gałąź testową zamiast gałęzi wydania z masterem do wdrożenia (strona internetowa, master jest tym, co jest na żywo). W gałęzi testowej połączono dwie inne gałęzie, których suma wynosi około sześć zatwierdzeń.
Tak więc, aby cofnąć całe zatwierdzenie, potrzebowałem tylko jednego
git reset --hard HEAD^
i to odwróciło całe scalenie. Ponieważ połączenia nie zostały szybko przekazane, scalenie było blokiem, a jeden krok wstecz to „gałąź nie scalona”.źródło
Możesz użyć tylko dwóch poleceń, aby cofnąć scalenie lub zrestartować przez określone zatwierdzenie:
git reset --hard commitHash
(powinieneś użyć zatwierdzenia, które chcesz zrestartować, np. 44a587491e32eafa1638aca7738)git push origin HEAD --force
(Wysyłanie nowego lokalnego oddziału głównego do źródła / wzorca)Powodzenia i śmiało!
źródło
Można to zrobić na wiele sposobów.
1) Przerwij scalanie
Jeśli znajdujesz się pomiędzy złym scaleniem (błędnie zrobionym z niewłaściwą gałęzią) i chciałeś uniknąć scalenia, aby wrócić do gałęzi najpóźniej jak poniżej:
2) Zresetuj HEAD do zdalnej gałęzi
Jeśli pracujesz ze zdalnej gałęzi rozwoju, możesz zresetować HEAD do ostatniego zatwierdzenia na zdalnej gałęzi, jak poniżej:
3) Usuń bieżącą gałąź i ponownie dokonaj płatności ze zdalnego repozytorium
Biorąc pod uwagę, że pracujesz nad rozwojem oddziału w lokalnym repozytorium, który synchronizuje się ze zdalnym / develop oddziału, możesz wykonać następujące czynności:
źródło
Jeśli twoje scalenie i odpowiednie zatwierdzenia nie zostały jeszcze wypchnięte, zawsze możesz przełączyć się na inną gałąź, usunąć oryginalną i ponownie ją utworzyć.
Na przykład przypadkowo połączyłem gałąź rozwoju w master i chciałem to cofnąć. Wykonując następujące kroki:
Voila! Mistrz jest na tym samym etapie, co pochodzenie, a twój źle połączony stan zostaje skasowany.
źródło
Jeśli chcesz skorzystać z rozwiązania wiersza polecenia, sugeruję skorzystanie z odpowiedzi MBO.
Jeśli jesteś nowicjuszem, możesz polubić podejście graficzne:
gitk
(z linii poleceń lub kliknij prawym przyciskiem myszy w przeglądarce plików, jeśli ją masz)źródło
Strategia: Utwórz nowy oddział, z którego wszystko będzie dobrze.
Uzasadnienie: Cofnięcie scalenia jest trudne. Istnieje zbyt wiele rozwiązań, w zależności od wielu czynników, takich jak to, czy dokonałeś lub przeforsowałeś scalenie, czy też od czasu scalenia pojawiły się nowe zatwierdzenia. Ponadto nadal musisz mieć dość głębokie zrozumienie git, aby dostosować te rozwiązania do swojej sprawy. Jeśli ślepo zastosujesz się do instrukcji, możesz skończyć z „pustym połączeniem”, w którym nic nie zostanie scalone, a kolejne próby scalenia sprawią, że Git powie ci „Już aktualne”.
Rozwiązanie:
Powiedzmy, że chcesz połączyć
dev
sięfeature-1
.Znajdź wersję, która ma zostać scalona:
Sprawdź to (cofnij się w czasie):
Utwórz nowy oddział stamtąd i sprawdź:
Teraz możesz ponownie uruchomić scalanie:
Łączyć:
git merge dev
Napraw konflikty scalania.
Popełnić:
git commit
Gdy wyniki będą satysfakcjonujące, usuń starą gałąź:
git branch --delete feature-1
źródło
Wystarczy utworzyć nowy oddział, a następnie wybrać do niego pożądane zatwierdzenia.
Jego oszczędzanie i prostota resetuje opisane w wielu odpowiedziach powyżej
źródło
Myślę, że możesz zrobić,
git rebase -i [hash] [branch_name]
gdzie[hash]
jest skrót identyfikujący dla tego, jak daleko wstecz chcesz przewinąć plus jeden (lub wiele cofnięć, które chcesz przejść), a następnie usunąć wiersze dla zatwierdzeń w edytorze, których już nie chcesz . Zapisz plik. Wyjście. Modlić się. I powinno być przewinięte. Być może będziesz musiał zrobićgit reset --hard
, ale w tym momencie powinno być dobrze. Możesz także użyć tego do wyciągnięcia określonych zatwierdzeń ze stosu, jeśli nie chcesz zachować ich w swojej historii, ale może to pozostawić repozytorium w stanie, którego prawdopodobnie nie chcesz.źródło
Jeśli dokonałeś scalenia:
źródło
Najpierw upewnij się, że wszystko popełniłeś.
Następnie zresetuj repozytorium do poprzedniego stanu roboczego:
lub używając
--hard
( spowoduje to usunięcie wszystkich lokalnych, niezatwierdzonych zmian! ):Użyj skrótu, który był tam przed nieprawidłowo połączonym zatwierdzeniem.
Sprawdź, które zatwierdzenia chcesz ponownie zatwierdzić w poprzedniej poprawnej wersji, wykonując:
Zastosuj swoje właściwe zatwierdzenia w górnej części właściwej wersji repozytorium przez:
Za pomocą cherry-pick (zmiany wprowadzone przez niektóre istniejące commity)
Lub przez wybranie zakresu zatwierdzeń przez:
Najpierw sprawdź poprawne zmiany przed ich scaleniem:
Najpierw sprawdź poprawne zmiany przed ich scaleniem:
gdzie jest to zakres poprawnych zatwierdzeń, które popełniłeś (z wyjątkiem błędnie popełnionego scalenia).
źródło
git stash
git branch -d the_local_branch
git checkout -t <name of remote>
git stash apply
To działało dla mnie .. !!
źródło
Jeśli zauważysz, że trzeba przywrócić natychmiast po scaleniu i nie zrobili niczego innego po próbie scalenia, wystarczy wydać polecenie:
git reset --hard HEAD@{1}
.Zasadniczo twoje scalenie
sha
będzie wskazywać,HEAD@{0}
czy nic więcej nie zostało popełnione po scaleniu, podobnieHEAD@{1}
jak poprzedni punkt przed scaleniem.źródło
Najprostsza z najprostszych szans, znacznie prostsza niż cokolwiek tu powiedziane:
Usuń oddział lokalny (lokalny, nie zdalny) i pociągnij go ponownie. W ten sposób cofniesz zmiany w gałęzi master i na każdego wpłynie zmiana, której nie chcesz forsować. Zacznij od nowa.
źródło
W takim przypadku będziesz chciał zresetować swój oddział
git reset --hard <branch_name>
. Jeśli chcesz zapisać zmiany przed ich zresetowaniem, pamiętaj o utworzeniu nowego oddziału igit checkout <branch_name>
.Możesz również zresetować stan do konkretnego zatwierdzenia za pomocą
git reset --hard <commit_id>
.Jeśli zmiany zostały wprowadzone, możesz użyć
git revert <branch_name>
zamiast tego. Koniecznie sprawdź, jak używać git revert i git checkout w innych scenariuszach.źródło