想象一下现有的代码库,文件为{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中进行任何更改。
据我了解,每个提交都包含整个代码库的快照,如下所示: source
因此,提交2对文件C和D进行了更改,但它也对提交1中的文件A和B进行了更改,这些更改不应合并。
那么,我如何合并来自Commit 2的C和D版本,而不更改父版本的A和B?
答案 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
中的文件不同的文件。