Git: Как перемещаться между коммитами - PullRequest
70 голосов
/ 23 января 2010

У меня есть вопрос новичка о Git:

Мне нужно двигаться назад и вперед в истории ветки. Это означает, что мне нужно вернуть все файлы в состояние, в котором они находились в какой-то старой ревизии, а затем мне нужно вернуться к последнему состоянию в хранилище. Мне не нужно совершать.

С SVN это будет

svn up -r800

, чтобы добраться до ревизии 800, и

svn up

для синхронизации с хранилищем.

Я знаю хэш коммита, к которому я хочу вернуться, поэтому я попытался

git reset <hash>

что, кажется, доставит меня туда. Но потом я попробовал

git pull

но это жалуется на конфликты.

Так, как правильно перемещаться по истории отрасли?

Я думаю о SVN, поэтому не стесняйтесь указывать мне на хороший урок. Обратите внимание, что я уже проверил http://git.or.cz/course/svn.html и http://www.youtube.com/watch?v=8dhZ9BXQgc4.

Спасибо, Ондра.

Ответы [ 5 ]

64 голосов
/ 23 января 2010

Ну, я тоже бывший пользователь svn, и теперь использую git для всех моих проектов.

При использовании git вы должны изменить образ мышления от архитектуры клиент-сервер, которая используется в svn. В SVN для каждого изменения требуется соединение с сервером. Используя git, ваш репозиторий находится в рабочем каталоге. Вам не нужно соединение для каждого действия репо.

Используйте только git push и git pull для синхронизации с репо. Подумайте об этом, как об использовании rsync или любого решения для резервного копирования, чтобы в двух местах был абсолютно одинаковый контент. Точно так же, как вы подключаете внешний резервный жесткий диск, а затем делаете содержимое в нем таким же, как содержимое в вашем главном. Это использование git pull и git push.

Если вы просто хотите перебирать историю, делайте это, используя git checkout. Смотрите идентификатор ревизии, используя git history. Если вы используете Linux, используйте gitk, чтобы увидеть дерево ревизий. В Windows, 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. Таким образом, чтобы сделать возврат, rev2 будет старше, чем rev1. После того, как вы получите результат сравнения, сделайте это с git merge, просто замените diff на merge, все остальные параметры останутся прежними.

Надеюсь, это поможет вам. Главный ключ - видеть, что ваш рабочий каталог - это ваш репо. Понимание этого поможет вам использовать git в полной мере. Удачи.

37 голосов
/ 23 января 2010

Вы можете использовать git checkout для извлечения любого коммита, а затем использовать его с именем ветви, чтобы вернуться к названной ветви.

git checkout с идентификатором фиксации, а не именем ветви, перемещает вас из любой именованной ветви и в так называемую отдельную головку .

Если вы используете git reset, то она сама переместит вашу ветку обратно в старое состояние, потеряв при этом последние коммиты, что, вероятно, не то, что вам нужно.

26 голосов
/ 19 апреля 2014

Остальные ответы носят информативный характер, но я считаю, что это наиболее близко к тому, чего хочет ОП:

Добавьте эти две функции в ваш ~ / .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|.*/\(.*\)|\1|' | 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

Примечание : эти команды всегда переходят в состояние detached HEAD . Если вы git_prev, а затем git_next из текущей извлеченной ветви, вы вернетесь к последней ревизии, но будете находиться в отсоединенном состоянии HEAD Сделайте git checkout BRANCH_NAME чтобы вернуться в нормальное состояние.

6 голосов
/ 30 июля 2014

Попробуйте git reflog, здесь перечислены коммиты и проверки, которые вы сделали для переключения между коммитами, даже коммиты, которые вы потеряли при проверке предыдущего коммита.

Затем вы можете попробовать git checkout <hash of a commit> переключиться на этот коммит.

Надеюсь, это поможет!

6 голосов
/ 26 января 2010

Чтобы получить другую версию файла, используйте

git checkout rev -- filename

Где rev может быть идентификатором коммита, именем ветви, именем тега или относительной версией.

Используйте git log, gitk для просмотра проверенных версий, чтобы увидеть, какую версию файла вы хотите.

Чтобы сделать эту версию файла постоянной, вам нужно зафиксировать файл: git add filename; git commit filename

Я бы не рекомендовал git pull проверять версии, потому что он выполняет слияние - потенциально изменяя ваше текущее состояние.

Вам не нужно использовать git reset в этом случае, если только вы не git add файл, который вы решили не фиксировать.

...