刚使用git进行版本管理的时候,由于成员间的代码有的需要上线,有的不需要上线,如果直接merge,经常
会把别人不需要上线的代码合并的master,导致问题从生。所以,最稳妥的是只合并你需要的那些commits,不需要的commits就不合并进去。
那么如何从一个分支合并特定的文件或者Commits到另一个分支这个问题急待解。
- 合并某个分支上的单个commit
首先,用git log或sourcetree工具查看你想选择哪些commits进行合并,例如:
比如dev-w 分支上的commit 2aeefdacad6ed1586a1e035fb8860f11533db23c 非常重要,它含有一个紧急bug的修复或是其他内容。无论什么原因,
你现在只需要将 2aeefdacad6ed1586a1e035fb8860f11533db23c 合并到master,而不合并dev-w上的其他commits,所以我们用git cherry-pick命令来做:
1 | git checkout master |
这样 2aeefdacad6ed1586a1e035fb8860f11533db23c 就被合并到master分支,并在master中添加了commit(作为一个新的commit)。
cherry-pick 和merge比较类似,如果git不能合并代码改动(比如遇到合并冲突),git需要你自己来解决冲突并手动添加commit。
这里git cherry-pick每次合并过来会显示文件冲突(其实并没有代码冲突部分,只需手动解决既可)
- 合并某个分支上的一系列commits
在一些特定情况下,合并单个commit并不够,你需要合并一系列相连的commits。这种情况下就不要使用cherry-pick了,rebase 更适合。
假设你需要合并dev-w分支的commit 76cada ~62ecb3 到master分支。
首先需要基于dev-w创建一个新的分支,并指明新分支的最后一个commit:
1 | git checkout dev-w |
然后,rebase这个新分支的commit到master(–ontomaster)。76cada^ 指明你想从哪个特定的commit开始。
1 | git rebase --ontomaster 76cada^ |
得到的结果就是dev-w分支的commit 76cada ~ 62ecb3 都被合并到了master分支。
另外如果只想将dev-w分支的某个文件Test.java合并到master分支上。
1 | git checkout dev-w |
第一个命令: 切换到dev-w分支;
第二个命令:合并master分支上Test.java文件到dev-w分支上,将master分支上 Test.java 文件追加补丁到dev-w分支上 Test.java文件。你可以接受或者拒绝补丁内容。
如果只是简单的将dev-w分支的文件Test.java copy到master分支上;
1 | git checkout master |
分支test上有一个文件A,你在test1分支上, 此时如果想用test分支上的A文件替换test1分支上的文件的话,
可以使用git checkout test1, 然后git checkout test – A
在feature分支commit
切换至release分支
从feature分支检出相应文件
1 | #branch feature |