2009-04-07 208 views
158

我一直在使用Git大约一年,并认为它太棒了,但我刚刚开始了第二个版本的项目并为它启动了一个新分支。我正在努力处理未来事情的最佳方式。git - 合并时跳过特定提交

我有两个分支叫做master10(for v1)和master20(for v2)。我一直在分支master10上对v1进行bug修复,并开发master20的新功能。无论何时我进行错误修复,我都会通过检查master20并执行git merge master10将它合并到v2中。到现在为止还挺好。

现在,我已经对v1做了一些改变,我不想在v2中进行修改,但是我想继续合并其他bug修复。我如何告诉Git跳过那个特定的提交(或一系列提交),但是我仍然希望合并其他错误修复。

我以为git rebase可能是我需要的,但阅读文档和我的头几乎爆炸。

我想我想要的就像是一个“git sync”命令,告诉git两个分支现在处于同步状态,将来只会合并来自此同步点的提交。

任何帮助表示赞赏。

回答

234

例如,如果您想要将分支“maint”中的大部分但不是全部的提交合并到“master”,则可以执行此操作。它需要一些工作----如上所述,通常的用例是合并来自分支的所有内容---但有时候会发生,你对发布版本进行了更改,而这些发布版本不应该被整合回来(也许该代码的已经被主人取代了),那么你如何表现呢?这里去...

因此,让我们假设maint已经应用了5个改变,其中一个(maint〜3)不会被合并回主,尽管所有其他应该是。你需要分三步进行:实际上将所有内容合并到一个之前,告诉git将maint〜3标记为合并,即使不合并,然后合并其余部分。神奇的是:

bash <master>$ git merge maint~4 
bash <master>$ git merge -s ours maint~3 
bash <master>$ git merge maint 

第一个命令合并一切之前你的麻烦MAINT提交到主。默认合并日志消息将解释您正在合并“分支”maint'(早期部分)“。第二个命令合并麻烦的maint〜3提交,但是“-s我们的”选项告诉git使用一个特殊的“合并策略”,实际上,它通过简单地保持你合并到的树并忽略您正在完全合并的提交。但它仍然以HEAD和maint〜3作为父项进行新的合并提交,因此修订图现在说明maint〜3被合并。所以实际上你可能也想使用-m选项来'git merge',以解释那个maint〜3 commit实际上被忽略了!

最终的命令简单地将maint(maint〜2..maint)的其余部分合并到master中,以便您再次同步。

+0

但是我不知道这是不是有点危险:什么是桅杆〜3绝对不能忽视,而是简单地推迟?使用你的解决方案,任何后续的git merge maint都不会合并回桅杆〜3。 – VonC 2009-04-08 17:09:39

+1

对于推迟的提交,我会创建一个“sub-branch”,完成你所描述的操作(包括git merge -s我们的maint〜3),然后合并从sub-branch到master的所有内容。我相信未来的“git merge maint”会将这段时间合并为“mast〜3” – VonC 2009-04-08 17:11:29

0

创建第三个分支,用于在master10中但不在master20中进行的更改。始终将master10视为您的“主人”,这是所有人中最稳定的部门。该分行的所有其他分行都希望始终保持同步。

+0

我想这可以工作,但我已经让自己进入这个状态,第三个分支可能会让我更加困惑。 :) – 2009-04-08 06:08:20

15

承诺包括祖先。如果不合并之前的提交,你不能合并提交。

当然,你可以挑选它们。当您有一个处于维护模式的分支时,这是一个很好的流程。

+1

谢谢,樱桃采摘会做的工作。不如我期待的那么好,但它会做。 – 2009-04-08 06:06:57

26

恕我直言,最合乎逻辑的事情是,把合并一切,然后用git revert(commit_you_dont_want)将其删除

例子:

git merge master 
git revert 12345678 

如果您有多个 “到忽略” 承诺,还是想编辑回复消息:

git merge master 
git revert -n 123456 
git revert -n abcdef 
git commit -m "... Except commits 123456 and abcdef" 

然后你的历史可能看起来像:

| ... Except 123456 and abcdef 
|\ Merge branch 'master' into 'your_branch' 

如果您有涉及这些“忽略”提交的冲突,则可以使用:

git merge master -X ours 

因此,您的版本将持续在另一个版本上。即使没有错误消息,您仍然可以“还原”那些不需要的提交,因为它们可能有其他更改没有冲突,并且您仍然不需要它们。

如果你有冲突包含不仅仅是“忽略”提交,你应该手动解决它们,你可能不得不在恢复过程中再次解决它们。

2

一种广告给我的project,它基本上包装了@araqnid描述的过程。

这是一种辅助性的,介绍如下GIT流量:

  • 有未决从维护分支合并到开发/ master分支
  • 的状态分支维护者检查每天/每周通知,并决定他/她自己是否需要所有提交,并阻止他们或者要求开发者阻止他们自己。最后,维护分支合并到上游。

从项目页面引述:

取决于它可能具有的维护或与主分支一起 客户特定的分支流程。这些 分支也被称为LTS分支。

通常情况下,热修复会进入bug报告的分支,然后提交被合并回主分支。

一般做法是,你想看到一个特定 分支和主之间有明显的增量,了解掌握是否包含所有 特性和错误修正各分公司与 完全同步的主人,即。

但是有时您不希望特别提交,因为它们是 客户特定的,并且其他用户不可见。或者你的 主分支分歧太大,它需要完全不同的 方法来解决这个问题,或者甚至更好,问题不再存在在那里 。

另外,如果从主站挑选维护分支 ,则所产生的提交将被阻塞在主站中。