如何在git中提交之间前进和后退?

时间:2011-07-20 09:32:23

标签: git

我正在做git bisect并且在到达有问题的提交后,我现在正试图向前/向后迈出一步以确保我在正确的位置。

我知道HEAD^会在历史上倒退,但是还有另一条捷径可以让我前进(朝向未来的特定提交),如下所示:

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

我知道我的目标是 F ,我想从 C 转移到 D


注意:这不是Git: How to move back and forth between commits的重复,我的问题略有不同,但没有回答

12 个答案:

答案 0 :(得分:48)

我已经尝试了一下,这似乎是向前导航的技巧:

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

其中towards是提交或标记的SHA1。

说明:

  • $()内的命令表示:获取当前HEADtowards提交之间的所有提交(不包括HEAD),并按优先顺序对它们进行排序(如默认情况下为git log - 而不是时间顺序,这是奇怪的rev-list}的默认值,然后取最后一个(tail),即我们要去的那个。
  • 这将在子shell中进行评估,并传递给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~'

答案 1 :(得分:41)

所有你需要清除,而不是分离头状态是重置,而不是结帐。

git reset HEAD@{1}

答案 2 :(得分:37)

我相信你可以做到:

git checkout HEAD@{1}

及时向前推进一次。要继续多次提交,请使用HEAD @ {2},HEAD @ {3}等

答案 3 :(得分:13)

这就是我用来来回导航的方法。

转到下次提交

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
}

答案 4 :(得分:8)

假设F是trunk上的最新提交(在此处插入您自己的分支名称)...您可以将其称为trunk~0(或仅trunk),E为{ {1}},D为trunk~1等。

请查看reflog,了解更多提名方式。

答案 5 :(得分:2)

如果您想向前看,可以执行此技巧,因为Git对此没有严格的命令。

git log --reverse COMMIT_HASH..

示例

日志历史记录哈希列表:

A
B
C -> put this
D

使用命令git log --reverse C..,在输出中,您将看到 B A

答案 6 :(得分:1)

可能不是最好的方式,但您可以使用git log查看提交列表,然后使用git checkout [sha1 of D]移动到D.

答案 7 :(得分:1)

我刚刚对此进行了测试。 比如说你在主分公司 然后做:

git checkout HEAD@{3}

所以head变得分离,然后你可以再次尝试去任何其他提交:

git checkout HEAD@{4}

完成环顾后,您可以通过检查该分支返回原始状态。在我的例子中:master branch

git checkout master

如果你不想进入原始状态,并希望保留其中一个提交作为你的头并从那里继续,那么你需要从那里分支出来。 例如在“git checkout HEAD @ {4}”之后,您可以发出

git checkout -b MyNewBranch

答案 8 :(得分:0)

作为一种解决方法,您可以使用

返回HEAD
git checkout <branch>

然后使用

转到您想要的提交
git checkout HEAD~<offset>

答案 9 :(得分:0)

向后移动是微不足道的,因为你正在向下移动树,而且总有一种方法可以去

  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 downgit up <branch-name>

答案 10 :(得分:0)

如果您使用的是vs代码,那么Git历史记录是一个非常棒的插件,您可以在其中有效地查看提交并在编辑器中检查其内容。 查看link

答案 11 :(得分:0)

branchName=master; commitInOrder=1; git checkout $(git log --pretty=%H "${branchName}" | tac | head -n "${commitInOrder}" | tail -n 1)

其中:

branchName等于分支名称

commitInOrder等于从所选分支的第一个提交开始的提交(因此1是第一个提交,2是分支中的第二个提交,依此类推)