web-dev-qa-db-fra.com

Git: comment aller et venir entre les commits

J'ai une nouvelle question à propos de Git:

J'ai besoin d'aller et venir dans l'histoire d'une branche. Cela signifie que je dois remettre tous les fichiers dans l'état dans lequel ils se trouvaient dans une ancienne révision, puis je dois revenir au dernier état dans le référentiel. Je n'ai pas besoin de m'engager.

Avec SVN, ce serait

svn up -r800

pour arriver à la révision 800, et

svn up

pour se synchroniser avec le référentiel.

Je connais le hachage du commit sur lequel je veux revenir, alors j'ai essayé

git reset <hash>

qui semble m'y amener. Mais j'ai essayé

git pull

mais cela se plaint de conflits.

Alors, quelle est la bonne façon de parcourir l'histoire de la succursale?

Je pense en termes de SVN, alors n'hésitez pas à me diriger vers un joli tutoriel. Notez que j'ai déjà vérifié http://git.or.cz/course/svn.html et http://www.youtube.com/watch?v=8dhZ9BXQgc4 .

Merci, Ondra.

70
Ondra Žižka

Eh bien, je suis aussi un ancien utilisateur de svn, et j'utilise maintenant git pour tous mes projets.

Lorsque vous utilisez git, vous devez changer la façon de penser de l'architecture client-serveur utilisée dans svn. Dans svn, chaque changement nécessite une connexion avec le serveur. Avec git, votre dépôt est dans le répertoire de travail. Vous n'avez pas besoin d'une connexion pour chaque action de mise en pension.

Seule utilisation git Push et git pull pour synchroniser avec le dépôt. Pensez-y comme si vous utilisiez rsync ou toute autre solution de sauvegarde, pour que deux endroits aient exactement le même contenu. Tout comme vous connectez un disque dur de sauvegarde externe, faites-en le même contenu avec le contenu de votre principal. C'est l'utilisation de git pull et git Push.

Si vous souhaitez simplement parcourir l’historique, faites-le en utilisant git checkout. Voir l'id de révision en utilisant git history. Si vous utilisez Linux, utilisez gitk pour voir l'arborescence de révision. Sous Windows, tortoise git peut l'afficher à l'aide du graphique de révision.

Pour revenir à la dernière révision, utilisez git checkout master. Avant d'exécuter une commande, assurez-vous toujours de faire git status. Cette commande affichera tout ce que vous devez savoir sur l'état actuel du référentiel et l'action que vous devez faire pour y remédier. Avant de faire git pull et git Push, il vaut mieux s'assurer que git status le résultat contient du texte working directory clean.

Si vous devez rétablir un fichier dans sa version précédente, vous pouvez le faire avec git merge. Avant de le faire dans un fichier, testez-le d'abord avec git diff. Ex: git diff rev1:rev2 filename. Il imprimera tout différent entre deux révisions. Le changement dans rev1 sera remplacé par les changements dans rev2. Donc, pour revenir, rev2 sera plus ancien que rev1. Après avoir satisfait avec le résultat diff, faites-le avec git merge, remplacez simplement diff par merge, tous les autres paramètres restent les mêmes.

J'espère que ceci vous aide. La clé principale est de voir que votre répertoire de travail est votre repo. Comprendre cela vous aidera à utiliser git à sa pleine capacité. Bonne chance.

65
Donny Kurnia

Vous pouvez utiliser git checkout pour extraire tout commit, puis l'utiliser avec un nom de branche pour revenir à une branche nommée.

git checkout avec un ID de validation et non un nom de branche vous déplace hors de toute branche nommée et sur ce qui est connu comme tête détachée.

Si tu utilises git reset alors il ramènera votre branche elle-même à un ancien état, rendant orphelins les commits les plus récents qui ne sont probablement pas ce que vous voulez.

37
CB Bailey

Les autres réponses sont informatives, mais je pense que cela se rapproche le plus de ce que souhaite le PO:

Ajoutez ces deux fonctions à votre ~/.bashrc:

# checkout prev (older) revision
git_prev() {
    git checkout HEAD~
}

# checkout next (newer) commit
git_next() {
    BRANCH=`git show-ref | grep $(git show-ref -s -- HEAD) | sed 's|.*/\(.*\)|\1|' | grep -v HEAD | sort | uniq`
    HASH=`git rev-parse $BRANCH`
    PREV=`git rev-list --topo-order HEAD..$HASH | tail -1`
    git checkout $PREV
}

Usage:

$ git_prev
Previous HEAD position was 7042c8a... Commit message2
HEAD is now at d753ecc... Commit message1

$ git_next
Previous HEAD position was d753ecc... Commit message1
HEAD is now at 7042c8a... Commit message2

Remarque : Ces commandes entrent toujours l'état HEAD détaché . Si vous git_prev puis git_next à partir d'une branche actuellement extraite, vous vous retrouverez à la dernière révision mais vous serez à l'état détaché HEAD. Do git checkout BRANCH_NAME pour revenir à la normale.

26
Raine Revere

Essayez git reflog, cette liste répertorie les validations et les extractions que vous avez effectuées pour basculer entre les validations, même les validations que vous avez perdues lors de l'extraction à une validation précédente.

Ensuite, vous pouvez essayer git checkout <hash of a commit> pour passer à ce commit.

J'espère que cela t'aides!

7
Ryan Le

Pour extraire une version différente d'un fichier, utilisez

git checkout rev -- filename

rev peut être l'ID d'une validation, le nom d'une branche, le nom d'une balise ou une version relative.

Utilisation git log, gitk pour regarder examiner les versions pour voir quelle version du fichier vous voulez.

Pour rendre cette version du fichier permanente, vous devez valider le fichier: git add filename; git commit filename

Je ne recommanderais pas git pull pour examiner les versions car il effectue une fusion - modifiant potentiellement votre état actuel.

Vous n'avez pas besoin d'utiliser git reset dans ce cas, sauf si vous git add un fichier que vous décidez de ne pas valider.

6
Jamey Hicks