Ich mache einen git bisect
und nachdem ich zu dem problematischen Commit gekommen bin, versuche ich jetzt, einen Schritt vorwärts/rückwärts zu machen, um sicherzustellen, dass ich im richtigen bin.
Ich kenne HEAD^
, um in der Geschichte rückwärts zu gehen, aber gibt es eine weitere Abkürzung, um mich vorwärts zu bewegen (in Richtung eines bestimmten Commits in der Zukunft), wie zB
A - B - C(HEAD) - D - E - F
Ich weiß, dass mein Ziel F ist, und ich möchte von C zu D wechseln.
HINWEIS: Dies ist kein Duplikat von Git: Wie man zwischen Commits hin und her wechselt , meine Frage ist etwas anders und wird dort nicht beantwortet
Ich habe ein bisschen experimentiert und dies scheint den Trick zu machen, um vorwärts zu navigieren:
git checkout $(git rev-list --topo-order HEAD..towards | tail -1)
dabei ist towards
eine SHA1 des Commits oder eines Tags.
Erläuterung:
$()
bedeutet: alle Commits zwischen dem aktuellen HEAD
und towards
commit (außer HEAD
) abrufen und in der Rangfolge sortieren (standardmäßig in git log
) - anstelle der chronologischen Reihenfolge, die ungewöhnlich die Standardeinstellung für rev-list
ist. und dann die letzte (tail
), dh die, zu der wir gehen wollen. git checkout
übergeben, um eine Überprüfung durchzuführen.Sie können eine Funktion definieren, auf die als Alias mit Parametererwartung in Ihrer .profile
-Datei zugegriffen werden kann, um vorwärts zum jeweiligen Commit zu navigieren:
# Go forward in Git commit hierarchy, towards particular commit
# Usage:
# gofwd v1.2.7
# Does nothing when the parameter is not specified.
gofwd() {
git checkout $(git rev-list --topo-order HEAD.."$*" | tail -1)
}
# Go back in Git commit hierarchy
# Usage:
# goback
alias goback='git checkout HEAD~'
Alles was Sie brauchen, um einen klaren, nicht abgenommenen Kopfstatus zu erhalten, ist das Zurücksetzen und nicht das Auschecken.
git reset [email protected]{1}
Ich glaube, du kannst tun:
git checkout [email protected]{1}
Um ein Commit rechtzeitig zu machen. Verwenden Sie HEAD @ {2}, HEAD @ {3} usw., um mehrere Commits auszuführen.
Dies ist, was ich verwende, um hin und her zu navigieren.
Umzug zum nächsten Commit
function n() {
git log --reverse --pretty=%H master | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout
}
Umzug zum vorherigen Commit
function p() {
git checkout HEAD^1
}
Angenommen, F ist das letzte Commit für trunk
(geben Sie hier Ihren eigenen Zweignamen ein) ... Sie können es als trunk~0
(oder nur trunk
), E als trunk~1
, D als trunk~2
usw. bezeichnen.
Schauen Sie in Ihrem reflog nach weiteren Möglichkeiten, Commits zu benennen.
Wahrscheinlich nicht der schönste Weg, aber Sie können mit git log
die Liste der Commits anzeigen und dann mit git checkout [sha1 of D]
nach D wechseln.
Ich habe gerade einen Test mit diesem Beispiel durchgeführt. Sagen Sie zum Beispiel, Sie befinden sich im Hauptzweig. Dann machen Sie:
git checkout [email protected]{3}
Der Kopf löst sich also ab und Sie können es erneut versuchen, um zu einem anderen Commit zu gelangen:
git checkout [email protected]{4}
Sobald Sie sich umgesehen haben, können Sie durch Auschecken zu diesem Zweig in den ursprünglichen Zustand zurückkehren. In meinem Beispiel: Master Branch
git checkout master
Wenn Sie nicht in den ursprünglichen Zustand zurückkehren möchten, und eines der Commits als Kopf behalten und von dort fortfahren möchten, müssen Sie von dort aus verzweigen . Zum Beispiel nach "git checkout HEAD @ {4 } ", können Sie ausgeben
git checkout -b MyNewBranch
Als Problemumgehung können Sie einfach mit HEAD zurückkehren
git checkout <branch>
Und dann zu dem Commit wechseln, das Sie möchten, mit
git checkout HEAD~<offset>
Rückwärtsfahren ist trivial, da Sie den Baum hinuntergehen und es immer einen Weg gibt
function git_down
git checkout HEAD^
end
Wenn Sie vorwärts fahren, bewegen Sie sich im Baum nach oben. Sie müssen also explizit angeben, auf welchen Zweig Sie zielen:
function git_up
git log --reverse --pretty=%H $argv | grep -A 1 (git rev-parse HEAD) | tail -n1 | xargs git checkout
end
Verwendung: git down
, git up <branch-name>
branchName=master; commitInOrder=1; git checkout $(git log --pretty=%H "${branchName}" | tac | head -n "${commitInOrder}" | tail -n 1)
woher:
branchName
entspricht dem Namen der Verzweigung
commitInOrder
entspricht einem Commit in der Reihenfolge vom ersten Commit in der ausgewählten Verzweigung (1 ist also das erste Commit, 2 ist das zweite Commit in der Verzweigung usw.)
Wenn Sie vs-Code verwenden, ist Git history ein großartiges Plugin, mit dem Sie Commits effizient anzeigen und deren Inhalt im Editor selbst überprüfen können. check out the link