如何在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>