从“git pull”自动合并

时间:2016-03-27 10:13:07

标签: git

假设我从某个地方克隆......

git clone git://test.git
cd test

然后我从主分支做了20个分支...

git branch alt1
git branch alt2
....
git branch alt20

然后我在每个分支内进行单独提交,因此每个分支都有自己独特的历史记录。

现在几天过去了,我决定从最初的遥控器拉出来:

git checkout master
git pull

哪种方法可以正常工作,但现在我想将这些新的更改合并到我之前创建的20个分支中。

显然我可以在每个分支中手动git checkout altgit merge master,但我想知道我是否可以通过之前的git pull自动执行此过程。这可能通过某种方式配置我的存储库吗?或者shell脚本是实现自动化的唯一方法吗?

2 个答案:

答案 0 :(得分:2)

  

这可以通过某种方式配置我的存储库吗?

没有

  

或者shell脚本是实现自动化的唯一方法吗?

  1. 我不知道您的用例是什么,但通常您不会始终保持所有分支机构的最新状态。通常会根据需要手动执行此操作,因为由于潜在的合并冲突(无论是语法还是语义),完全自动化是不可能的。

  2. 你确定,你想合并而不是变基吗?合并将在每个已分歧的分支上创建提交。随着时间的推移,可能会有很多合并提交,这取决于您的用例可能无法创建有意义的历史记录。也就是说,选择rebase可能会让分支的已知工作状态更难回归,因为它的历史被重写,其旧历史最终将被垃圾收集。

  3. 如果,尽管(1),你真的想这样做:

  4. 合并

    for branch in $(git for-each-ref --format='%(refname:short)' 'refs/heads/alt*'); do
      git checkout $branch && git merge --no-edit master
    done
    

    衍合

    for branch in $(git for-each-ref --format='%(refname:short)' 'refs/heads/alt*'); do
      git checkout $branch && git rebase master
    done
    

    但请注意,由于合并冲突,其中任何一个都可能失败。至少,如果合并失败,你应该打破循环。

答案 1 :(得分:-1)

  

哪种方法可以正常使用,但现在我想将这些新更改合并到20个分支

答案是肯定的。 (但有脚本) 以下是有关如何操作的详细信息:

http://blogs.atlassian.com/2013/05/git-automatic-merges-with-server-side-hooks-for-the-win/

其他选择:

如果您决定手动执行此操作,则可以根据需要合并任意数量的分支。

你可以这样做:

git merge branchA branchB .... branchN

您可以执行的另一个选项是cherry-pick

# get the list of branches you wish to commit to :
# for example all the branches in this case but you can filter them as 
# you like
for ref in $(git branch -a); do .... done;

git rerere

这是您的杀手级功能。 假设您的合并每次合并时都会导致冲突。

您将如何使用脚本解决它?

答案是启用 git rerere

  

git rerere功能是一个隐藏的功能(Git实际上有很多很酷的隐藏功能,如果你还没有想到这一点)。

     

该名称代表"重复使用已记录的分辨率" ,顾名思义,它允许您让Git记住您是如何解决大块冲突的,以便下次看到相同的冲突时, Git可以自动为您解决

要启用rerere功能,您只需运行此配置设置:

git config --global rerere.enabled true

https://git-scm.com/blog/2010/03/08/rerere.html

enter image description here