Git: comment faire des allers-retours entre les commits

j'ai une question sur Git:

je dois aller et venir dans l'histoire d'une branche. Cela signifie que j'ai besoin de mettre tous les fichiers dans l'état dans lequel ils étaient dans une ancienne révision, et ensuite j'ai besoin de revenir à l'état le plus récent du dépôt. Je n'ai pas besoin de commettre.

avec SVN, ce serait

svn up -r800

pour obtenir la révision 800, et

svn up

pour être en phase avec le référentiel.

je sais que le hachage de l'engager je veux revenir, alors j'ai essayé

git reset <hash>

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

git pull

mais qui se plaint de conflits.

alors quelle est la bonne façon de se déplacer dans l'histoire de la branche?

je pense en termes de SVN, alors ne me dirigez pas 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.

66
demandé sur dotancohen 2010-01-23 02:18:25

5 réponses

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

lors de l'utilisation de Git, vous devez changer la façon de penser de l'architecture client-serveur qui est utilisée dans svn. Dans svn, chaque changement nécessite une connexion avec le serveur. En utilisant git, votre repo est dans le répertoire de travail. Vous n'avez pas besoin d'une connexion pour chaque action de repo.

n'utiliser que git push et git pull pour synchroniser avec repo. Pensez-y comme à l'aide de rsync ou n'importe quelle solution de sauvegarde, pour faire deux lieu ont exactement le même contenu. Tout comme vous connecter disque dur de sauvegarde externe, puis faire le contenu dans le même avec le contenu dans votre main. C'est l'usage de git pull et git push .

si vous voulez simplement aller et venir l'histoire, faites-le en utilisant git checkout . Voir le numéro de révision en utilisant git history . Si vous utilisez Linux, utilisez gitk pour voir l'arbre de révision. Dans Windows, tortue git peut l'afficher utilisation du graphique de révision.

Pour revenir à la dernière révision, utilisez git checkout master . Avant de faire n'importe quelle commande, toujours faites-vous faire git status . Cette commande affichera Tout ce que vous devez savoir sur l'état actuel des pensions, et quelles actions que vous devez faire pour le rendre juste. Avant de faire git pull et git push , il est préférable de s'assurer que git status résultat est contiennent le texte working directory clean .

si vous avez besoin de revenir à un fichier révision précédente, vous pouvez le faire avec git merge . Avant de le faire à un fichier, le tester d'abord avec git diff . Ex: git diff rev1:rev2 filename . Il imprimera toute différence entre deux révisions. Le changement dans rev1 sera remplacé par les changements dans rev2. Donc pour faire revert, rev2 sera l'ancien que rev1. Après avoir satisfait avec le résultat diff, le faire avec git merge , il suffit de remplacer diff par merge , tous les autres paramètres restent les mêmes.

j'espère que cela aidera vous. La clé principale est de voir que votre travail dir est votre repo. Cette compréhension vous aidera à utiliser git à sa pleine capacité. Bonne chance.

62
répondu Donny Kurnia 2015-08-23 04:07:18

vous pouvez utiliser git checkout pour vérifier n'importe quelle propagation et ensuite l'utiliser avec un nom de branche pour retourner à une branche nommée.

git checkout avec un identifiant de propagation et non un nom de branche vous déplace de n'importe quelle branche nommée et sur ce qui est connu comme un tête détachée .

si vous utilisez git reset alors il déplacera votre branche elle-même de nouveau à un état ancien, orphelin le plus récent commits qui n'est probablement pas ce que vous voulez.

37
répondu CB Bailey 2010-01-22 23:19:55

les autres réponses sont instructives, mais je crois que c'est ce qui se rapproche le plus de ce que veut L'OP:

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|.*/\(.*\)||' | grep -v HEAD | sort | uniq`
    HASH=`git rev-parse $BRANCH`
    PREV=`git rev-list --topo-order HEAD..$HASH | tail -1`
    git checkout $PREV
}

Utilisation:

$ 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

Note : ces commandes indiquent toujours tête détachée état. Si vous git_prev puis git_next d'une branche actuellement cochée, vous vous retrouverez à la dernière révision mais vous serez à detached HEAD state. Faites git checkout BRANCH_NAME pour revenir à la normale.

21
répondu Raine Rupert Revere 2017-05-23 11:47:04

pour consulter une version différente d'un fichier, utilisez

git checkout rev -- filename

rev peut être l'ID d'un commit, le nom de la branche, le nom d'une balise, ou d'un parent, version.

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

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

Je ne recommande pas git pull d'examiner les versions parce qu'il fait une fusion -- modifiant potentiellement votre état actuel.

Vous n'avez pas besoin d'utiliser git reset dans ce cas, à moins que vous git add un fichier que vous décidez de ne pas s'engager.

6
répondu Jamey Hicks 2010-01-26 13:14:10

Try git reflog , cette liste de commits et de checkouts que vous avez fait pour basculer entre les commits, même les commits que vous avez perdus lors de la checkout vers une commit précédente.



Ensuite, vous pouvez essayer git checkout <hash of a commit> pour changer de commettre.

Espérons que cette aide!

5
répondu Ryan Le 2014-07-29 23:42:07