[英]How do I move forward and backward between commits in git?
我正在做一个git bisect
,在到达有问题的提交之后,我现在正试图向前/向后迈出一步,以确保我是正确的。
我知道HEAD^
到 go 在历史上倒退,但是还有另一个捷径可以让我前进(朝向未来的特定提交),如下所示:
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
和towards
提交之间的所有提交(不包括HEAD
),并按优先顺序对它们进行排序(如git log
中一样 - 而不是按时间顺序排列,这很奇怪rev-list
),然后取最后一个( tail
),即我们要 go 到的那个。git checkout
以执行结帐。 您可以在.profile
文件中定义一个 function 可作为预期参数别名访问,以向前导航到特定提交:
# 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 reset HEAD@{1}
向 go 及时提交一次。 到 go 转发多个提交,使用 HEAD@{2}、HEAD@{3} 等。
所有你需要弄清楚,而不是分离头 state 是重置,而不是结帐。
git reset HEAD@{1}
这就是我用来来回导航的东西。
移动到下一个提交
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
}
说 F 是trunk
上的最新提交(在此处插入您自己的分支名称)...您可以将其称为trunk~0
(或只是trunk
), E 为trunk~1
, D 为trunk~2
等。
查看您的reflog以了解更多命名提交的方法。
向后遍历是微不足道的,因为您正在向下移动树,并且总是有一种方法可以到达 go
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>
如果你想提前看,你可以做这个技巧,因为 Git 没有严格的命令。
git log --reverse COMMIT_HASH..
日志历史哈希列表:
A
B
C -> put this
D
使用命令git log --reverse C..
,在 output 中,您将看到B和A 。
我刚刚对此进行了测试。 比如说你在 master 分支然后做:
git checkout HEAD@{3}
所以 head 被分离,然后你可以再试一次 go 到任何其他提交:
git checkout HEAD@{4}
环顾四周后,只需查看该分支,您就可以 go 回到原来的 state。 在我的例子中:主分支
git checkout master
如果您不想将 go 转换为原始 state,并且希望将其中一个提交保留为您的头部并从那里继续,那么您需要从那里分支。 例如在“git checkout HEAD@{4}”之后,你可以发出
git checkout -b MyNewBranch
作为一种解决方法,您可以返回 HEAD
git checkout <branch>
然后转到您想要的提交,使用
git checkout HEAD~<offset>
如果您使用的是 vs 代码,那么 Git 历史记录是一个很棒的插件,您可以在编辑器本身中有效地查看提交并检查其内容。 查看链接
branchName=master; commitInOrder=1; git checkout $(git log --pretty=%H "${branchName}" | tac | head -n "${commitInOrder}" | tail -n 1)
在哪里:
branchName
等于分支名称
commitInOrder
等于从所选分支中的第一个提交开始按顺序提交(因此 1 是第一个提交,2 是分支中的第二个提交,等等)
可能不是最好的方法,但您可以使用git log
查看提交列表,然后使用git checkout [sha1 of D]
移动到 D。
我会使用git-reflog
和git-reset
。
这与您运行git-bisect
的情况不同,但假设您git-reset
提交 C 并希望将其移回提交 F。
此时, git-reflog
看起来像这样:
$ git reflog show
4444444 (HEAD -> main) HEAD@{0}: reset: moving to 4444444
1111111 HEAD@{1}: commit: F
2222222 HEAD@{2}: commit: E
3333333 HEAD@{3}: commit: D
4444444 (HEAD -> main) HEAD@{4}: commit: C
5555555 HEAD@{5}: commit: B
6666666 HEAD@{6}: commit: A
然后,您可以通过指定 SHA1 hash 或 HEAD 的偏移量来运行git-reset
到 go 回到任何提交。
在你的情况下,运行git-reset
如下:
$ git reset 1111111
或者
$ git reset HEAD@{1}
推进一次提交的最短方法是:
git checkout @{1}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.