Jak przenieść zatwierdzenie do strefy przejściowej w git?

143

Jeśli chcesz przenieść zatwierdzenie do obszaru przejściowego - to znaczy odrzucić go i przenieść wszystkie zmiany, które były w nim, do obszaru przejściowego (skutecznie ustawiając gałąź w stanie, w którym znajdowałaby się przed zatwierdzeniem) - jak ty to robisz? A może jest to coś, czego nie możesz zrobić?

Najlepiej, co wiem, jak zrobić, to skopiować wszystkie pliki, które zostały zmienione w zatwierdzeniu do innego miejsca, zresetować gałąź do zatwierdzenia przed zatwierdzeniem, które próbujesz przenieść do obszaru przejściowego, przenieść wszystkie skopiowane pliki z powrotem do repozytorium, a następnie dodaj je do obszaru przemieszczania. Działa, ale nie jest to do końca przyjemne rozwiązanie. Chciałbym móc po prostu cofnąć zatwierdzenie i przenieść jego zmianę do obszaru przejściowego. Czy da się to zrobić? A jeśli tak, to w jaki sposób?

Jonathan M Davis
źródło

Odpowiedzi:

267
git reset --soft HEAD^

Spowoduje to zresetowanie indeksu do HEAD^(poprzedniego zatwierdzenia), ale pozostawienie zmian w obszarze przejściowym.

Istnieje kilka poręcznych diagramów w git-resetDokumentach

Jeśli korzystasz z systemu Windows, może być konieczne użycie tego formatu:

git reset --soft HEAD~1
Abizern
źródło
18
Jeśli to nic nie da, spróbuj, git reset --soft HEAD~1co oznacza to samo, ale działa również w systemie Windows.
Roman Starkov
9
Dla wyjaśnienia, tylda i karot oznaczają różne rzeczy w wersjach git. HEAD ~ 1 zawsze następuje po pierwszym rodzicu zatwierdzenia, co może nie być tym, czego chcesz, jeśli jest to zatwierdzenie scalające, które ma wielu rodziców. Jeśli chodzi o powłokę cmd systemu Windows, wystarczy uciec z karota za pomocą innego karota, np. „Git reset --soft HEAD ^^”, aby wrócić do „HEAD ^”. Jest to wyłącznie artefakt powłoki cmd systemu Windows, więc nie powinieneś tego robić, jeśli używasz GUI git w systemie Windows. Tilde i karot są wyjaśnione na schacon.github.io/git/git-rev-parse#_specifying_revisions
ahains
Dodałem link do „przydatnych diagramów”. Czy możesz szybko sprawdzić, czy prowadzi do sekcji, o której mowa? Dzięki
Neuron
5

Prosty sposób

  1. Zatwierdzone pliki do obszaru przemieszczania

    git reset --soft HEAD^1

  2. Staging to UnStage : (użyj „git reset HEAD ...”, aby usunąć ze sceny)

    git reset HEAD git commands.txt or git reset HEAD *ds.txt

tutaj * -> wszystkie pliki kończą się na ds.txt do unstage.

Zobacz poniższe zdjęcie dla jasności:

wprowadź opis obrazu tutaj

Shiva Nandam Sirmarigari
źródło