web-dev-qa-db-fra.com

Comment puis-je avancer et reculer entre les commits dans git?

Je suis en train de faire un git bisect et après être arrivé au commit problématique, j'essaie maintenant de faire un pas en avant/en arrière pour être sûr d'être dans le bon.

Je connais HEAD^ pour revenir en arrière dans l'historique, mais existe-t-il un autre raccourci pour me faire avancer (vers un commit spécifique dans le futur) comme ceci:

A - B - C(HEAD) - D - E - F

Je sais que ma cible est F et je souhaite passer de C à D.


NOTE: ceci n'est pas une copie de Git: comment aller et venir entre les commits , ma question est légèrement différente et on n'y répond pas

75
Kostas

J'ai un peu expérimenté et cela semble faire l'affaire pour naviguer vers l'avant:

git checkout $(git rev-list --topo-order HEAD..towards | tail -1)

towards est un SHA1 du commit ou une balise.

Explication: 

  • la commande dans $() signifie: obtenir tous les commits entre les HEAD actuels et les towards commit (à l'exception de HEAD), et les trier dans l'ordre de priorité (comme dans git log par défaut - au lieu de l'ordre chronologique qui est étrangement celui par défaut pour rev-list), et prenez ensuite le dernier (tail), c’est-à-dire celui où nous voulons aller. 
  • ceci est évalué dans le sous-shell et passé à git checkout pour effectuer une extraction.

Vous pouvez définir une fonction accessible sous forme d'alias dans l'attente d'un paramètre dans votre fichier .profile pour naviguer vers le commit correspondant:

# 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

Tout ce dont vous avez besoin pour obtenir un état clair et non détaché est de réinitialiser, pas de régler.

git reset HEAD@{1}
36
d3day

Je crois que tu peux faire:

git checkout HEAD@{1}

Aller d'un engagement dans le temps. Pour avancer de plusieurs commits, utilisez HEAD @ {2}, HEAD @ {3}, etc.

34
w0utert

C'est ce que j'utilise pour naviguer dans les deux sens.

passage au prochain commit

function n() {
    git log --reverse --pretty=%H master | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout
}

passage au commit précédent

function p() {
    git checkout HEAD^1
}
12
M K

Dites que F est le dernier commit sur trunk (insérez votre propre nom de branche ici) ... vous pouvez vous y référer comme trunk~0 (ou simplement trunk), E comme trunk~1, D comme trunk~2 etc.

Jetez un coup d'oeil dans votre reflog pour encore plus de façons de nommer les commits.

9
Useless

Ce n’est probablement pas le meilleur moyen, mais vous pouvez utiliser git log pour afficher la liste des commits, puis utiliser git checkout [sha1 of D] pour passer à D.

3
bb-generation

Je viens de faire un test sur ceci .. Dis par exemple que vous êtes dans la branche principale Alors faites:

git checkout HEAD@{3}

Alors la tête se détache, et vous pouvez ensuite réessayer pour utiliser un autre commit:

git checkout HEAD@{4}

Une fois que vous avez terminé, vous pouvez revenir à votre état d'origine en vérifiant simplement auprès de cette branche. Dans mon exemple: branche master

git checkout master

Si vous ne voulez pas revenir à l'état d'origine et que vous voulez conserver l'un des commits comme tête et continuer à partir de là, vous devez alors vous orienter à partir de là ... } ", vous pouvez émettre 

git checkout -b MyNewBranch
2
user1322977

Pour contourner le problème, vous pouvez simplement revenir à HEAD avec

git checkout <branch>

Puis passez au commit que vous souhaitez, avec

git checkout HEAD~<offset>
1
Patrizio Bertoni

Traverser en arrière est trivial puisque vous descendez de l'arbre, et il y a toujours un chemin à parcourir

  function git_down
        git checkout HEAD^
  end

Lorsque vous avancez dans l’arbre, vous devez indiquer explicitement la branche que vous ciblez:

  function git_up 
        git log --reverse --pretty=%H $argv | grep -A 1 (git rev-parse HEAD) | tail -n1 | xargs git checkout
  end

Utilisation: 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)

où:

branchName est égal au nom de la branche

commitInOrder est égal à une validation dans l'ordre de la première validation dans la branche sélectionnée (donc 1 est la toute première validation, 2 est la deuxième dans la branche, etc.)

0
guest

Si vous utilisez vs code, l'historique Git est un plugin génial où vous pouvez voir efficacement les commits et vérifier leur contenu dans l'éditeur lui-même . Consultez le lien _

0
Rahil Ahmad