我正在做git bisect
并且在到达有问题的提交后,我现在正试图向前/向后迈出一步以确保我在正确的位置。
我知道HEAD^
会在历史上倒退,但是还有另一条捷径可以让我前进(朝向未来的特定提交),如下所示:
A - B - C(HEAD) - D - E - F
我知道我的目标是 F ,我想从 C 转移到 D 。
注意:这不是Git: How to move back and forth between commits的重复,我的问题略有不同,但没有回答
答案 0 :(得分:48)
我已经尝试了一下,这似乎是向前导航的技巧:
git checkout $(git rev-list --topo-order HEAD..towards | tail -1)
其中towards
是提交或标记的SHA1。
说明:
$()
内的命令表示:获取当前HEAD
和towards
提交之间的所有提交(不包括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~'
答案 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)
作为一种解决方法,您可以使用
返回HEADgit 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 down
,git 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是分支中的第二个提交,依此类推)