【问题标题】:Push changes from git subtree to a branch for a pull request将更改从 git 子树推送到分支以进行拉取请求
【发布时间】:2016-10-12 16:35:12
【问题描述】:

如何创建对 git subtree 的本地更改,然后将这些更改推送到子树存储库中的分支,以便我可以创建拉取请求以将该分支中的更改合并到子树的 master

假设我有两个 repos,projectprotocols,它们都在我的控制之下。

第 1 步:将 protocols 添加为 subtreeproject 存储库中

$ 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'

第 2 步:在 project 存储库中对 protocols 子树中的文件进行一些更改

$ cd protocols
$ echo "foo" > some_file
$ git commit -a -m "added foo"

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

??

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

一旦我的subtree 更改已成功推送到远程protocols 存储库中的分支,我就可以创建一个拉取请求以将这些更改合并回protocols master

问题:

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

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

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

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

【问题讨论】:

    标签: git git-subtree


    【解决方案1】:

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

    您可以通过一个命令 subtree push 指定一个新的远程分支来实现这一点:

    $ git subtree push --prefix=protocols protocols feature
    

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

    您现在可以创建拉取请求以将 feature 分支合并回协议的 master 分支。

    分支合并回来后,您可以使用pull--squash 更新您的子树

    $ git subtree pull --prefix=protocols protocols master --squash
    

    这将创建另一个提交,将 protocols 存储库中的所有更改压缩为一个,然后合并提交以合并到您的 project 存储库中

    请注意,此方法有一个小问题,即现在您的 project 存储库中将有两个提交,其中包含对 protocols 存储库的更改。

    • project repo 的 protocols 子树中的原始提交
    • 由后续子树拉取创建的提交(通常与其他协议更改一起,假设使用了 --squash

    【讨论】:

    • 我在子树的原始存储库中使用了明确的git subtree split,然后是git push。这工作“很好”,但导致我无法合并到主分支中的孤立分支,因此我无法按照您的建议“现在创建拉取请求”。知道我错过了什么吗?谢谢!
    • @yoyo 我从来没有使用过明确的subtree split 恐怕,所以没办法,对不起!
    • 将其推送到子树 repo 会将项目分支的所有历史记录到协议的特性分支中,是否有解决方案来避免这种情况?
    • @RichaDua 我没有 - 你找到避免它的方法了吗?
    • @SteveLorimer 我找到了使用子树策略合并的解决方案。每当团队中的某个新成员克隆一个包含子树链接的存储库时,他们就不再具有该映射,因此我找到的解决方案是使用子树策略合并来拉取和推送对子树存储库的更改。例如,从子树存储库中提取更改的步骤是:1。 git checkout -b 2. git remote add -f 3. git merge --squash -s subtree --allow-unrelated-histories --no-commit /dev 4 . 添加、提交和推送功能分支。
    猜你喜欢
    • 2017-12-05
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 2016-04-23
    • 2010-11-07
    相关资源
    最近更新 更多