Altes Commit auschecken und zu einem neuen Commit machen [duplicate]

Lesezeit: 7 Minuten

Altes Commit auschecken und zu einem neuen Commit machen duplicate
Hummel

Sagen Sie auf Git, ich vermassele meine Commits und möchte die Commits der Version 3 von vorn als neue Version machen. Wenn ich mache git checkout xxxx, es erstellt einen neuen Zweig und es scheint, als könnte ich ihn nur zusammenführen? Könnte ich dies zur neuen “Master-Version” machen?

Ich will:

A-B-C-D-E

werden

A-B-C-D-E-F

wobei F genau den gleichen Inhalt wie C hat

Wenn ich benutze git revert xxxx Stattdessen scheint es definitiv Konflikte zu geben, und ich muss sie manuell lösen.

Was ich wirklich will, ist, den alten Commit irgendwann zum neuen Commit zu machen, unabhängig davon, was sich in meinem Arbeitsverzeichnis oder im letzten Commit befindet.

Wie würde ich vorgehen?

  • gerade git checkout <commit-hash> . Verpassen Sie nicht den letzten Punkt im Befehl

    – Ibrahim Tayseer

    12. März 2020 um 10:20 Uhr

  • @IbrahimTayseer Ja, aber git rm -r . ist vor diesem Befehl ziemlich notwendig, andernfalls, wenn es eine Datei gibt, die in der neueren Version vorhanden ist, aber nicht in der älteren Version, wird sie immer noch aufbewahrt.

    – Hummel

    13. März 2020 um 0:24 Uhr


  • ja, du hast recht 🙂

    – Ibrahim Tayseer

    13. März 2020 um 7:21 Uhr

  • Kein Duplikat, IMO, da diese Frage die vorherigen Commits im linearen Verlauf für zukünftige Referenzen behalten möchte. Ich hatte das gleiche Bedürfnis, und die Antwort von svick unten funktionierte für mich, während die “duplizierte” Frage weniger hilfreich war.

    – ultrasanft

    2. November 2021 um 13:46 Uhr

git rm -r .
git checkout HEAD~3 .
git commit

Nach dem Commit werden Dateien im neuen HEAD werden die gleichen sein wie in der Überarbeitung HEAD~3.

  • Nein, nur git checkout XXXXX. rev~n bedeutet n Überarbeitungen vor rev.

    – schick

    4. August 2010 um 17:39 Uhr

  • Der Punkt nach HEAD~3 ist wichtig.

    – Buser

    21. Februar 2012 um 16:54 Uhr

  • Das funktioniert, aber ich denke, es sollte einen eleganteren Weg geben, dies zu tun.

    – Gabriel Süd

    10. April 2012 um 22:16 Uhr

  • Bei einem großen Repo dauert es eine Weile, bis alle Dateien gelöscht und dann alle wieder ausgecheckt sind. Ich bin der Meinung, dass Git eine Möglichkeit haben sollte, zu einer alten Revision zurückzukehren, ohne alles löschen zu müssen. Aber das ist nur meine Meinung, das hat bei mir gut funktioniert und ich habe keinen besseren Weg gesehen, als ich nach Alternativen gesucht habe.

    – Gabriel Süd

    10. April 2012 um 22:39 Uhr

  • Möglich, als Antwort zu erklären, was rm -r . tut?

    – 2540625

    6. Mai 2016 um 22:41 Uhr

Es hört sich so an, als wollten Sie nur auf C zurücksetzen. das ist den Baum machen:

ABC

Das kannst du mit reset:

git reset --hard HEAD~3

(Hinweis: Sie sagten vor drei Commits, also habe ich das geschrieben; in Ihrem Beispiel ist C nur zwei Commits her, also möchten Sie vielleicht verwenden HEAD~2)


Sie können auch verwenden revert wenn Sie möchten, obwohl Sie meines Wissens nach die Reverts einzeln ausführen müssen:

git revert HEAD     # Reverts E
git revert HEAD~2   # Reverts D

Dadurch wird ein neues Commit F erstellt, das den gleichen Inhalt wie D hat, und G, das den gleichen Inhalt wie C hat. Das können Sie rebase um diese zusammenzuquetschen, wenn Sie wollen

  • Hallo danke für die Antwort. Aber was ist, wenn ich den Hard-Reset nicht durchführen möchte, da er bereits in ein öffentliches Repository verschoben wurde?

    – Hummel

    1. August 2010 um 11:02 Uhr

  • @huggie Ah. Dann möchten Sie wahrscheinlich die Wiederherstellungsmethode verwenden

    – Michael Mrozek

    1. August 2010 um 18:05 Uhr

  • dann git push -f um Push zu erzwingen

    – radtek

    30. November 2014 um 5:39 Uhr

  • Wird Commit „E“ beibehalten und ein neues Commit „F“ erstellt?

    – Choylton B. Higginbottom

    2. Juni 2016 um 16:36 Uhr

  • @meetalexjohnson Die Revert-Methode funktioniert; revert macht einen neuen Commit, der das Gegenteil des von Ihnen angegebenen Commit ist, also heben sie sich auf. Der erste Revert würde F zum Gegenteil von E machen, und der zweite würde G zum Gegenteil von D machen, sodass Sie am Ende denselben Code haben, den Sie bei C hatten. Deshalb ist der zweite Revert so HEAD~2 anstatt HEAD~1 — F ist der Head-Commit nach dem ersten, also müssen Sie 2 zurückgehen, um auf D zu verweisen

    – Michael Mrozek

    2. Juni 2016 um 17:42 Uhr

