假设我从某个地方克隆......
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 alt
和git merge master
,但我想知道我是否可以通过之前的git pull
自动执行此过程。这可能通过某种方式配置我的存储库吗?或者shell脚本是实现自动化的唯一方法吗?
答案 0 :(得分:2)
这可以通过某种方式配置我的存储库吗?
没有
或者shell脚本是实现自动化的唯一方法吗?
是
我不知道您的用例是什么,但通常您不会始终保持所有分支机构的最新状态。通常会根据需要手动执行此操作,因为由于潜在的合并冲突(无论是语法还是语义),完全自动化是不可能的。
你确定,你想合并而不是变基吗?合并将在每个已分歧的分支上创建提交。随着时间的推移,可能会有很多合并提交,这取决于您的用例可能无法创建有意义的历史记录。也就是说,选择rebase可能会让分支的已知工作状态更难回归,因为它的历史被重写,其旧历史最终将被垃圾收集。
如果,尽管(1),你真的想这样做:
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