wie man das Zurücksetzen eines Commits abschließt und wie man viele Commits rückgängig macht

Lesezeit: 6 Minuten

Benutzer-Avatar
Pat Farell

Das muss einfach sein, aber ich kann es nicht finden git-scm.

Ich habe viele kleine Verpflichtungen für ein öffentliches Projekt eingegangen, und all meine Arbeit ist schlecht. Ich möchte alles entfernen, was ich getan habe. Einige habe ich nur lokal festgeschrieben, andere habe ich zum ‘Origin Master’ gepusht.

Der erste Commit (vor einer Woche) ist bdbad86… mit dem jüngsten Wesen e82401b

Ich möchte nur, dass all diese verschwinden. Ich habe versucht, einen zurückzusetzen.

git status  
# On branch master  
# You are currently reverting commit e82401b.  
#   (all conflicts fixed: run "git revert --continue")  
#   (use "git revert --abort" to cancel the revert operation)  
  1. Ich kann nicht herausfinden, wie ich dieses Zurücksetzen beenden kann.
  2. Ich möchte nicht jeden Commit separat machen müssen, ich möchte sie alle umhauen.

  • git revert --abort hat bei mir funktioniert.

    – Mark Khan

    21. Januar 2020 um 13:33 Uhr

Benutzer-Avatar
Chris Hayes

Ich gehe hier davon aus, dass niemand sonst Commits zwischen Ihre Arbeit eingefügt hat und dass Ihre schlechten Commits einen kontinuierlichen Bereich in der Historie des Repos bilden. Sonst musst du komplizierter werden. Nehmen wir an, Ihr Verlauf sieht so aus:

e82401b - (master, HEAD) My most recent private commit
...
bc2da37 - My first private commit
cf3a183 - (origin/master) My most recent bad public commit
...
292acf1 - My first bad public commit
82edb2a - The last good public commit

Das erste, was wir tun möchten, ist, die Commits wegzublasen, die Sie noch nicht veröffentlicht haben. Sie können dies mit dem folgenden Befehl (Beachten Sie, dass Ihre Änderungen weg sind und als nicht wiederherstellbar betrachtet werden sollten):

git reset --hard cf3a183 

Äquivalent (und besser lesbar):

git reset--hard origin/master

Jetzt stimmt Ihre Ansicht des Repositorys mit der Ansicht darin überein origin/master. Sie möchten nun Ihre schlechten öffentlichen Änderungen rückgängig machen und als Revert-Commit veröffentlichen. Diese Anweisungen dienen zum Erstellen eines einzelnen Revert-Commits.

Sie können verwenden git revert --no-commit a..b um alle Commits ab dem Commit rückgängig zu machen nach a (beachten Sie das!) und endet bei und einschließlich commit b. Die Umkehrung wird inszeniert, damit Sie sie übernehmen können. Hier würden wir also Folgendes tun:

git revert --no-commit 82edb2a..HEAD

Oder gleichwertig:

git revert --no-commit 292acf1^..HEAD

Daran erinnern HEAD zeigt jetzt auf die gleiche Stelle wie origin/master.

Nach dem Ausführen der revert Befehl haben Sie jetzt Ihre Änderungen bereitgestellt und können übernommen werden, also führen Sie einfach einen einfachen aus git commit -m "Reverting those bad changes I accidentally pushed and made public".

  • Danke, das ist die Art von Informationen, die ich brauchte. Eine zusätzliche Frage: Wie bekomme ich die Informationen (master, HEAD) oder (origin/master), damit ich sagen kann, wann ich die beiden Befehlssätze ausführen soll?

    – Pat Farell

    16. Dezember 2013 um 6:13 Uhr

  • @Pat Am einfachsten ist es, eine alternative Form von einzurichten git log um diese Informationen auf einen Blick zu erhalten. Du kannst lesen hier über das zu verwendende Format. Eine gute Ausgangsbasis sieht in etwa so aus: git log --pretty="%h %Cgreen%d%Creset %s %an %Cblue(%cr)"

    – Chris Hayes

    16. Dezember 2013 um 6:18 Uhr


