Anulować polecenie git merge, która do tej pory nie pchnął

w mojej głównej gałęzi zrobiłem git merge some-other-branch lokalnie, ale nigdy nie naciskał zmiany na origin master. Nie chciałem zgrywać, więc chciałbym to cofnąć. Podczas wykonywania git status po mojej korespondencji otrzymałem komunikat:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

na podstawie niektórych instrukcji nie znalazłem próbowałem użyć

git revert HEAD -m 1

ale teraz pojawia się ten komunikat z git status:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

nie chcę, aby moja gałąź została do przodu na dowolną liczbę commits. Jak uzyskać wrócić do tego momentu?


git reflog sprawdź, jaka blokada jest jedną do korespondencji seryjnej (git reflog będzie lepszym rozwiązaniem, niż git log ). Następnie można go zresetować za pomocą:

git reset --hard commit_sha

nie ma innego sposobu,

git reset --hard HEAD~1

zwraca 1. utrwalenie.

należy pamiętać, że wszelkie zmienione i niezakończone/несташированные pliki zostaną przywrócone do ich bez zmian stanu. Aby utrzymać je albo stash zmiany off lub zobaczyć poniżej.


Jak @Velmont zaproponował poniżej w swojej odpowiedzi, w tym bezpośrednim przypadku za pomocą:

git reset --hard ORIG_HEAD

może dać lepsze wyniki, tak jak powinien zapisać zmiany. ORIG_HEAD będzie wskazywać na utrwalenie bezpośrednio przed scaleniem, więc nie trzeba szukać jej na własną rękę.


jeszcze jedna rada-użyj --merge przełącznik zamiast --hard ponieważ nie zrzuca zbędne pliki:

--merge

resetuje indeks i aktualizuje pliki w obszar drzewo, które różni się między i HEAD, ale zachowuje te, które różnią się między indeksem i pracy drzewem (tj. które mają zmiany, które nie zostały dodane).


zakładając, że twój lokalny mistrz nie uprzedził origin / master, powinieneś być w stanie zrobić

git reset --hard origin/master

twój lokalny master gałąź musi wyglądać identycznie origin/master.


zobacz Rozdział 4 w książce Git a oryginalny post Linusa Torvaldsa.

anulować połączenie to już było подтолкнуто:

git revert -m 1 commit_hash

koniecznie zwróć zwrot, jeśli ponownie popełnienia wątek, jak powiedział Linus.


dziwne, że nie brakowało komendami. Większość odpowiedzi pracują, ale odwołujący fuzja, która właśnie zrobili,To prosty i bezpieczny sposób:

git reset --merge ORIG_HEAD

link ORIG_HEAD będzie wskazywać na oryginalną blokadę do korespondencji seryjnej.

(The --merge opcja nie ma nic wspólnego z korespondencji seryjnej. To tak samo jak git reset --hard ORIG_HEAD, ale bezpieczniejsze, ponieważ nie dotyczy on незафиксированных zmian.)


Z nowszych wersji Git, jeśli jeszcze tego nie dokonali fuzji i masz konflikt fuzji, możesz po prostu zrobić:

git merge --abort

man git merge:

[This] można uruchomić tylko po tym, jak fuzja doprowadziła do konfliktów. git merge --abort przerywa proces scalania i spróbuje przywrócić stan do korespondencji seryjnej.


trzeba przywrócić poprzednią utrwalenie. To powinno zadziałać:

git reset --hard HEAD^

lub nawet HEAD^^ do zwrotu tego zwrotu zatwierdzenia. Zawsze można dać pełną link SHA, jeśli nie jesteś pewien, ile kroków do tyłu należy podjąć.

w przypadku, jeśli masz problemy, i twoja główna gałąź nie miała żadnych lokalnych zmian, można przywrócić do origin/master.


w ostatnim czasie używam git reflog, aby pomóc z tym. Jest to w zasadzie działa, tylko jeśli fuzja po prostu się stało i to było na swoim komputerze.

git reflog może zwrócić coś takiego:

