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?
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
.
In der Befehlszeile sieht es so aus - SHA-1 anstelle des Zweignamens, da HEAD
nicht auf die Spitze des aktuellen Zweigs zeigt
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
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.
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
.
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.
du bist in 'losgelöstem Kopf'
(d.h. Typ git status
; Sie sehen HEAD detached at <commit_id>
)
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.)
checken Sie einfach diesen Zweig aus .__ (dh git checkout <branch_name>
eingeben; Sie sehen Switched to branch <branch_name>
).
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.
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
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.
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.
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.
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