eloone hat es Datei für Datei mit gemacht

git checkout <commit-hash> <filename>

aber Sie könnten alle Dateien einfacher auschecken, indem Sie dies tun

git checkout <commit-hash> .

  • Dies führt zu einer Ablehnung beim Pushen zum Ursprung.

    – 2540625

    6. Mai 2016 um 22:43 Uhr

  • Das funktioniert für mich. Das Pushen zum Ursprung war kein Problem.

    – Noffls

    2. März 2017 um 8:47 Uhr


  • damit git checkout <commit-hash> wird sich lösen HEAD (Push wird abgelehnt), git checkout <commit-hash> . sollte zur Kasse gehen . (alle Änderungen) aus dem Commit in Ihren Arbeitsbaum, den Sie als neuen Commit anwenden können. Sie können sich auch lösen HEAD und von diesem Commit abzweigen. Es sollte dann bei sein HEAD für den neuen Zweig und Sie können sich dort festlegen. Die . ist wichtig.

    – Brandon G

    11. Juli 2018 um 17:57 Uhr


Altes Commit auschecken und zu einem neuen Commit machen duplicate
elone

Genau das wollte ich tun. Ich war mir des vorherigen Befehls nicht sicher git cherry-pick Ces klingt nett, aber es scheint, dass Sie dies tun, um Änderungen von einem anderen Zweig zu erhalten, aber nicht vom selben Zweig, hat es jemand versucht?

Also habe ich etwas anderes gemacht, was auch funktioniert hat: Ich habe die Dateien, die ich wollte, Datei für Datei aus dem alten Commit zurückbekommen

git checkout <commit-hash> <filename>

Ex :
git checkout 08a6497b76ad098a5f7eda3e4ec89e8032a4da51 file.css

-> Dies übernimmt die Dateien so, wie sie vom alten Commit waren

Dann habe ich meine Änderungen vorgenommen. Und ich habe wieder zugesagt.

git status (to check which files were modified)
git diff (to check the changes you made)
git add .
git commit -m "my message"

Ich habe meine Geschichte mit überprüft git log, und ich habe immer noch meinen Verlauf zusammen mit meinen neuen Änderungen, die aus den alten Dateien vorgenommen wurden. Und pushen konnte ich auch.

Beachten Sie, dass Sie, um zu dem gewünschten Zustand zurückzukehren, den Hash des Commit vor die unerwünschten Änderungen setzen müssen. Stellen Sie außerdem sicher, dass Sie keine nicht festgeschriebenen Änderungen haben, bevor Sie das tun.

git cherry-pick C

wobei C der Commit-Hash für C ist. Dies wendet den alten Commit auf den neuesten an.

  • git cherry-pick C nimmt die Änderungen eingeführt von C und wendet sie auf E an. Dies ist nicht das, wonach das OP gefragt hat. Er möchte die Dateien genau in dem Zustand haben, in dem sie sich in C befanden, was git checkout bietet.

    – Gotgene

    30. Mai 2013 um 13:06 Uhr

1646254088 262 Altes Commit auschecken und zu einem neuen Commit machen duplicate
haydenmühl

Die anderen bisherigen Antworten erstellen neue Commits, die das rückgängig machen, was in älteren Commits enthalten ist. Es ist möglich, zurück zu gehen und sozusagen die “Geschichte zu ändern”, aber das kann ein bisschen gefährlich sein. Du solltest nur tun Sie dies, wenn der Commit, den Sie ändern, nicht in andere Repositories gepusht wurde.

Der gesuchte Befehl ist git rebase --interactive

Wenn Sie HEAD~3 ändern möchten, lautet der Befehl, den Sie ausgeben möchten git rebase --interactive HEAD~4. Dadurch wird ein Texteditor geöffnet, in dem Sie angeben können, welche Commits Sie ändern möchten.

Üben Sie an einem anderen Repository, bevor Sie dies mit etwas Wichtigem versuchen. Die Manpages sollten Ihnen alle weiteren Informationen geben, die Sie benötigen.

  • git cherry-pick C nimmt die Änderungen eingeführt von C und wendet sie auf E an. Dies ist nicht das, wonach das OP gefragt hat. Er möchte die Dateien genau in dem Zustand haben, in dem sie sich in C befanden, was git checkout bietet.

    – Gotgene

    30. Mai 2013 um 13:06 Uhr

916000cookie-checkAltes Commit auschecken und zu einem neuen Commit machen [duplicate]

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

Privacy policy