fbb0c0f [email protected]{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 [email protected]{1}: checkout: moving from master to my-branch
e3753a7 [email protected]{2}: rebase finished: returning to refs/heads/master
e3753a7 [email protected]{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 [email protected]{4}: reset: moving to HEAD^
8400a0f [email protected]{5}: rebase: aborting

pierwszy wiersz wskazuje, że doszło do fuzji. Druga linia to czas do mojego korespondencji seryjnej. Ja po prostu git reset --hard 43b6032 aby ten wątek śledzić do fuzji i kontynuować.


Z nowoczesnym Git, możesz:

git merge --abort

stary składnia:

git reset --merge

starej szkoły:

git reset --hard

ale faktycznie, warto zauważyć, że git merge --abort tylko odpowiednik git reset --merge biorąc pod uwagę, że MERGE_HEAD obecny. Można to przeczytać w zespole git help for merge.

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

po nieudanej fuzji, gdy nie ma MERGE_HEAD niefortunne połączenie można anulować za pomocą git reset --merge, ale nie koniecznie git merge --abort,tak nie tylko stary i nowy składnia dla tego samego.

osobiście mi git reset --merge znacznie bardziej wydajne i użyteczne w codziennej pracy, więc to jest ten, który ja używam.


dobrze, odpowiedzi innych ludzi tutaj dali mi były zbliżone, ale to nie zadziałało. To, co zrobiłem.

to robisz...

git reset --hard HEAD^
git status

...dał mi kolejny status.

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.

mi wtedy musiałem wpisać to samo git reset polecenie jeszcze kilka razy. Za każdym razem, gdy to robiłem, komunikat zmieniło się jedno, jak widać poniżej.

> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.

w tym momencie zobaczyłem, że wiadomość o stanie zmieniło, więc próbowałem zrobić git pull i co, wydawało się, praca:

> git pull
Updating 2df6af4..12bbd2f
Fast forward
 app/views/truncated |    9 ++++++---
 app/views/truncated |   13 +++++++++++++
 app/views/truncated |    2 +-
 3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master

krótko mówiąc, moje drużyny sprowadzała się do następującego:

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull

można użyć git reflog znajdź poprzednie zamówienie. Czasami jest to dobry stan, do którego chce się wracać.

dokładnie

$ git reflog
$ git reset --hard [email protected]{0}

Jeśli jeszcze tego nie zrobiłeś, możesz korzystać tylko z

$ git checkout -f

kasuje połączenie (i wszystko, co zrobiłeś).


po prostu więcej opcji, aby zobaczyć, ja w zasadzie szedł modelu rozgałęzienia, który jest opisany tutaj:http://nvie.com/posts/a-successful-git-branching-model/ i jako takie łączą się z --no-ff (nie szybkiego przewijania do przodu) normalnie.

Ja po prostu przeczytałem tę stronę, tak jak ja przypadkowo połączył wątek testów zamiast mojej gałęzi produkcji z master do wdrożenia (strona internetowa, master-to jest to, że live). Gałąź badań ma dwie inne gałęzie, zjednoczeni z nim, i wyniki około sześciu popełnia.

dlatego, aby zwrócić całą blokadę, tylko potrzebowałam git reset --hard HEAD^ i oddał wszystko scalić. Ponieważ korespondencji seryjnej nie zostały szybko przekierowany, połączenie było blokiem, a jeden krok w tył - "gałąź nie jest sprzężone".


można użyć tylko dwie drużyny, aby powrócić połączenia lub ponownego uruchomienia za pomocą określonej zatwierdzenia:

  1. git reset --hard commitHash (musisz użyć blokadę, którą chcesz ponownie uruchomić, na przykład. 44a587491e32eafa1638aca7738)
  2. git push origin HEAD --force (wysyłanie nowej lokalnej głównej gałęzi w origin / master)

powodzenia i do przodu!


dotarł do tej kwestii, także szukając, aby powrócić do dopasowania origin (czyli żadnych commits przed origin). Badając dalej, okazało się, że jest reset zespół właśnie do tego:

git reset --hard @{u}

Uwaga: @{u} skrót od origin/master. (I, oczywiście, trzeba, aby ten zdalnego repozytorium pracował.)


odpowiedź jest prosta-ten, który dał одиньо-Вельмон

najpierw git reset --merge ORIG_HEAD

dla tych, którzy chcą zrzucić po tym, jak zmiany zostaną wciśnięte, zrób to (Bo to pierwszy post, zauważający w przypadku jakichkolwiek pytań fuzji resetowania git)

git push origin HEAD --force

to zostanie skasowane w taki sposób, że nie dostaniesz połączone zmiany ponownie po głębie.


Jeśli scalenie i odpowiednie zmiany jeszcze nie zostały wciśnięte, zawsze możesz przełączyć się na inną gałąź, usunąć oryginalną i odtworzyć ją.

na przykład, przypadkowo połączył gałąź rozwoju w master i chciałem to cofnąć. Wykorzystując następujące kroki:

git checkout develop
git branch -D master
git branch -t master origin/master

voila! Master znajduje się na tym samym etapie, co i origin, i Twoje prawidłowo połączone stan ściera.


Jeśli chcesz rozwiązanie wiersza polecenia, proponuję po prostu iść z odpowiedzią MBO.

Jeśli jesteś początkujący, może trzeba graficzny podejście:

  1. start gitk (z wiersza polecenia lub kliknij prawym przyciskiem myszy w eksploratorze plików, jeśli masz co)
  2. można łatwo określić utrwalenie tutaj - pierwszy węzeł na górze z dwoma rodzicami
  3. kliknij na link na pierwszy / lewy rodzic (ten, który jest w aktualnej gałęzi przed scaleniem, zazwyczaj czerwony dla mnie)
  4. na wybranej zatwierdzenia kliknij prawym przyciskiem myszy "zresetować gałąź tutaj", wybierz twardy reset tam

strategia: utwórz nową gałąź, skąd wszystko było dobrze.

uzasadnienie: zwrot korespondencji seryjnej jest utrudniony. Istnieje zbyt wiele rozwiązań zależnych od wielu czynników, np. czy były ustalone lub spowodowała, że fuzja lub czy były nowe zatwierdzenia po fuzji. Ponadto, trzeba jeszcze mieć stosunkowo głębokie zrozumienie git, aby dostosować te rozwiązania do okazji. Jeśli ślepo przestrzegać pewnych wskazówek, może pojawić się " pusty fuzja", gdzie nic nie będzie łączona, i kolejne próby scalania pozwoli Git powiedzieć "już wie".

rozwiązywanie:

załóżmy, że chcesz połączyć devfeature-1.

  1. znajdź wersję, którą chcesz uzyskać połączenie:

    git log --oneline feature-1
    a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo
    e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one
    
  2. sprawdź to (wróć w czasie):

    git checkout e5f6g7h8
    
  3. utwórz nowy wątek i go sprawdzić z:

    git checkout -b feature-1
    

teraz można ponownie uruchomić połączenie:

  1. połączenie: git merge dev

  2. popraw konflikty korespondencji seryjnej.

  3. Commit:git commit

  4. gdy będziesz zadowolony z wyników, należy usunąć starą gałąź:git branch --delete feature-1


udało mi się rozwiązać ten problem za pomocą jednego polecenia, która nie zawiera wyszukiwanie identyfikatora zatwierdzenia.

git reset --hard remotes/origin/HEAD

przyjęty odpowiedź nie pracował dla mnie, ale ta drużyna osiągnęła wyniki, które szukałem.


myślę, że można zrobić git rebase -i [hash] [branch_name] tutaj [hash] jest identyfikującym z tego, jak daleko chcesz cofnąć plus jeden (lub ile commits temu chcesz iść), a następnie usuń wiersze dla commits w Edytorze, których nie chcesz. Zapisz plik. Wyjście. Modlić. I trzeba go przewinąć. Może trzeba zrobić git reset --hard, ale to powinno być dobrze w tej chwili. Można również używać do pobierania określonych commits ze stosu, jeśli nie chcesz przechowywać je w swojej historii, ale to może zostawić repozytorium w stanie, który prawdopodobnie nie chcesz.


  1. po pierwsze, upewnij się, że zrobiłaś wszystko.

  2. następnie zresetuj repozytorium poprzedniego stanu:

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
    

    lub --hard (to usunie wszystkie lokalne, nie zatwierdzone zmiany!):

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
    

    użyj skrótu, który został tam aż do swojej błędnie wspólnego zatwierdzenia.

  3. sprawdź, jakie zmiany chcesz ponownie wykonać w górnej części poprzedniego prawidłowego wersja:

    $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    ...
    
    commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
    
    ...
    
  4. zastosuj swoje prawe commit w górnej części odpowiedniej wersji swojego repozytorium:

    • Za pomocą cherry-pick (zmiany wprowadzone niektórymi istniejącymi коммитами)

          git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
      
    • lub wiśni wyborem zakresu commits na:

      • najpierw sprawdź, czy odpowiednie zmiany przed ich zjednoczeniem:

        git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
      • pierwsza kontrola odpowiednie zmiany przed ich zjednoczeniem:

        git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        

        gdzie to zakres prawidłowych commits, które popełnił (z wyłączeniem błędnie Doskonałe połączenie).


jeśli zauważysz, że musisz wrócić raz po fuzji, i nic nie zrobili po próbie połączenia, można po prostu wykonać to polecenie: git reset --hard [email protected]{1}.

w rzeczywistości, korespondencja seryjna sha będzie wskazywać na [email protected]{0} Jeśli po fuzji nic nie było i tak [email protected]{1} będzie poprzednim ustępem przed scaleniem.


najprostszy z najprostszych szans, jest znacznie łatwiejsze, niż wszystko, co tu jest napisane:

usuń lokalną gałąź (lokalną, a nie zdalną), a następnie przeciągnij ją ponownie. W ten sposób można anulować zmianę w głównej gałęzi, i wszyscy będą dotknięte zmianami, które nie chcą naciskać. Zacznij od początku.


Jeśli dokonali fuzji:

git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard

w tym przypadku chcesz zresetować swój oddział za pomocą git reset --hard <branch_name>. Jeśli chcesz zapisać zmiany przed ich odrzuceniem, należy utworzyć nową gałąź i git checkout <branch_name>.

można przywrócić stan do pewnego mocowania za pomocą git reset --hard <commit_id> Jak dobrze.

jeśli zmiany zostały wciśnięte, można użyć . Koniecznie sprawdź, jak korzystać z git powracać i git checkout w innych przypadkach, jak również.


można użyć polecenia git-reset.

git reset-resetowanie bieżącego głowicy na

określony stan. PIP reset--mieszane |

--soft / --hard / --merge] [- q] [] reset git [- q] []

[--] ... git reset --patch

[] [--] [...]

git Reset