如何在git中提交之间前进和后退?

Kos*_*tas 85 git

我正在做一个git bisect,在到达有问题的提交后,我现在正试图向前/向后迈出一步,以确保我在正确的一个.

我知道HEAD^要在历史上倒退但是还有另一条捷径可以让我前进(朝向未来的特定提交),如下所示:

A - B - C(HEAD) - D - E - F
Run Code Online (Sandbox Code Playgroud)

我知道,我的目标是˚F,我想从移动Çd.


注意:这不是Git的重复:如何在提交之间来回移动,我的问题略有不同,在那里没有回答

jak*_*b.g 51

我已经尝试了一下,这似乎是向前导航的技巧:

git checkout $(git rev-list --topo-order HEAD..towards | tail -1)
Run Code Online (Sandbox Code Playgroud)

其中towards是提交的SHA1或标记.

说明:

  • 命令内部$()意味着:获取当前HEADtowards提交之间的所有提交(不包括HEAD),并按优先顺序对它们进行排序(比如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~'
Run Code Online (Sandbox Code Playgroud)

  • 前进在历史的直接部分工作正常,但在遇到合并时进入循环. (2认同)
  • 很棒的答案!修改为自动指定当前分支:http://stackoverflow.com/a/23172256/480608 (2认同)
  • 通过将 `forward = !sh -c \"git switch --detach $(git rev-list --topo-order HEAD.."$1" | tail -1)\"` 添加到 `[alias]` 部分你的`.gitconfig`,你可以使用`forward`子命令增强git。例如,为了移动到 master,您需要输入“gitforward master”。 (2认同)

d3d*_*day 42

所有你需要清除,而不是分离头状态是重置,而不是结帐.

git reset HEAD@{1}
Run Code Online (Sandbox Code Playgroud)

  • 或在fish和powershell之类的某些shell中使用git reset“ HEAD @ {1}”。.git reflog`还可用于查找正确的提交。 (3认同)
  • 始终在 shell 命令中使用单引号,除非您明确希望 shell 尝试解释/扩展内容。在这种情况下,这一点尤其重要,因为目标是防止 shell 解释特殊字符。这样,您就不需要知道字符串是否包含有问题的内容。 (2认同)

w0u*_*ert 38

我相信你能做到:

git reset HEAD@{1}
Run Code Online (Sandbox Code Playgroud)

及时向前推进.要继续多次提交,请使用HEAD @ {2},HEAD @ {3}等.

  • 似乎哪儿也去不了 (6认同)
  • 临时版本:`git checkout HEAD@{1}` (3认同)

M K*_*M K 17

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

转到下一次提交

function n() {
    git log --reverse --pretty=%H master | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout
}
Run Code Online (Sandbox Code Playgroud)

转到上一次提交

function p() {
    git checkout HEAD^1
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我现在就用这个​​!**像我这样的其他初学者的注意事项**:要重新附加 HEAD,`git checkout <currentbranch>` 会附加到最新的提交。当前提交中的“git checkout -b <new-branch-name>”允许在新分支中进行更改。`git rebase -i` 也有效。**另外**,我将我的 `n()` 函数命名为 `nx()` 以避免与节点版本管理器“n”冲突。请务必检查别名! (2认同)

Use*_*ess 8

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

查看您的reflog,了解更多命名提交的方法.


Dzi*_*mid 5

向后遍历是微不足道的,因为您正在沿着树向下移动,并且总有一种方法可以走

  function git_down
        git checkout HEAD^
  end
Run Code Online (Sandbox Code Playgroud)

当向前遍历时,您正在向上移动树,因此您需要明确您的目标分支:

  function git_up 
        git log --reverse --pretty=%H $argv | grep -A 1 (git rev-parse HEAD) | tail -n1 | xargs git checkout
  end
Run Code Online (Sandbox Code Playgroud)

用法:git down,git up <branch-name>

  • 当涉及合并时,向后走也不完全是唯一的。尽管“HEAD^”通常是合理的默认值。 (3认同)