Как перемещаться вперед и назад между фиксациями в git?
Я делаю git bisect
, и после того, как вы достигли проблемного коммита, я теперь пытаюсь сделать шаг вперед/назад, чтобы убедиться, что я нахожусь в правильном.
Я знаю HEAD^
, чтобы вернуться назад в историю, но есть еще один ярлык, чтобы заставить меня двигаться вперед (к конкретному фиксации в будущем) следующим образом:
A - B - C(HEAD) - D - E - F
Я знаю, что моя цель F, и я хочу перейти от C к D.
ПРИМЕЧАНИЕ: это не дубликат Git: как двигаться вперед и назад между фиксациями, мой вопрос немного отличается и на него нет ответа
Ответы
Ответ 1
Я немного поэкспериментировал, и это похоже на хитрость для навигации вперед (правка: она работает хорошо только тогда, когда у вас есть линейная история без коммитов слияния):
git checkout $(git rev-list --topo-order HEAD..towards | tail -1)
где в towards
SHA1 коммита или тега.
Объяснение:
- Команда внутри
$()
означает: получить все коммиты между текущим HEAD
и в towards
коммита (исключая HEAD
) и отсортировать их в порядке приоритета (как в git log
по умолчанию) вместо хронологического порядка, который странным образом используется по умолчанию для rev-list
), а затем возьмите последний (tail
), то есть тот, к которому мы хотим перейти. - это оценивается в подоболочке и передается в
git checkout
для выполнения проверки.
Вы можете определить функцию, доступную как псевдоним, ожидающий параметров, в вашем файле .profile
чтобы перейти к определенному коммиту:
# Go forward in Git commit hierarchy, towards particular commit
# Usage:
# gofwd v1.2.7
# Does nothing when the parameter is not specified.
gofwd() {
git checkout $(git rev-list --topo-order HEAD.."$*" | tail -1)
}
# Go back in Git commit hierarchy
# Usage:
# goback
alias goback='git checkout HEAD~'
Ответ 2
Все, что вам нужно для получения четкого, а не отсоединенного состояния головки, - reset, а не проверка.
git reset [email protected]{1}
Ответ 3
Я считаю, что вы можете сделать:
git checkout [email protected]{1}
Чтобы выполнить одно движение вперед во времени. Чтобы выполнить несколько коммитов, используйте HEAD @{2}, HEAD @{3} и т.д.
Ответ 4
Это то, что я использую для перемещения вперед и назад.
переход к следующей фиксации
function n() {
git log --reverse --pretty=%H master | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout
}
переход к предыдущему фиксации
function p() {
git checkout HEAD^1
}
Ответ 5
Скажите F - последняя фиксация на trunk
(введите здесь свое собственное название ветки)... вы можете ссылаться на нее как trunk~0
(или просто trunk
), E как trunk~1
, D как trunk~2
и т.д.
Загляните в reflog еще раз для того, чтобы называть коммиты.
Ответ 6
Вероятно, это не самый приятный способ, но вы можете использовать git log
для просмотра списка коммитов, а затем использовать git checkout [sha1 of D]
для перехода к D.
Ответ 7
Я просто сделал тест на это.
например, вы находитесь в мастер-ветке
Затем выполните:
git checkout [email protected]{3}
Итак, голова отсоединяется, и вы можете попробовать еще раз, чтобы перейти к любой другой фиксации:
git checkout [email protected]{4}
Как только вы закончите оглядываться, вы можете вернуться в исходное состояние, просто проверив эту ветку. В моем примере: главная ветка
git checkout master
Если вы не хотите переходить в исходное состояние и хотите, чтобы одна из коммитов была как ваша голова и продолжалась оттуда, вам нужно отлаживаться оттуда.
например, после "git checkout HEAD @{4}", вы можете выпустить
git checkout -b MyNewBranch
Ответ 8
В качестве обходного пути вы можете просто вернуться к HEAD с помощью
git checkout <branch>
И затем перейдите к фиксации, которую вы хотите, с помощью
git checkout HEAD~<offset>
Ответ 9
Перемещение назад тривиально, так как вы двигаетесь вниз по дереву, и всегда есть один путь.
function git_down
git checkout HEAD^
end
При прохождении вперед вы перемещаетесь по дереву, поэтому вам нужно быть явным, в какую ветвь вы нацеливаете:
function git_up
git log --reverse --pretty=%H $argv | grep -A 1 (git rev-parse HEAD) | tail -n1 | xargs git checkout
end
Использование: git down
, git up <branch-name>
Ответ 10
Если вы используете vs code, то Git history - это отличный плагин, где вы можете эффективно просматривать коммиты и проверять их содержимое в самом редакторе. проверить ссылку
Ответ 11
branchName=master; commitInOrder=1; git checkout $(git log --pretty=%H "${branchName}" | tac | head -n "${commitInOrder}" | tail -n 1)
где:
branchName
равно названию ветки
commitInOrder
равняется фиксации в порядке от самого первого коммита в выбранной ветки (таким образом, 1 - самый первый коммит, 2 - второй коммит в ветки и т.д.)