如何在git中的提交之间前后移动?

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

我知道历史会倒退,但还有另外一个捷径可以让我前进(朝着将来的具体承诺),像这样:

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

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


注意:这不是Git的重复:如何在提交之间来回移动 ,我的问题是稍有不同,并没有在那里回答

我已经尝试了一下,这似乎是窍门向前导航:

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

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

说明:

  • $()的命令意味着:获取当前HEAD和提交(不包括HEAD )之间的所有提交,并按优先顺序对它们进行sorting(就像在git log默认的那样 – 而不是按照默认的时间顺序rev-list ),然后把最后一个( tail ),即我们想要去的那个。
  • 这是在subshel​​l中进行评估,并传递给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~' 

我相信你可以做到:

 git checkout HEAD@{1} 

及时向前推进一项承诺。 要前进多个提交,请使用HEAD @ {2},HEAD @ {3}等

所有你需要清楚,不脱离头部状态是重置,而不是结帐。

 git reset HEAD@{1} 

说F是trunk上的最新提交(在这里插入你自己的分支名称)…你可以把它称为trunk~0 (或者只是trunk ),E作为trunk~1 ,D作为trunk~2等。

看看你的reflog有更多的方式来命名提交。

这是我用来来回导航。

移动到下一个提交

 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 } 

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

我只是做了一个testing。 比方说,你在主分支然后做:

 git checkout HEAD@{3} 

所以头被分离,然后你可以再次尝试去任何其他的提交:

 git checkout HEAD@{4} 

一旦你四处看看,你可以回到原来的状态,只要退房到该分支。 在我的例子:主分支

 git checkout master 

如果你不想回到原来的状态,并且想保留一个提交的头像,并从那里继续,那么你需要从那里分支出去。 例如在“git checkout HEAD @ {4}”之后,你可以发出

 git checkout -b MyNewBranch 

作为解决方法,您可以使用返回到HEAD

 git checkout <branch> 

然后转到您想要的提交

 git checkout HEAD~<offset> 

向后移动是微不足道的,因为你在树下移动,总有一条路要走

  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>