Git Merge只更改了特定提交中的文件(不是整个差异)

时间:2018-03-07 17:04:49

标签: git

想象一下现有的代码库,文件为{A,B,C,D,E}。 我克隆了repo,创建了一个分支,并发布了一系列更改

Commit 1 changes files {A, B}
Commit 2 changes files {C, D}
Commit 3 changes files {D, E}

在此示例中,我需要在提交2中将父>更改的文件合并到父级,但不需要在提交1中进行任何更改。

据我了解,每个提交都包含整个代码库的快照,如下所示: enter image description here source

因此,提交2对文件C和D进行了更改,但它也对提交1中的文件A和B进行了更改,这些更改不应合并。

那么,我如何合并来自Commit 2的C和D版本,而不更改父版本的A和B?

2 个答案:

答案 0 :(得分:1)

一种方法是在你的分支中创建一个包含所有3个提交的新分支。使用 git rebase 删除不需要的提交。然后结帐到父分支并使用 git merge new branch name

答案 1 :(得分:1)

这是git cherry-pick的用途。

根据我的理解,你想要一个新的分支,在master之上只有提交2,从这个状态开始:

o 8021  commit 3 that changes D and E  [feature-branch (HEAD)]
|
o bb6e  commit 2 that changes C and D
|
o f8a2  commit 1 that changes A and B
|
o 218a  commit 0 the initial state of the repository  [master]

首先,您应该在just-commit-2之上创建一个新的分支master并查看它:

git checkout master
git checkout -b just-commit-2

然后樱桃挑选提交2:

git cherry-pick bb6e

你最终将处于这种状态:

o 12c9  commit 2 that changes C and D  [just-commit-2 (HEAD)]
|
| o 8021  commit 3 that changes D and E  [feature-branch]
| |
| o bb6e  commit 2 that changes C and D
| |
| o f8a2  commit 1 that changes A and B
|/
o 218a  commit 0 the initial state of the repository  [master]

如果您在just-commit-2查看工作树的状态,则文件C和D将是唯一与master中的文件不同的文件。