将更改从git子树推送到分支以获取拉取请求

Ste*_*mer 3 git git-subtree

如何创建对a的本地更改git subtree,然后将这些更改推送到子树的repo中的分支,以便我可以创建一个pull请求以将来自该分支的更改合并到子树中master

假设我有两个回购协议,project并且protocols,这两者都是我的控制之下.

第1步:在repo中添加protocols为asubtreeproject

$ git remote add protocols git@bitbucket.org:corp/protocols.git

$ git remote
origin
protocols

$ git subtree add --prefix=protocols protocols master --squash
...
From bitbucket.org:corp/protocols
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> protocols/master
Added dir 'protocols'
Run Code Online (Sandbox Code Playgroud)

第2步:在projectrepo中protocols对子树中的文件进行一些更改

$ cd protocols
$ echo "foo" > some_file
$ git commit -a -m "added foo"
Run Code Online (Sandbox Code Playgroud)

步骤3:在protocolsrepo中创建一个分支,并将我的本地更改从project/protocols子树推送到该分支

??

我不确定如何最好地实现这一目标......

一旦我的subtree更改成功推送到远程protocols仓库中的分支,我就可以创建一个pull-request来将这些更改合并回protocols master.

问题:

  • 我有一份本地副本protocols.我应该更改到该存储库,创建一个分支,然后更改回project并将subtree更改推送到我的本地存储protocols库?

  • 我可以将subtree更改直接送到本地 仓库中的新分支(尚未创建)protocols吗?

  • 我可以将subtree更改直接送到远程 仓库中的新分支(尚未创建)protocols吗?

  • 这是推荐的工作流程吗?

Ste*_*mer 6

在协议仓库中创建一个分支,并将我的本地更改从项目/协议子树推送到该分支

您可以使用单个命令实现此目的subtree push,指定新的远程分支:

$ git subtree push --prefix=protocols protocols feature
Run Code Online (Sandbox Code Playgroud)

这将feature在远程存储库中创建一个新分支protocols

您现在可以创建一个拉取请求,将feature分支合并回master协议分支.

将分支合并后,您可以使用pullwith 更新子树--squash

$ git subtree pull --prefix=protocols protocols master --squash
Run Code Online (Sandbox Code Playgroud)

这将创建另一个提交,将protocolsrepo 中的所有更改压缩为一个,然后合并提交以合并到您的projectrepo中

注意这个方法有一个小小的怪癖,那就是你的projectrepo中会有两个提交包含对repo的更改protocols.

  • projectrepo的protocols子树中做出的原始提交
  • 由后续子树拉动创建的提交(通常与其他协议更改一起使用,假设--squash已使用)

  • 将其推送到子树存储库会将项目分支的所有历史记录带到协议的功能分支,是否有解决方案可以避免这种情况? (2认同)