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> для переключения на этот коммит.

надеюсь, что это помогает!