繁体   English   中英

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

[英]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 或标签。

解释:

  • $()中的命令意味着:获取当前HEADtowards提交之间的所有提交(不包括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 中,您将看到BA

我刚刚对此进行了测试。 比如说你在 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。

对于 GUI 和 vscode 用户,我建议使用扩展 git 图

在此处输入图像描述

我会使用git-refloggit-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM