Как мне двигаться вперед и назад между коммитами в git? - PullRequest
80 голосов
/ 20 июля 2011

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

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

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

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


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

Ответы [ 11 ]

50 голосов
/ 07 января 2013

Я немного поэкспериментировал, и это похоже на хитрость для навигации вперед ( edit : он работает хорошо только при наличии линейной истории без коммитов слияния):

git checkout $(git rev-list --topo-order HEAD..towards | tail -1)

где towards - это SHA1 коммита или тега.

Объяснение:

  • команда внутри $() означает: получить все коммиты между текущим HEADи towards commit (исключая 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~'
41 голосов
/ 22 октября 2013

Все, что вам нужно, чтобы очистить, не отсоединенное состояние головы - это сбросить, а не оформить заказ.

git reset HEAD@{1}
38 голосов
/ 19 февраля 2013

Я считаю, что вы можете сделать:

git checkout HEAD@{1}

Чтобы сделать один коммит вперед во времени.Чтобы перейти к нескольким коммитам, используйте HEAD @ {2}, HEAD @ {3} и т. Д.

13 голосов
/ 12 ноября 2015

Это то, что я использую для навигации назад и вперед.

переход к следующему коммиту

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
}
8 голосов
/ 20 июля 2011

Скажем, F является последним коммитом на trunk (введите здесь свое собственное имя ветки) ... вы можете обозначить его как trunk~0 (или просто trunk), E как trunk~1, D как trunk~2 и т. Д.

Просмотрите в своем reflog еще несколько способов присвоения имен коммитам.

1 голос
/ 09 октября 2015

Я только что проверил это.Скажем, например, что вы находитесь в главной ветке. Затем выполните:

git checkout HEAD@{3}

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

git checkout master

Если вы не хотите переходить в исходное состояние и хотите, чтобы один из коммитов оставался в вашей голове и продолжал оттуда, тогда вам нужно оттам.например, после «git checkout HEAD @ {4}» вы можете выдать

git checkout -b MyNewBranch
1 голос
/ 20 июля 2011

Возможно, это не самый лучший способ, но вы можете использовать git log для просмотра списка коммитов, а затем использовать git checkout [sha1 of D] для перехода к D.

0 голосов
/ 08 октября 2018
branchName=master; commitInOrder=1; git checkout $(git log --pretty=%H "${branchName}" | tac | head -n "${commitInOrder}" | tail -n 1)

где:

branchName равно названию ветви

commitInOrder соответствует коммиту в порядке от самого первого коммита в выбранной ветке (поэтому 1 - самый первый коммит, 2 - второй коммит в ветке и т. Д.)

0 голосов
/ 04 апреля 2018

Если вы используете vs code, то Git history - это отличный плагин, где вы можете эффективно просматривать коммиты и проверять их содержимое в самом редакторе. проверить ссылку

0 голосов
/ 07 октября 2017

Движение назад - тривиально, так как вы движетесь вниз по дереву, и всегда есть один путь, по которому можно пойти

  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>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...