Jak cofnąć" git commit --amend "zrobione zamiast" git commit"

Przypadkowo zmieniłem poprzedni commit. Commit powinien być oddzielony, aby zachować historię zmian, które wprowadziłem do danego pliku.

Czy istnieje sposób na cofnięcie ostatniego commita? Jeśli zrobię coś takiego jak git reset --hard HEAD^, pierwszy commit również zostanie cofnięty.

(nie wcisnąłem jeszcze żadnych zdalnych katalogów)

Author: alex, 2009-09-22

9 answers

Musisz utworzyć nowy commit z tymi samymi szczegółami co bieżący HEAD commit, ale z rodzicem jak poprzednia wersja HEAD. git reset --soft przesunie wskaźnik gałęzi tak, aby następny commit pojawił się na innym commicie niż obecny.

# Move the current head so that it's pointing at the old commit
# Leave the index intact for redoing the commit.
# HEAD@{1} gives you "the commit that HEAD pointed at before 
# it was moved to where it currently points at". Note that this is
# different from HEAD~1, which gives you "the commit that is the
# parent node of the commit that HEAD is currently pointing to."
git reset --soft HEAD@{1}

# commit the current tree using the commit details of the previous
# HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the
# previous command. It's now pointing at the erroneously amended commit.)
git commit -C HEAD@{1}
 1720
Author: CB Bailey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-17 04:43:13

Użyj ref-log :

git branch fixing-things HEAD@{1}
git reset fixing-things

Wtedy powinieneś mieć wszystkie wcześniej zmienione zmiany tylko w swojej kopii roboczej i można zatwierdzić ponownie

Aby zobaczyć pełną listę poprzednich indeksów wpisz git reflog

 107
Author: knittl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-22 10:14:20

Znajdź zmienione commity przez:

git log --reflog

Uwaga: możesz dodać --patch, aby zobaczyć treść commitów dla jasności. Tak samo jak git reflog.

Następnie zresetuj głowę do poprzedniego commita w punkcie, w którym było dobrze przez:

git reset SHA1 --hard

Uwaga: Zastąp SHA1 Twoim rzeczywistym Hashem commit. Zauważ również, że to polecenie spowoduje utratę wszelkich niezatwierdzonych zmian, więc możesz je wcześniej ukryć. Zamiast tego należy użyć --soft.

Następnie cherry-wybierz drugą commit, którego potrzebujesz na górze:

git cherry-pick SHA1
 34
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-21 03:55:37

Zawsze możesz podzielić commit, Z instrukcji

  • Uruchom interaktywny rebase z git rebase-I commit^, gdzie commit jest zatwierdzeniem, które chcesz podzielić. W rzeczywistości każdy zakres commitów wystarczy, o ile zawiera ten commit.
  • zaznacz commit, który chcesz podzielić akcją "edytuj".
  • jeśli chodzi o edycję tego commita, wykonaj GIT reset HEAD^. Efekt polega na tym, że głowica jest przewijana o jeden, A Indeks podąża za nim. Jednak drzewo robocze pozostaje bez zmian.
  • Dodaj teraz zmiany do indeksu, które chcesz mieć w pierwszym zatwierdzeniu. W tym celu możesz użyć git add (ewentualnie interaktywnie) lub git-gui (lub obu).
  • Zatwierdź indeks now-current z dowolnym Komunikatem zatwierdzającym.
  • powtórz dwa ostatnie kroki, aż drzewo robocze będzie czyste.
  • Kontynuuj rebase używając git rebase --continue.
 21
Author: Arkaitz Jimenez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-22 10:01:22

Maybe can use git reflog to get two commit before amend i after amend.

Następnie użyj git diff before_commit_id after_commit_id > d.diff, Aby uzyskać diff pomiędzy przed poprawką a po poprawce.

Następnie użyj git checkout before_commit_id, aby powrócić do przed zatwierdzeniem

I ostatnie użycie git apply d.diff do zastosowania prawdziwej zmiany, którą dokonałeś.

To rozwiązuje mój problem.
 13
Author: utzcoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-19 07:34:51

Być może warto zauważyć, że jeśli nadal jesteś w edytorze z Komunikatem o zatwierdzeniu, możesz go usunąć i spowoduje to przerwanie polecenia git commit --amend.

 12
Author: Justin Schulz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-03 18:45:09

Możesz zrobić poniżej, aby cofnąć "git commit-amend"

  1. $ Git reset --soft HEAD^
  2. $ git checkout files_from_old_commit_on_branch
  3. $ git pull origin your_branch_name

====================================

Teraz Twoje zmiany są jak poprzednie. Koniec z cofaniem dla " git commit-amend" Teraz możesz zrobić "git push origin", aby wcisnąć do gałęzi

 2
Author: Pratik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-25 11:46:23

Prawie 9 lat później, ale nie widziałem tej odmiany, o której wspomniano (to rodzaj kombinacji kilku z nich, podobnej do top answer ( https://stackoverflow.com/a/1459264/4642530).

Wyszukaj wszystkie wolnostojące głowy na gałęzi

git reflog show origin/BRANCH_NAME --date=relative

Następnie znajdź hash SHA1

Reset do starego SHA1

git reset --hard SHA1

Następnie odepchnij go z powrotem. w górę.

git push origin BRANCH_NAME

Załatwione.

To całkowicie przywróci ci Stary commit.

(wraz z datą wcześniejszego nadpisania oddzielnej głowicy commit)

 1
Author: garrettmac,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-17 21:55:20
  1. Checkout do tymczasowej gałęzi z ostatnim zatwierdzeniem

    git branch temp HEAD@{1}

  2. Resetuj ostatni commit

    git reset temp

  3. Teraz będziesz mieć wszystkie pliki, które zatwierdzisz, jak również poprzedni commit. Sprawdź status wszystkich plików.

    git status

  4. Zresetuj pliki commitów z git stage.

    git reset myfile1.js (tak dalej)

  5. Reattach this commit

    git commit -C HEAD@{1}

  6. Dodaj i zatwierdź swoje pliki do nowego zatwierdzenia.

 0
Author: Priyanshu Chauhan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-04 07:28:58