使用Git,我如何只合并文件删除,这些文件删除是另一个分支中较大提交的一部分

时间:2017-03-08 09:43:22

标签: git

我花了几个小时耗尽了我的google-foo技能,没有什么可展示的,所以这里有一个问题,来自git新手的git用户更多经验......

情景:

我有两个分支--B1和B2

B2从B1分支并具有以下提交--C5,C6,C7

提交C5有以下更改:

  • 许多文件已更改
  • 删除了许多文件

现在,如果可能的话,我只想将C5的一部分合并到B1,即“删除多个文件”的更改。

我应该直接在B1中删除这些相同的文件并提交,还是有更好的方法?

目的是最终将B1和B2合并在一起,所以如果在单独提交的两个分支中删除相同的文件,我不确定是否会出现问题。

我很感激您的任何意见。

2 个答案:

答案 0 :(得分:1)

摘要

无法仅合并提交的一部分。

然而,您可以reset(软或混合)在C5之前提交,在两个单独的提交中提交更改和删除,并在其上应用您的其他提交。但是,这将改变您的分支历史记录,因此如果您将分支推送到远程和/或其他任何人正在您的提交之上工作,那么您应该这样做。

详细

第一个可取的步骤,就像你想弄乱你的分支机构的历史一样,就是创建一个备用分支,以防一切都在南方。 git branch backup_branch这样做。如果你搞砸了所有事情,你可以git checkout backup_branch并在你的旧舞台上。

然后,你可以做git reset --hard HEAD~2。这会在您提交C5后立即将所有文件设置回状态。我们现在丢失了提交C6C7的更改,但稍后可以在我们的新提交之前cherry-pick

现在神奇的步骤是git reset HEAD~1。这将执行混合重置,将分支重置为C5之前的提交,但将您在C5中所做的所有更改保留为工作目录中的非分段更改。现在,您可以暂存所有删除,执行提交,然后暂存所有更改并执行另一次提交。 Voilà,两个单独的提交,一个删除,一个有变化。

要获取其他提交C6C7,您可以git checkout backup_branchgit log -n2向您显示有关这两个提交的信息及其SHA ID。回到原始分支,您可以git cherry-pick一个接一个地提交,或者同时提交两个。

您的数据将处于旧状态,但您的C5提交已由两个单独的提交替换。 Cherry选择其中一个到你的B1分支,就是这样。

答案 1 :(得分:0)

假设C5更改了foo.c并删除了bar.c。

git checkout B1
git cherry-pick C5 -n
git reset HEAD -- foo.c
git commit

这是最简单的方案。但在您的情况下,更改了更多文件,因此您需要重置所有已更改的文件。这可能不比直接从B1删除bar.c文件更方便。