Git: как двигаться вперед и назад между коммитами
у меня есть вопрос новичка о Git:
мне нужно двигаться вперед и назад в истории ветви.
Это означает, что мне нужно вернуть все файлы в состояние, в котором они были в какой-то старой редакции, а затем мне нужно вернуться к последнему состоянию в репозитории. Мне не нужно брать на себя обязательства.
С SVN, это было бы
svn up -r800
чтобы добраться до ревизии 800, и
svn up
для синхронизации с репозиторием.
Я знаю, что хэш commit я хочу вернуться, поэтому я попытался
git reset <hash>
который, кажется, чтобы получить меня там. Но потом я попробовал
git pull
но это жалуется на конфликты.
Итак, как правильно двигаться по истории отрасли?
Я думаю с точки зрения СВН, так что не сможете указать мне на некоторые хорошие учебник. Обратите внимание, что я уже проверил http://git.or.cz/course/svn.html и http://www.youtube.com/watch?v=8dhZ9BXQgc4 .
Спасибо, Ондра.
5 ответов:
Ну, я тоже бывший пользователь svn, и теперь использую git для всех моих проектов.
при использовании git, вы должны изменить способ мышления от архитектуры клиент-сервер, который используется в svn. В svn каждое изменение требует подключения к серверу. Используя git, ваше РЕПО находится в рабочем каталоге. Вам не нужно подключение для каждого действия РЕПО.
использовать только
git pushиgit pullдля синхронизации с РЕПО. Подумайте об этом, как с помощью rsync или любого резервного решения, чтобы сделайте два места имеют точно такое же содержание. Так же, как вы подключаете внешний резервный жесткий диск, а затем сделать содержимое в нем же с содержимым в вашем основном. Это использованиеgit pullиgit push.если вы просто хотите вернуться назад и вперед по истории, сделайте это с помощью
git checkout. См. идентификатор ревизии с помощьюgit history. Если вы используете Linux, используйтеgitkчтобы увидеть дерево пересмотра. В Windows tortoise git может отображать его с помощью графика ревизий.чтобы вернуться к последней версии редакция, используйте
git checkout master. Перед выполнением любой команды, всегда заставляйте себя делатьgit status. Эта команда отобразит все, что вам нужно знать о текущем состоянии РЕПО, и какие действия вам нужно сделать, чтобы сделать это правильно. Прежде чем сделатьgit pullиgit push, лучше убедиться, чтоgit statusрезультат содержит текстworking directory clean.если вам нужно вернуть файл в предыдущую версию, вы можете сделать это с помощью
git merge. Прежде чем делать это с файлом, сначала проверьте его с помощьюgit diff. Бывший:git diff rev1:rev2 filename. Он будет печатать любые разные между двумя ревизиями. Изменение в rev1 будет заменено изменениями в rev2. Таким образом, чтобы сделать revert, rev2 будет старше rev1. После того, как вы удовлетворитесь результатом diff, сделайте это сgit merge, просто заменитьdiffСmerge, все остальные параметры остаются теми же.Я надеюсь, что это поможет вам. Главный ключ-увидеть, что ваш рабочий каталог-это ваше РЕПО. Понимание этого поможет вам использовать git в полной мере. Удача.
можно использовать
git checkoutчтобы проверить любую фиксацию, а затем использовать ее с именем ветви, чтобы вернуться к именованной ветви.
git checkoutс идентификатором фиксации, а не именем ветви, вы перемещаетесь с любой именованной ветви и переходите к тому, что известно как отрезанная голова.Если вы используете
git resetзатем он переместит вашу ветвь обратно в старое состояние, осиротев более поздние коммиты, которые, вероятно, не то, что вы хотите.
другие ответы информативны, но я считаю, что это ближе всего к тому, что хочет ОП:
добавьте эти две функции в свой~/.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 }использование:
$ 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Примечание: эти команды всегда введите отрезанная голова государство. Если вы
git_prevзатемgit_nextиз текущей проверенной ветви вы вернетесь в последнюю версию, но вы будете в состоянии отсоединенной головы. Делайgit checkout BRANCH_NAMEвернуться к нормальный.
чтобы проверить другую версию файла, используйте
git checkout rev -- filenameздесь rev может быть идентификатором фиксации, именем ветви, именем тега или относительной версией.
использовать
git log,gitkчтобы посмотреть проверьте версии, чтобы увидеть, какую версию файла вы хотите.чтобы сделать эту версию файла постоянной, вам нужно зафиксировать файл:
git add filename; git commit filenameЯ бы не рекомендовал
git pullдля изучения версий, потому что он делает слияние -- потенциальное изменение текущего состояния.вам не нужно использовать
git resetв этом случае, если вы неgit addфайл, который вы решили не совершать.
попробовать
git reflog, Это список коммитов и возвратов, которые вы сделали для переключения между коммитами, даже коммиты, которые вы потеряли при проверке на предыдущую фиксацию.
Тогда вы можете попробоватьgit checkout <hash of a commit>чтобы переключиться на эту фиксацию.надеюсь, что это помогает!
Comments