正确分离两个部分重叠的 git 分支

Properly separating two partially overlapping git branches

为了解决与当前正在开发的功能相关的问题,项目的协作者使用 GitHub 桌面应用程序从功能分支创建了一个新的 issue-1 分支。然后他们向 issue-1 分支添加了一堆提交。创建分支时出了点问题,现在提交历史看起来不对。下面的图表应该有助于解释预期和实际发生的情况。

0) 新分支前:

A - B - C - D (feature)

1) 预期历史:

              E - F - G (issue-1)
             /
A - B - C - D (feature)

2) 实际历史:

A - B - C - D - E - F - G (issue-1)
            ^
        (feature)

3) 将提交添加到功能分支会产生这样的树:

              H - I (feature)
             /
A - B - C - D - E - F - G (issue-1)

4) 而不是像这样(这是我们想要的):

              E - F - G (issue-1)
             /
A - B - C - D - H - I (feature)

在历史中,原始提交 A-B-C-D 现在似乎与 问题 1 分支和功能分支相关联。提交 E-F-G 似乎只在 issue-1 分支上(这是正确的)。

我想将 repo 从状态 2 获取到状态 1(上图)。由于提交 E-F-G 已经在他们自己的分支上,我认为所有需要发生的事情是早期的提交需要与 issue-1 分支分离。将提交 A-B-C-D 的原始状态恢复为仅在功能分支上而不是功能和问题 1 上的正确系列 git 命令是什么?

如果这是重复的,我们深表歉意。我找不到这个问题的解决方案,但我可能一直在寻找错误的东西。

git 中的分支只是指向存储库历史记录中特定提交的指针。因此,当您从 (feature) 分支创建 (issue-1) 分支时,它指向同一个提交 (D)。当您继续提交时,您正在移动您的 (issue-1) 指针以引用这些新提交 (E)、(F) 和 (G),而您的功能分支仍然指向提交 (D)。

当您将存储库签出到功能分支(指向提交 D)并继续对其进行新提交时,您将(功能)的指针移动到提交(H)和(I) .两个分支在提交 (D) 之前具有相同的历史记录,这是它们分歧的地方。

总之,您的提交历史没有任何问题,您根本不需要修改它。

有关 git 个分支的更多详细信息,请参阅 https://git-scm.com/book/en/v2/Git-Branching-Branches-in-a-Nutshell

从图论的角度来看,片段 3 和片段 4 是相同的 - 它们的不同之处在于您如何直观地绘制它们。所以,你很好,没有什么需要改变的。

当您从现有分支创建新分支时,新分支会自动 "inherits" 创建时现有分支的所有提交 - 这就是 Git 的工作方式。