Git将主人合并到function分支
假设我们在git中有以下情况:
-
创build的存储库:
mkdir GitTest2 cd GitTest2 git init
-
在主人的一些修改发生并得到承诺。
echo "On Master" > file git commit -a -m "Initial commit"
-
Feature1分出主,一些工作完成:
git branch feature1 git checkout feature1 echo "Feature1" > featureFile git commit -a -m "Commit for feature1"
-
同时,在主代码中发现一个错误,build立一个修补程序分支
git checkout master git branch hotfix1 git checkout hotfix1
-
该bug在修补程序分支中得到解决,并被合并回主服务器(可能是在请求/代码检查之后):
echo "Bugfix" > bugfixFile git commit -a -m "Bugfix Commit" git checkout master git merge --no-ff hotfix1
-
feature1的开发仍在继续:
git checkout feature1
现在我的问题:说我需要在我的function分支的修补程序,也许是因为该错误也发生在那里。 我怎样才能达到这个没有重复提交到我的function分支? 我想阻止我的function分支上有两个新的提交没有任何关系的function实现。 这对我来说尤其重要,如果我使用合并请求:所有这些提交也将被包含在合并请求中,并且必须被审查,尽pipe这已经完成(因为修补程序已经在主服务器中)。
我不能做一个git merge master --ff-only
– “致命的:不可能快进,中止”,但我不知道这是否帮助我。
你应该可以重新绑定你的分支:
git checkout feature1 git rebase master
pipe理出现的所有冲突。 当你到达与错误修正(已经在主)的提交时,git会说没有改变,也许他们已经被应用了。 然后你继续rebase(同时跳过master中的提交)
git rebase --skip
如果您在function分支上执行git log
,则会看到bug修复提交只出现一次,并在主控部分中显示。
如何将主分支合并到function分支? 简单:
git checkout feature1 git merge master
在这里强制快进合并是没有意义的,因为这是不可能完成的。 你提交到function分支和主分支。 快进是不可能的。
看看gitflow 。 这是一个可以遵循的git分支模型,而你在不知不觉中已经做到了。 它也是git的一个扩展,它为新的工作stream程步骤添加了一些命令,这些步骤可以自动执行,否则您需要手动执行。
那么你在工作stream程中做了什么? 你有两个分支可以使用,你的feature1分支基本上就是gitflow模型中的“develop”分支。
您从主创build了一个修补程序分支并将其合并回来。 现在你被卡住了。
gitflow模型会要求您将修补程序也合并到devel分支,在您的情况下,它是“feature1”。
所以真正的答案是:
git checkout feature1 git merge --no-ff hotfix1
这将修补程序内所做的所有更改添加到function分支,但只有这些更改。 它们可能与分支中的其他开发改变相冲突,但是如果最终将特征分支合并到主分支,它们不会与主分支发生冲突。
请谨慎处理rebasing。 如果您所做的更改只保留在您的存储库本地,则只有重新分配,例如,您没有将任何分支推送到其他存储库。 重新启动是一个很好的工具,可以让您在将本地提交排入世界之前,将其提交到有用的订单中,但之后的重新configuration会为您的git初学者带来麻烦。
基于这篇文章你应该:
- 创build基于新版本的master的新分支
- 合并您的旧function分支到新的
- 解决新function分支上的冲突
这样你的历史保持清晰,因为你不需要回合并。 而且你不需要非常谨慎,因为你不需要git rebase
你也许可以做一个“樱桃select”来把你需要的确切的提交到你的function分支。
做一个git checkout hotfix1
得到hotfix1分支。 然后做一个git log
来获得提交的SHA1哈希(随机字母和数字的唯一标识一个提交的大序列)。 复制(或前10个左右的字符)。
然后, git checkout feature1
返回到你的特性分支。
然后, git cherry-pick <the SHA1 hash that you just copied>
这将提交, 只有提交,到您的function分支。 这种变化将会发生在分支 – 你只是“挑选”出来。然后,恢复工作,编辑,提交,推送等等内容。
最后,当你从一个分支执行另一个合并到你的特性分支(反之亦然)时,git将会认识到你已经合并了这个特定的提交,知道它不必再次合并, “跳过”它。
齐米的回答大致描述了这个过程。 具体细节如下:
1)创build并切换到新的分支。 确保新的分支是基于master
所以它将包括最近的修补程序。
git checkout master git branch feature1_new git checkout feature1_new # Or, combined into one command: git checkout -b feature1_new master
2)切换到新分支后,合并现有function分支中的更改。 这将添加您的提交而不复制修补程序提交。
git merge feature1
3)在新分支上,解决您的function和主分支之间的任何冲突。
完成! 现在使用新分支继续开发你的function。