wake-up-neo.net

Wie bewege ich mich? HEAD zurück zu einem vorherigen Standort? (Freistehender Kopf) & Rückgängig machen

In git habe ich versucht, einen squash commit auszuführen, indem ich einen anderen Zweig zusammenführte und dann HEAD über:

git reset Origin/master

Aber ich muss hier raus. Wie kann ich HEAD an den vorherigen Speicherort verschieben? 

Ich habe das SHA1-Fragment (23b6772) des Commits, zu dem ich es verschieben muss.
Wie kann ich zu diesem Commit zurückkehren?

95
timpone

Bevor Sie antworten, können wir etwas Hintergrund hinzufügen und erklären, was das ist HEAD.

First of all what is HEAD?

HEAD ist lediglich ein Verweis auf das aktuelle Commit (neueste) im aktuellen Zweig.
Es kann immer nur ein einziges HEAD geben. (außer git worktree)

Der Inhalt von HEAD wird in .git/HEAD gespeichert und enthält die 40 Byte SHA-1 des aktuellen Commits.


detached HEAD

Wenn Sie sich nicht am letzten Commit befinden - was bedeutet, dass HEAD auf ein vorheriges Commit in der Historie verweist, heißt es detached HEAD.

 enter image description here

In der Befehlszeile sieht es so aus - SHA-1 anstelle des Zweignamens, da HEAD nicht auf die Spitze des aktuellen Zweigs zeigt

 enter image description here


Ein paar Optionen, wie man sich von einem getrennten HEAD erholen kann:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Dadurch wird der neue Zweig ausgecheckt, der auf das gewünschte Commit zeigt.
Dieser Befehl wird zu einem bestimmten Commit ausgecheckt.
An dieser Stelle können Sie einen Zweig erstellen und ab diesem Zeitpunkt mit der Arbeit beginnen.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Sie können das reflog auch immer verwenden.
git reflog zeigt jede Änderung an, die HEAD aktualisiert hat. Wenn Sie den gewünschten Reflog-Eintrag auschecken, wird HEAD auf dieses Commit zurückgesetzt. 

Bei jeder Änderung von HEAD wird ein neuer Eintrag in reflog erstellt.

git reflog
git checkout [email protected]{...}

Dadurch gelangen Sie wieder zu Ihrem gewünschten Commit

 enter image description here


git reset --hard <commit_id>

"Bewegen" Sie Ihren HEAD zurück zum gewünschten Commit.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Hinweis: ( Seit Git 2.7 )
    Sie können auch den git rebase --no-autostash verwenden.


git revert <sha-1>

"Rückgängig machen" des angegebenen Commit- oder Commit-Bereichs.
Der Befehl zum Rücksetzen "macht" alle Änderungen rückgängig, die im angegebenen Commit vorgenommen wurden.
Ein neues Commit mit dem Undo-Patch wird festgeschrieben, während das ursprüngliche Commit ebenfalls im Verlauf verbleibt.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Dieses Schema zeigt, welcher Befehl was tut.
Wie Sie dort sehen, reset && checkout ändern Sie HEAD.

 enter image description here

238
CodeWizard

Hier ist ein Ansatz, der sehr einfach und leicht zu merken ist. 2 Bedingungen prüfen und mit 1 Befehl beenden. Dann bist du wieder auf dem richtigen Weg.

Ob

du bist in 'losgelöstem Kopf'
(d.h. Typ git status; Sie sehen HEAD detached at <commit_id>)

Und

eine bestehende Niederlassung entspricht Ihren Bedürfnissen
(d. h. Typ git branch -v; Sie sehen einen Zweignamen mit zugehörigen Commit-Nachrichten, die die Arbeit darstellen, die Sie fortsetzen möchten.)

Dann

checken Sie einfach diesen Zweig aus .__ (dh git checkout <branch_name> eingeben; Sie sehen Switched to branch <branch_name>).

Ergebnisse

Sie können nun Ihre Arbeit wie zuvor hinzufügen und festlegen. Änderungen werden auf <branch_name> verfolgt. 

Wenn Sie Arbeit gespeichert haben, während HEAD getrennt wurde, wird diese Arbeit in den meisten Fällen automatisch in dem obigen Prozess zusammengeführt. Wenn Sie eine Nachricht über einen Zusammenführungskonflikt sehen, geraten Sie nicht in Panik. Es gibt mehrere großartige Tutorials mit einfachen Schritten, um den Konflikt zu lösen und die Zusammenführung abzuschließen.

9
Kay V

Tun

git reset 23b6772

Um zu sehen, ob Sie auf der richtigen Position sind:

git status

Du wirst etwas sehen

Am Zweigmaster Ihr Zweig steht mit 17 Commits hinter "Origin/Master", und kann vorgespult werden.

Fixiere dann HEAD auf den aktuellen Commit:

git Push --force
4
amuliar

Die Frage kann gelesen werden als:

Ich befand mich mit HEAD bei 23b6772 im Einzelmodus und tippte git reset Origin/master ein (weil ich Squash ausführen wollte). Jetzt habe ich meine Meinung geändert, wie gehe ich zurück zu HEAD, wenn ich bei 23b6772 bin?

Die einfache Antwort lautet: git reset 23b6772

Aber ich kam zu dieser Frage, weil ich es satt hatte, jedes Mal, wenn ich auf die vorherige HEAD verweisen wollte, das Schreiben (Kopieren und Einfügen) von Hashes oder dessen Abkürzung zu machen, und googelte, um zu sehen, ob es irgendeine Art von Kurzschrift gab.

Es stellt sich heraus, dass es gibt!

git reset - (oder in meinem Fall git cherry-pick -)

Was war übrigens das Gleiche wie cd -, um zum vorherigen aktuellen Verzeichnis in * nix zurückzukehren! Hurra, lernte zwei Dinge mit einer Klappe.

3
antak

Wenn Sie den Befehl git checkout commit_id ausführen, ist HEAD von 13ca5593d(say commit-id) getrennt und der Zweig ist länger verfügbar.

Gehen Sie zum vorherigen Speicherort zurück, und führen Sie den Befehl weise -.__ aus

Sie werden mit aktualisiertem Commit aus dem Remote-Repository zum vorherigen Speicherort zurückkehren.

0
Deepak Kumar

Heute überprüfe ich fälschlicherweise einen Commit und beginne, daran zu arbeiten. Ich mache einige Commits, um den HEAD -Status zu trennen. Dann, was ich getan habe, habe ich mit dem folgenden Befehl zum Remote-Zweig verschoben

git Push Origin HEAD: <My-remote-branch>

dann

git checkout <My-remote-branch>

dann

git pull 

Endlich bekomme ich alle Änderungen in meinem Zweig, die ich beim Ablösen von HEAD vorgenommen habe

0
Zaid Mirza