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

如何在git中的提交之间前后移动?,git,Git,我正在做一个git二分法,在完成有问题的提交后,我现在正试图向前/向后迈出一步,以确保我所处的位置正确 我知道HEAD^会在历史上倒退,但有没有其他捷径可以让我前进(朝着未来的特定承诺前进),比如: 我知道我的目标是F,我想从C转到D 注意:这不是的重复,我的问题略有不同,没有得到回答。可能不是最好的方式,但您可以使用git log查看提交列表,然后使用git checkout[sha1 of D]移动到D。假设F是trunk上的最新提交。(在此处插入您自己的分支名称)…您可以将其称为trun

我正在做一个
git二分法
,在完成有问题的提交后,我现在正试图向前/向后迈出一步,以确保我所处的位置正确

我知道
HEAD^
会在历史上倒退,但有没有其他捷径可以让我前进(朝着未来的特定承诺前进),比如:

我知道我的目标是F,我想从C转到D



注意:这不是的重复,我的问题略有不同,没有得到回答。

可能不是最好的方式,但您可以使用
git log
查看提交列表,然后使用
git checkout[sha1 of D]
移动到D。

假设F是
trunk上的最新提交。
(在此处插入您自己的分支名称)…您可以将其称为
trunk~0
(或仅称为
trunk
),E称为
trunk~1
,D称为
trunk~2


查看您的应用程序,以了解命名提交的更多方法。

我已经尝试了一些,这似乎可以实现向前导航的技巧(编辑:只有在没有合并提交的线性历史记录时,它才能正常工作):

其中,
toward
是提交的SHA1或标记

说明:

  • $()
    中的命令意味着:获取当前
    提交之间的所有提交(不包括
    ),并按优先顺序对它们进行排序(默认情况下,如在
    git log
    中,而不是
    rev list
    的默认时间顺序),然后取最后一个(
    tail
    ),即我们要去的那个
  • 这将在子shell中进行评估,并传递到
    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 reset HEAD@{1}

要在时间上向前执行一次提交。要向前执行多次提交,请使用HEAD@{2}、HEAD@{3}等。

您需要清除的、未分离的HEAD状态是重置,而不是签出

git reset HEAD@{1}

作为一种解决方法,您可以使用

git checkout <branch>
git签出
然后移动到您想要的提交,与

git checkout HEAD~<offset>
git签出头~
我刚刚做了一个测试。 比如说你在master branch 然后做:

所以头部被分离,然后您可以再次尝试转到任何其他提交:

git checkout HEAD@{4}
一旦您环顾四周,您就可以通过签出到该分支返回到原始状态

git checkout master
如果您不想进入原始状态,并且希望保留其中一个提交作为您的头并从那里继续,那么您需要从那里开始分支。 例如,在“git checkout HEAD@{4}”之后,您可以发出

git checkout -b MyNewBranch

这就是我用来来回导航的东西

移动到下一次提交

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
}
移动到上一次提交

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
}

向后遍历非常简单,因为您要沿着树向下移动,而且总有一条路要走

  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

如果您使用的是vs-code,那么git-history是一个很棒的插件,您可以在编辑器中高效地查看提交并检查其内容。 查看

其中:

branchName
等于分支名称


commitInOrder
等于从所选分支中的第一次提交开始按顺序提交(因此1是第一次提交,2是分支中的第二次提交,等等)。

如果您想看到前面的情况,可以使用此技巧,因为Git没有严格的命令

git log --reverse COMMIT_HASH..
例子 日志历史哈希列表:

A
B
C -> put this
D

使用命令
git log--reverse C..
,在输出中你会看到BA

也会有帮助。
git checkout-B new_branch HEAD~4
从HEAD返回4次提交,就像我不明白一样,如果他在C中,那么git log只会向他显示C、B和A。好的,明白了,但你必须像我一样做一个棘手的git日志VonCGoing forward提供的链接中的NDI在历史的直段上运行良好,但在遇到合并时会进入循环。是的,我实际上还没有在合并上测试它。我会在业余时间尝试看一看,但我暂时没有什么动力,因为我们已经同意在我们的项目中使用严格的线性历史;)回答得很好!修改为自动指定当前分支:这不正确
git log
默认情况下按时间顺序显示提交,与
rev list
相同,但使用
--graph
标志时除外。非常有说服力的证据表明git太复杂了。对于通常像撤销或重做这样简单的事情,这里我们有一个疯狂的冲突答案列表。我甚至还没有讨论任何相关的答案。FWIW,我用一组简单的线性提交尝试了这个版本,最后放弃了。~返回,而不是向前,trunk~2是“是”。此答案假设您有一个名为trunk的分支,指向
F
,并且您知道要移动到该分支的历史记录中的哪个位置。它并不是试图相对于头部向前移动,而是相对于躯干向后移动得更少。@theonlygusti你只是从头部向后移动了两次。你仍然假设分支
躯干
和你当前的
头部
是相同的,这在问题中没有显示,我所说的不是我所假设的,在某些外壳(如fish和powershell)中,通过
对分
git重置“HEAD@{1}”是不太可能的
git reflog
也有助于找到正确的提交。除非明确希望shell尝试,否则在shell命令中始终使用单引号
git log --reverse COMMIT_HASH..
A
B
C -> put this
D