Git将主人合并到function分支

假设我们在git中有以下情况:

  1. 创build的存储库:

    mkdir GitTest2 cd GitTest2 git init 
  2. 在主人的一些修改发生并得到承诺。

     echo "On Master" > file git commit -a -m "Initial commit" 
  3. Feature1分出主,一些工作完成:

     git branch feature1 git checkout feature1 echo "Feature1" > featureFile git commit -a -m "Commit for feature1" 
  4. 同时,在主代码中发现一个错误,build立一个修补程序分支

     git checkout master git branch hotfix1 git checkout hotfix1 
  5. 该bug在修补程序分支中得到解决,并被合并回主服务器(可能是在请求/代码检查之后):

     echo "Bugfix" > bugfixFile git commit -a -m "Bugfix Commit" git checkout master git merge --no-ff hotfix1 
  6. 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。