[英]git merge subfolder of branch
我敢肯定这种情况很普遍,但是我还没有在git中找到有关如何处理它的任何信息。
想象一下git repo中的以下文件夹结构:
/server
/client
.gitignore
该回购包含客户端服务器应用程序的服务器代码和客户端代码。
这是master
分支的修订历史记录:
a01... (changes /server content)
b02... (changes /client content)
c03... (changes /server content)
d04... (changes /client content)
c05... (changes /server content)
d06... (changes /client content)
此时,我们选择提交b02
并在其中创建一个新的分支server_v2
。 在该分支上,我们进行两次提交e07..
和e08..
这是server_v2
的修订历史:
a01... (changes /server content)
b02... (changes /client content) <---- here, master and server_v2 are forked
e07... (changes /server content)
e08... (changes /server content)
这是修订图:
a01
b02
* *
* *
* *
* *
c03 *
d04 *
c05 *
d06 <-- master *
e07
e08 <-- server_v2
请注意,所有提交仅影响一个子文件夹,并且提交哈希的第一个字符指示哪个:
a: commit on /server, before the fork
b: commit on /client, before the fork
c: commit on /server, only in master
d: commit on /client, only in master
e: commit on /server, only in server_v2
现在,我们要使服务器的2.0版联机。 因此,我们希望master
包含e07
和e08
提交,而不是c03
和c05
提交。 这就是我们希望分支看起来像的样子:
master: a01, b02, d04, d06, e07, e08
server_v1: a01, b02, c03, c05
换句话说, master
应该包含新服务器( e07
和e08
)以及客户端上的更改( d04
和d06
)。 server_v1
应该包含旧服务器( c03
和c05
)。
我们可以重命名分支:
master --> server_v1
server_v2 --> master
现在master
确实包含新的服务器版本。
问题:我们丢失了/client
上的d04
和d06
提交。
将server_v2
合并到master
。 现在,修订图如下所示:
a01
b02
* *
* *
* *
* *
c03 *
d04 *
c05 *
d06 *
* e07
* e08 <-- server_v2
* *
* *
* *
* *
* *
[merge] <-- master
问题:这样, c03
和c05
提交是master
一部分。 我们不希望旧服务器上的更改成为新的master
分支的一部分。
有没有办法做到这一点?
git checkout master
git checkout -b server_v1 ## create server_v1 branch as off the current master
git checkout master
git revert c03 ##revert commits you don't need
git revert c05
git merge server_v2 ##merge your server_v2 changes into master (you can also rebase server_v2 onto master and fast-forward master to server_v2 if you want linear history)
而已。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.