Anstatt zu laufen

git revert --continue

Renn einfach

git commit -m "commit message here"

Wenn das nicht funktioniert, vergewissern Sie sich, dass Sie alle an der Wiederherstellung beteiligten Dateien bereitgestellt haben. Sogar die Dateien, die Sie zurückgesetzt und dann geändert haben.

  • Ich stellte fest, dass ich immer noch im Umkehrzustand feststeckte, obwohl ich alles begangen hatte. Ich musste laufen git commit -m "empty commit to escape revert" --allow-emptyaber das scheint es behoben zu haben.

    – Ryan1729

    5. Februar 2021 um 19:36 Uhr


Diese Frage wurde bereits richtig beantwortet, aber ich möchte nur auf den ersten Punkt der Frage des Ops eingehen – Ich kann nicht herausfinden, wie ich dieses Zurücksetzen beenden kann. wenn auch Sie wie ich im Rückfallzustand feststeckten und hier nach einer Antwort suchten.

es kann so einfach sein git revert --continue. aber nur, wenn Sie einige Änderungen in einer Datei rückgängig machen. Wenn Sie im Wiederherstellungszustand stecken bleiben, liegt das höchstwahrscheinlich daran, dass Sie versuchen, einen Commit rückgängig zu machen, der eine Datei erstellt hat, und diese Datei in einem der nachfolgenden Commits geändert wird.

nimm ein beispiel:

1c40cd3 added fileB
4e06828 added fileA
faf29dd (origin/main, origin/HEAD, main) Merged in feature5 (pull request #13)
6e735e3 (origin/feature5, feature5) updated file.txt
fb51fca added file.txt
744ba74 Initial commit

jetzt, wenn Sie versuchen, zurückzukehren fb51fca (added file.txt)es wird Ihnen so etwas zeigen wie:

$ git revert fb51fca
CONFLICT (modify/delete): file.txt deleted in parent of fb51fca (added file.txt) and modified in HEAD.  Version HEAD of file.txt left in tree.
error: could not revert fb51fca... added file.txt
hint: After resolving the conflicts, mark them with
hint: "git add/rm <pathspec>", then run
hint: "git revert --continue".
hint: You can instead skip this commit with "git revert --skip".
hint: To abort and get back to the state before "git revert",
hint: run "git revert --abort".

$ git status
On branch feature6
You are currently reverting commit fb51fca.
  (fix conflicts and run "git revert --continue")
  (use "git revert --skip" to skip this patch)
  (use "git revert --abort" to cancel the revert operation)

Unmerged paths:
  (use "git restore --staged <file>..." to unstage)
  (use "git add/rm <file>..." as appropriate to mark resolution)
        deleted by them: file.txt

man sieht es deutlich file.txt deleted in fb51fca (added file.txt) and modified in HEAD. Version HEAD of file.txt left in tree.. Jetzt können Sie tun git add -A und git commit ... ABER

was revert tut, geht zurück in die Historie (im angegebenen Commit) und entfernt die Änderungen, die in diesem Commit vorgenommen wurden. und macht ein neues Commit. Das Problem ist jedoch, dass Sie eine Datei erstellt haben und diese jetzt durch Zurücksetzen gelöscht wird. Am Ende bleibt keine Datei übrig, die bereitgestellt werden kann, und wie Sie wissen, erlaubt Git keine leeren Verzeichnisse oder leeren Commits.

aber es gibt eine Problemumgehung für leere Commits. wie Ryan vorgeschlagen hat, können Sie tun git commit -m "empty commit to escape revert" --allow-empty. git revert verwendet dies wahrscheinlich nicht --allow-empty Flag und das ist wahrscheinlich der Grund, warum ein Commit nicht ausgeführt werden kann und im Wiederherstellungszustand hängen bleibt.

Wie auch immer, wenn Sie im Wiederherstellungszustand stecken bleiben, machen Sie wahrscheinlich etwas falsch. versuchen, etwas rückgängig zu machen, das keinen Sinn ergibt.

1175240cookie-checkwie man das Zurücksetzen eines Commits abschließt und wie man viele Commits rückgängig macht

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy