Git学习之~合并指定文件或Commits到另一分支

刚使用git进行版本管理的时候,由于成员间的代码有的需要上线,有的不需要上线,如果直接merge,经常

会把别人不需要上线的代码合并的master,导致问题从生。所以,最稳妥的是只合并你需要的那些commits,不需要的commits就不合并进去。
那么如何从一个分支合并特定的文件或者Commits到另一个分支这个问题急待解。

  1. 合并某个分支上的单个commit
    首先,用git log或sourcetree工具查看你想选择哪些commits进行合并,例如:

比如dev-w 分支上的commit 2aeefdacad6ed1586a1e035fb8860f11533db23c 非常重要,它含有一个紧急bug的修复或是其他内容。无论什么原因,
你现在只需要将 2aeefdacad6ed1586a1e035fb8860f11533db23c 合并到master,而不合并dev-w上的其他commits,所以我们用git cherry-pick命令来做:

1
2
3
git checkout master  

git cherry-pick 2aeefdacad6ed1586a1e035fb8860f11533db23c

这样 2aeefdacad6ed1586a1e035fb8860f11533db23c 就被合并到master分支,并在master中添加了commit(作为一个新的commit)。
cherry-pick 和merge比较类似,如果git不能合并代码改动(比如遇到合并冲突),git需要你自己来解决冲突并手动添加commit。

这里git cherry-pick每次合并过来会显示文件冲突(其实并没有代码冲突部分,只需手动解决既可)

  1. 合并某个分支上的一系列commits
    在一些特定情况下,合并单个commit并不够,你需要合并一系列相连的commits。这种情况下就不要使用cherry-pick了,rebase 更适合。
    假设你需要合并dev-w分支的commit 76cada ~62ecb3 到master分支。

首先需要基于dev-w创建一个新的分支,并指明新分支的最后一个commit:

1
2
git checkout dev-w 
git checkout -b newbranch 62ecb3

然后,rebase这个新分支的commit到master(–ontomaster)。76cada^ 指明你想从哪个特定的commit开始。

1
git rebase --ontomaster 76cada^

得到的结果就是dev-w分支的commit 76cada ~ 62ecb3 都被合并到了master分支。

另外如果只想将dev-w分支的某个文件Test.java合并到master分支上。

1
2
git checkout dev-w
git checkout --patch master Test.java

第一个命令: 切换到dev-w分支;
第二个命令:合并master分支上Test.java文件到dev-w分支上,将master分支上 Test.java 文件追加补丁到dev-w分支上 Test.java文件。你可以接受或者拒绝补丁内容。

如果只是简单的将dev-w分支的文件Test.java copy到master分支上;

1
2
git checkout master
git checkout dev-w Test.java

分支test上有一个文件A,你在test1分支上, 此时如果想用test分支上的A文件替换test1分支上的文件的话,
可以使用git checkout test1, 然后git checkout test – A

在feature分支commit

切换至release分支

从feature分支检出相应文件

1
2
3
4
5
6
7
8
#branch feature
git commit -a -m "msg"
git checkout release
#branch release
git checkout feature file-01
git checkout feature file-x
...
git commit -a -m "msg"

本文标题:Git学习之~合并指定文件或Commits到另一分支

文章作者:王洪博

发布时间:2018年05月27日 - 21:05

最后更新:2019年09月12日 - 02:09

原始链接:http://whb1990.github.io/posts/5040fe16.html

▄︻┻═┳一如果你喜欢这篇文章,请点击下方"打赏"按钮请我喝杯 ☕
0%