Frage Wie verschiebe HEAD zurück zu einem früheren Ort? (Freistehendes Kopf)


In git versuchte ich ein Squash-Commit zu machen, indem ich in einen anderen Zweig mische und dann neu setze HEAD zum vorherigen Ort über:

git reset origin/master

Aber ich muss daraus aussteigen. Wie kann ich HEAD zurück zum vorherigen Ort bewegen?

Ich habe den SHA1 frag (23b6772) des Commits, zu dem ich es bewegen muss.
Wie kann ich zu diesem Commit zurückkommen?


75
2017-12-29 21:53


Ursprung


Antworten:


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

First of all what is HEAD?

HEAD ist einfach eine Referenz auf das aktuelle Commit (aktuell) der aktuellen Filiale.
Es kann nur einen einzigen geben HEAD jederzeit. (ohne git worktree)

Der Inhalt von HEAD ist innen gespeichert .git/HEAD und es enthält die 40 Bytes SHA-1 des aktuellen Commits.


detached HEAD

Wenn Sie nicht auf dem neuesten Commit sind - das heißt HEAD zeigt auf einen vorherigen Commit in der Geschichte seiner aufgerufenen detached HEAD.

enter image description here

In der Befehlszeile sieht es wie folgt aus: SHA-1 anstelle des Zweignamens seit dem HEAD zeigt nicht auf die Spitze des aktuellen Zweiges

enter image description here


Einige Optionen zum Wiederherstellen von einem getrennten HEAD:


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, der auf den gewünschten Commit zeigt, ausgecheckt.
Dieser Befehl wird zu einem gegebenen Commit auschecken.
An dieser Stelle können Sie eine Verzweigung erstellen und von diesem Punkt an arbeiten.

# 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 immer die reflog auch.
git reflog zeigt alle Änderungen an, die das Update aktualisiert haben HEAD und das Auschecken des gewünschten Reflog-Eintrags setzt den HEAD zurück zu diesem Commit.

Jedes Mal, wenn der HEAD geändert wird, erscheint ein neuer Eintrag in der reflog

git reflog
git checkout HEAD@{...}

Dies bringt Sie zurück 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 die git rebase --no-autostash auch.


git revert <sha-1>

"Rückgängig" den angegebenen Commit oder Commit-Bereich.
Der Reset-Befehl "rückgängig" macht alle Änderungen, die an dem gegebenen Commit vorgenommen wurden.
Ein neues Commit mit dem Rückgängig-Patch wird ausgeführt, während das ursprüngliche Commit auch 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 veranschaulicht, welcher Befehl was macht.
Wie Sie dort sehen können reset && checkout modifiziere den HEAD.

enter image description here


190
2017-12-29 21:56



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

Ob

Du bist in "distanziertem Kopf"
(d. h git status; du siehst HEAD detached at <commit_id>)

Und

Ein bestehender Zweig entspricht Ihren Bedürfnissen
(d. h git branch -v; Sie sehen einen Zweignamen mit zugehörigen Commit-Nachrichten, die die Arbeit darstellen, die Sie fortsetzen möchten.

Dann

schau dir einfach diesen Zweig an (d. h git checkout <branch_name>; du siehst Switched to branch <branch_name>).

Ergebnisse

Sie können jetzt Ihre Arbeit wie bisher hinzufügen und übergeben. Änderungen werden verfolgt <branch_name>.

Beachten Sie, dass diese Arbeit in den meisten Fällen automatisch im obigen Prozess zusammengeführt wird, wenn Sie Arbeit gespeichert haben, während HEAD entfernt wurde. Wenn Sie eine Nachricht zu einem Zusammenführungskonflikt erhalten, sollten Sie nicht in Panik geraten. Es gibt mehrere großartige Tutorials mit einfachen Schritten, um den Konflikt zu beheben und die Zusammenführung abzuschließen.


6
2017-08-09 14:10



Die Frage kann wie folgt gelesen werden:

Ich war in losgelöstem Zustand mit HEAD beim 23b6772 und getippt git reset origin/master (weil ich Squash wollte). Jetzt habe ich meine Meinung geändert, wie gehe ich zurück HEAD sein bei 23b6772?

Die unkomplizierte Antwort lautet: git reset 23b6772

Aber ich habe diese Frage gestellt, weil ich es satt hatte, jedesmal, wenn ich auf das Vorhergehende verweisen wollte, Commit-Hashes oder deren Abkürzung zu tippen (Kopieren & Einfügen) HEAD und googelte, um zu sehen, ob es irgendeine Art von Kurzschrift gab.

Es stellt sich heraus, dass es da ist!

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

Was übrigens genauso war wie cd - um zum vorherigen zurückzukehren Aktuelles Verzeichnis in * nix! So hurrah, lernte zwei Dinge mit einer Klappe.


2
2017-07-22 04:46