150 votes

Comment avancer et reculer entre les commits dans git ?

Je fais un git bisect et après être arrivé à l'engagement problématique, j'essaie maintenant de faire un pas en avant/en arrière pour m'assurer que je suis dans le bon.

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

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

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


REMARQUE : il ne s'agit pas d'un duplicata de Git : Comment passer d'un commit à l'autre Ma question est légèrement différente et n'y trouve pas de réponse.

92voto

w0utert Points 959

Je pense que vous pouvez le faire :

git reset HEAD@{1}

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

77voto

jakub.g Points 3734

J'ai expérimenté un peu et ceci semble faire l'affaire pour naviguer vers l'avant ( éditer : cela ne fonctionne bien que lorsque l'on a un historique linéaire sans commits de fusion) :

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

donde towards est un SHA1 de la livraison ou d'une balise.

Explication :

  • la commande à l'intérieur $() signifie : obtenir toutes les modifications entre la version actuelle de HEAD y towards s'engager (à l'exclusion des HEAD ), et les trier dans l'ordre de priorité (comme dans git log par défaut -- au lieu de l'ordre chronologique qui est bizarrement l'ordre par défaut pour les rev-list ), puis prendre le dernier ( tail ), c'est-à-dire celui vers lequel nous voulons aller.
  • est évaluée dans le sous-shell et transmise à git checkout pour effectuer un contrôle.

Vous pouvez définir une fonction accessible en tant qu'alias attendu par les paramètres dans votre .profile pour naviguer vers le commit en question :

# 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~'

57voto

d3day Points 821

Il suffit de réinitialiser, et non de passer à la caisse, pour retrouver un état d'esprit clair et non détaché.

git reset HEAD@{1}

30voto

M K Points 510

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

passage à l'engagement suivant

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

déplacement vers le commit précédent

function p() {
    git checkout HEAD^1
}

9voto

Useless Points 18909

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

Jetez un coup d'œil dans votre reflog pour d'autres façons de nommer les commits.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X