合并后如何重新设置基础?

Ste*_*ett 9 git git-merge git-rebase

我们有一系列这样的事件:

  1. 创建分支A,并向其中添加一些提交
  2. 时间流逝,数百个提交已添加到主服务器
  3. 母版合并为A
  4. 时间流逝,也许另外50次提交已添加到主服务器

是否可以将第3步中的合并转换为基准?如果没有别的,它将使即将进行的合并变得更加简单,因为历史记录更少了。

我们尚未启用重新启用功能。

Dan*_*ank 10

考虑以下Git图:

A...C...D...F
^       ^   ^ master
 \       \
  G...H...I...J
              ^ feature
Run Code Online (Sandbox Code Playgroud)

...表示“大量提交”。

假设我们想从本质上进行基准化,即将提交提交到要素的历史记录中,而不是在master的历史记录中,然后将其重新构建为master中的线性提交序列。这是因为我们在提交时将master合并为功能I。如果我们尝试重新设置基准,那么Git就会搞砸了,因为它试图将其应用到例如Cmaster之上并发现冲突。

我们可以通过从中获取实际更改feature并将其打包到新提交中来解决此问题。这是仅使用非常基本的Git命令执行此操作的方法:

(1) git checkout feature
(2) git merge master
(3) git reset A
(4) git add -A  # This stages all working copy changes
(5) git commit -m "Every change between A and J"
Run Code Online (Sandbox Code Playgroud)

在步骤(2)中,feature分支在master和中都具有所有更改J。步骤(3),在HEAD点后A,但我们的工作副本都来自变化masterJ和步骤(4)和(5)阶段和提交这些更改。

此时,我们的图形如下所示

A...C...D...F
^           ^ master
 \
  J'
  ^ feature
Run Code Online (Sandbox Code Playgroud)

请注意,J'其中包含所有内容A...F。现在我们做

git rebase master
Run Code Online (Sandbox Code Playgroud)

Git乐于将更改J'作为新提交应用J'',但是要添加的唯一更改是那些G...J更改,因为其他更改已在master中。所以现在我们有了

  A...F<--J''
master^   ^feature
Run Code Online (Sandbox Code Playgroud)

我们feature分支中的所有变化都被压入提交J''。此时,您可以根据需要以更精细的方式(甚至使用)重置F并重新应用更改。J''git add --patch


另一种方法基本上是相同的事情是read-tree在解释这对方的回答

git checkout master
git read-tree -u -m feature
Run Code Online (Sandbox Code Playgroud)

从此答案中窃取的另一种做同一件事的方法是

git diff master > feature.patch
git checkout master
patch -p1 < feature.patch
Run Code Online (Sandbox Code Playgroud)