Подтвердить что ты не робот

Как перемещаться вперед и назад между фиксациями в git?

Я делаю git bisect, и после того, как вы достигли проблемного коммита, я теперь пытаюсь сделать шаг вперед/назад, чтобы убедиться, что я нахожусь в правильном.

Я знаю HEAD^, чтобы вернуться назад в историю, но есть еще один ярлык, чтобы заставить меня двигаться вперед (к конкретному фиксации в будущем) следующим образом:

A - B - C(HEAD) - D - E - F

Я знаю, что моя цель F, и я хочу перейти от C к D.


ПРИМЕЧАНИЕ: это не дубликат Git: как двигаться вперед и назад между фиксациями, мой вопрос немного отличается и на него нет ответа

4b9b3361

Ответ 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 - второй коммит в ветки и т.д.)