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.
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.
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.
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.
pour consulter une version différente d'un fichier, utilisez
git checkout rev -- filename
Où 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.
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!