Как вернуться к последнему коммиту после проверки предыдущего коммита?

477

Иногда я проверяю какую-то предыдущую версию кода для проверки или тестирования. Я видел инструкции о том, что делать, если я хочу изменить предыдущие коммиты - но предположим, что я не делаю изменений. После того git checkout HEAD^, как я сделал, например , как мне вернуться к концу ветви? .. git logбольше не показывает мне SHA последнего коммита.

Лев Алексеев
источник
11
Что касается git logпредложения вашего вопроса, вы всегда можете запустить git log --all(или более полезно, git log --oneline --graph --all).
Wildcard

Ответы:

607

Если вы знаете, что коммит, к которому вы хотите вернуться, является главой какой-либо ветви или помечен, то вы можете просто

git checkout branchname

Вы также можете использовать, git reflogчтобы увидеть, на что другие коммиты указывал ваш HEAD (или любой другой реф) в прошлом.


Отредактировано, чтобы добавить:

В более новых версиях Git, если вы только запускаете git checkoutили что-то еще перемещаете HEADодин раз, вы также можете сделать

git checkout -

вернуться туда, где он был до последней проверки. Это было мотивировано аналогией с идиомой оболочки, cd -чтобы вернуться в любой рабочий каталог, в котором вы были ранее.

Фил Миллер
источник
27
Я хотел бы упомянуть, что типичным примером будет «git checkout master». Одна из трудностей, с которыми я научился использовать git, заключалась в том, что я не знал, какие конкретные ключевые слова (например, «master») я могу заменить местными словами, такими как «branchname».
AbePralle
3
masterна самом деле это не какое-то ключевое слово HEAD. Это просто имя ветки по умолчанию в новом хранилище. Вы можете запустить, git branchчтобы получить список веток в вашем хранилище и git tag -lсписок тегов. Аналогично, originэто имя по умолчанию удаленного компьютера, с которого клонируется репозиторий, но в этом нет ничего особенного.
Фил Миллер
3
Если это не было ясно, git reflogдает вам список хэшей, в какой момент вы можете использовать git checkout [commit-hash].
jbnunn
Я удалил файл и попробовал команду, но она не полностью сбросила его. Прежде всего, это не рекурсивно. Затем, когда я пытаюсь это сделать с файлом, который я удалил, git впоследствии сообщает мне, что HEAD отключен. Что делать?
Даниэль С.
1
@DanielS .: Вопрос и ответ мой был о фиксаций , в то время как вы говорите о файлах. Git относится к ним довольно по-разному.
Фил Миллер
27

мастер проверки

мастер - это совет или последний коммит. Гитк покажет вам только, где вы находитесь в дереве в то время. git reflog покажет все коммиты, но в этом случае вам просто нужен совет, так что git checkout master.

Брюс Уэллс
источник
1
Эта. Илиgit checkout branchname
Алекс
19

Наткнулся на этот вопрос только сейчас и есть что добавить

Чтобы перейти на самый последний коммит:

git checkout $(git log --branches -1 --pretty=format:"%H")

Объяснение:

git log --branchesпоказывает журнал коммитов из всех локальных веток с
-1ограничением до одного коммита → самый последний
--pretty=format:"%H"формат коммита , чтобы показать только хеш коммита,
git checkout $(...)использующий вывод subshell в качестве аргумента для извлечения

Замечания:

Это приведет к отстраненной голове (потому что мы обращаемся непосредственно к коммиту). Этого можно избежать, извлекая название ветви с помощью sed, объясненного ниже.


Чтобы перейти на ветку самого последнего коммита:

git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')

Объяснение:

git log --branchesпоказывает журнал коммитов из всех локальных веток с
-1ограничением до одного коммита → последний
--pretty=format:"%D"формат коммитов , чтобы показывать только имена ссылок,
| sed 's/.*, //g'игнорировать все, кроме последнего из нескольких ссылок (*),
git checkout $(...)использовать вывод subshell в качестве аргумента для извлечения

*) HEAD и удаленные ветви отображаются первыми, локальные ветви располагаются последними в алфавитном порядке по убыванию, поэтому оставшаяся часть будет в алфавитном порядке по имени первой ветви.

Замечания:

Это всегда будет использовать (в алфавитном порядке) имя первой ветви, если есть несколько для этого коммита.


В любом случае, я думаю, что лучшим решением будет просто отобразить имена ссылок для самого последнего коммита, чтобы знать, где оформить заказ:

git log --branches -1 --pretty=format:'%D'

Например, создайте псевдоним git topдля этой команды.

816-8055
источник
1
Каким-то образом я обдумал вторую команду ... Исправил, теперь она будет корректно проверять вас на ветке самого последнего коммита.
816-8055
Псевдоним Bash / Zsh для команды, чтобы вернуться обратно в головуalias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Привет-Ангел
9

Посмотрите на графический интерфейс ... gitkон показывает все коммиты. Иногда графически легче работать ... ^^

tanascius
источник
да, именно так я и делал в прошлом - но в данный момент у меня нет доступного графического интерфейса
Лев Алексеев
7

Для этого вы можете использовать одну из следующих команд git:

git checkout master
git checkout branchname
hothead1000
источник
4

показать все ветки и зафиксировать
git log --branches --oneline

показать последний коммит
git log --branches -1 --oneline

показать перед последним коммитом
git log --branches -2 --oneline

abdesselam
источник
Будет ли первая команда на самом деле зафиксировать, какой код в данный момент ставится, или я неправильно читаю это?
Lazerbeak12345
3
git reflog //find the hash of the commit that you want to checkout
git checkout <commit number>>
Атиф Маджид
источник
0

Если у вас есть ветка, отличная от главной, один простой способ - проверить эту ветку, а затем проверить главную. Вуаля, вы вернулись на кончик мастера. Там, наверное, умнее способов ...

ConorR
источник
0

Вы можете просто сделать git pull origin branchname. Он снова получит последний коммит.

Анкит Сингх
источник
Я не рекомендую это, если вы не хотите тянуть вверх по течению. Нужно обрабатывать конфликты слияния только тогда, когда они готовы.
Lazerbeak12345
Что ж, в этом случае голова останется отсоединенным, даже если вы вернетесь к последнему коммиту.
Анкит Сингх
-2

Если ваш последний коммит находится в основной ветке, вы можете просто использовать

git checkout master
Джеки Сюй
источник