git merge分支的子文件夹

时间:2013-12-05 10:42:06

标签: git

我很确定这种情况很常见,但我没有找到任何关于如何在git中处理它的信息。


到目前为止发生了什么:

想象一下git repo中的以下文件夹结构:

/server
/client
.gitignore

repo包含Client-Server应用程序的服务器和客户端代码。

这是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包含e07e08提交,而不是c03c05提交。这就是我们希望分支看起来像:

master:     a01, b02, d04, d06, e07, e08
server_v1:  a01, b02, c03, c05

换句话说,master应包含新服务器(e07e08)以及客户端上的更改(d04d06 )。 server_v1应包含旧服务器(c03c05)。

选项1:

我们可以重命名分支:

master    --> server_v1
server_v2 --> master

现在master确实包含新的服务器版本。

问题:我们在d04上失去了d06/client次提交。

选项2:

server_v2合并到master。现在修订图如下所示:

a01
b02
 * *
 *    *
 *       *
 *          *
c03            *
d04               *
c05                  *
d06                     *
 *                     e07
 *                     e08 <-- server_v2
 *                   *
 *               *
 *           *
 *       *
 *   *
[merge] <-- master

问题:这样,c03c05提交是master的一部分。我们不希望旧服务器上的更改成为新master分支的一部分。

有没有办法实现这一目标?

1 个答案:

答案 0 :(得分:1)

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)

就是这样。