如何在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),即我们想要去的那个。
-  这是在subshell中进行评估,并传递给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 down , git up <branch-name>