git - `git rebase` 使用哪个顺序从 merge 的分支中挑选提交?

标签 git git-rebase

假设我们有:

C1--C2--C3--C6--C7   <- topic, HEAD
 \   \     /
  \  C4--C5      
   \
    C8--C9           <- master

(我们添加了一个空的 file1 并提交到 C1,添加了一个空的 file2 并提交到 C2 , 等等)。

然后我们做:

$ git rebase master

结果是:

C1--C8--C9                         <- master
         \
         C4'--C2'--C5'--C3'--C7'   <- topic, HEAD

我已经创建了一个自动 bash 脚本 here ,如果你愿意,你可以测试它。

正如我从 chapter 3.6 in git-scm.com book 中了解到的那样, Git 跳过了 C6 merge 后的结果,所以 C6' 不在这里呈现。

我的问题是,Git 使用哪个顺序从 topic 分支中挑选?为什么结果是 ...-C4'--C2'--C5'--C3'--C7' 而不是 ...-C2'--C3'-- C4'--C5'--C7'(按时间顺序)?

最佳答案

(顺便说一下,感谢复制器脚本——它在这里非常有用。)

顺序在过去有所不同,但通常它是通过运行 git rev-list(git log 的姊妹命令生成的,它只生成哈希 ID默认)。由于哈希 ID 对人类来说很难,使用 git log 查看顺序通常更容易。

在这种情况下,订单来自:

$ git log --oneline --reverse --no-merges master..topic
5ff52aa C4
aefbb19 C2
0363c27 C5
90aaf5d C3
f953082 (topic) C7

但是,如果我们添加 --topo-ordergit rebase 在各种较旧的 Git 版本中所做的,我们得到:

$ git log --oneline --reverse --topo-order --no-merges master..topic
aefbb19 C2
90aaf5d C3
5ff52aa C4
0363c27 C5
f953082 (topic) C7

在有多个事件提交可供选择的情况下,实际顺序基于提交时间戳。也就是说,Git 正在进行修订,从 tip commit 向后。每当有 merge 时,Git 将所有父项放入优先级队列,增加要访问的提交数。优先级队列的默认排序顺序基于提交者时间戳。因为 git rebase 没有设置任何其他优先级,所以这是被使用的优先级。

(新的非拓扑排序顺序是新的 git rebase--helper 内部命令的结果,它首次出现在 Git 2.13 版中。 merge “保留“——真的,重新创建——git rebase -p 的变体仍然使用拓扑排序。花哨的新标签 git rebase -r 不需要拓扑排序。 )

关于git - `git rebase` 使用哪个顺序从 merge 的分支中挑选提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52847577/

相关文章:

git - 执行时出错 "npm install"

git:显示来自旧提交的文件的 future

git - 如何从 gitlab/github 克隆我的所有存储库?

Git - merge 与 rebase

Git 日志 rebase

SCSS 。如何使用已更改的文件创建存档?

程序文件的 git 命令 (x86)

git rebase upstream/master 与 git pull --rebase upstream master

Git rebase 分支到旧的提交

git - 如何 merge 两个不相关的 git 存储库,保留历史