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.

7voto

Dziamid Points 3735

Le retour en arrière est trivial puisque vous vous déplacez vers le bas de l'arbre et qu'il n'y a qu'une seule façon de procéder

  function git_down
        git checkout HEAD^
  end

Lorsque vous traversez vers l'avant, vous vous déplacez vers le haut de l'arbre, vous devez donc être explicite quant à la branche que vous visez :

  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>

3voto

dimpiax Points 96

Si vous voulez voir à l'avance, vous pouvez utiliser cette astuce, car Git n'a pas de commande stricte pour cela.

git log --reverse COMMIT_HASH..

Exemple

Liste des hachages de l'historique du journal :

A
B
C -> put this
D

en utilisant la commande git log --reverse C.. Dans le résultat, vous verrez B y A .

2voto

user1322977 Points 143

Je viens de faire un test à ce sujet. Disons par exemple que vous êtes dans la branche master Alors faites :

git checkout HEAD@{3}

La tête se détache donc et vous pouvez alors réessayer pour passer à un autre engagement :

git checkout HEAD@{4}

Une fois que vous avez terminé votre visite, vous pouvez revenir à votre état d'origine en passant simplement à la caisse de cette agence. Dans mon exemple : branche master

git checkout master

Si vous ne voulez pas revenir à l'état d'origine, et que vous voulez garder l'un des commits comme tête et continuer à partir de là, alors vous devez vous brancher à partir de là. Par exemple, après "git checkout HEAD@{4}" vous pouvez lancer

git checkout -b MyNewBranch

1voto

Mohsen Points 602

Le chemin le plus court pour aller de l'avant pour un engagement est le suivant :

git checkout @{1}

1voto

mnemosdev Points 408

Je rejoins ces commentaires un peu plus tard, mais j'ai construit cette ligne de code qui m'a aidé à aller "vers l'avant" sur n'importe quel git tree et j'espère qu'il vous sera également utile.

Notez que je ne suis pas un magicien de bash, donc si vous trouvez quelque chose qui pourrait être changé, commentez et nous pourrons améliorer cette ligne de code !

Revenir en arrière :

git log --all --decorate --oneline | grep -A 1 $(git rev-parse --short HEAD) | awk '{print $1}' | tail -1 | xargs -I {} git checkout {}

Pour aller de l'avant :

git log --all --decorate --oneline | grep -B 1 $(git rev-parse --short HEAD) | awk '{print $1}' | head -1 | xargs -I {} git checkout {}

Voici quelques explications :

git reflog # Here we get all the commits we need

grep -A 1 $(git rev-parse --short HEAD) # Here we grep for the short commit hash

awk '{print $1}' # Here we get just the hash

tail -1 # We will get at least 2 results, pick the last line, the first would be 0

xargs -I {} git checkout {} # Here we go "forward by 1"

J'espère que cela pourra être utile à tous ceux qui voudraient obtenir le même comportement. Je suis en train de construire un CLI qui a une commande qui vous déplace "en avant et en arrière" dans l'arbre des commits sans connaissance préalable des hashs ou des logs.

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