it-swarm.com.de

Wie bewege ich mich zwischen Commits in git hin und her?

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

75
Kostas

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: 

  • der Befehl in $() 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. 
  • diese wird in der Subshell ausgewertet und an 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~'
47
jakub.g

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}
36
d3day

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.

34
w0utert

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
}
12
M K

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.

9
Useless

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.

3
bb-generation

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
2
user1322977

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>
1

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>

0
Dziamid
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.)

0
guest

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

0
Rahil Ahmad