Git: как двигаться вперед и назад между коммитами
у меня есть вопрос новичка о Git:
мне нужно двигаться вперед и назад в истории ветви. Это означает, что мне нужно вернуть все файлы в состояние, в котором они были в какой-то старой редакции, а затем мне нужно вернуться к последнему состоянию в репозитории. Мне не нужно брать на себя обязательства.
С SVN, это было бы
svn up -r800
чтобы добраться до редакции 800, и
svn up
для синхронизации с репозиторием.
Я знаю, что хэш commit я хочу вернуться, поэтому я попытался
git reset <hash>
что, кажется, приводит меня туда. Но потом я попытался ... --5-->
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
. Обзор ID, используя 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
. Он будет печатать любые разные между двумя редакциями. Изменения в ред. 1 будет заменено изменения в ред. 2. Таким образом, чтобы вернуться, rev2 будет старше rev1. После того, как вы удовлетворены результатом diff, сделайте это с git merge
, просто заменить diff
С merge
, все остальные параметры остаются теми же.
Я надеюсь, это поможет вам. Главный ключ-видеть, что ваш рабочий dir-это ваше РЕПО. Понимание этого поможет вам использовать git в полной мере. Удача.
можно использовать git checkout
чтобы проверить любую фиксацию, а затем использовать ее с именем ветви, чтобы вернуться к именованной ветви.
git checkout
с идентификатором фиксации, а не именем ветви перемещает вас с любой именованной ветви и на то, что известно как отрезанная голова.
Если вы используете git reset
затем он переместит вашу ветвь обратно в старое состояние, осиротев более недавние коммиты, которые, вероятно, не то, что вы хотите.
другие ответы информативны, но я считаю, что это ближе всего к тому, что хочет OP:
добавьте эти две функции в свой~/.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
Примечание: эти команды всегда введите отрезанная голова государство. Если ты ... --2--> затем git_next
из текущей проверенной ветви вы вернетесь в последнюю редакцию, но будете в отдельном головном состоянии. Do git checkout BRANCH_NAME
вернуться к нормальный.
чтобы проверить другую версию файла, используйте
git checkout rev -- filename
здесь rev может быть идентификатором фиксации, именем ветви, именем тега или относительной версией.
использовать git log
, gitk
чтобы посмотреть проверить версии, чтобы увидеть, какую версию файла вы хотите.
чтобы сделать эту версию файла постоянной, вам нужно зафиксировать файл:git add filename; git commit filename
Я бы не рекомендовал git pull
для изучения версий, потому что он делает merge -- потенциально изменяет ваше текущее состояние.
вам не нужно использовать git reset
в этом случае, если вы не git add
файл, который вы решили не совершать.
попробовать git reflog
, в этом списке перечислены коммиты и проверки, которые вы сделали для переключения между коммитами, даже коммиты, которые вы потеряли при проверке на предыдущий коммит.
Тогда вы можете попробовать git checkout <hash of a commit>
для переключения на этот коммит.
надеюсь, что это помогает!