2012-11-29 65 views
3

我的难题是这样的。我的团队成员修改了供应商组件。这个组件然后升级到当前版本,覆盖我的团队的变化。Git'合并',但指定远程/本地/基地提交在同一分支

有问题的部分有我的队友做出的重大更改,但升级时添加了最小的更改。我所拥有的是这样的:

---component version 1.0----team change A---team change B---component version 2.0 
     (stock)            (result of upgrade) 

我想是做合并,像这样:

  ----team change A---team change B 
     /        \ 
---component version 1.0     successful 'merge' 
     (stock)       /
     \------------component version 2.0 
         (result of upgrade) 

的基本原理是将球队的变化是比较容易,如果我们可以看到从component version 1.0供应商的变化到component version 2.0,我们从component version 1.0更改为team change B并合并这两组更改。

据我了解,要做到这一点的唯一方法是将分支重置为team change B,从component version 1.0检出一个新的分支和component version 1.0component version 2.0之间适用的差异作为一个修补程序,合并分支机构创建的,并提交解析度。

我希望有一种方法可以基本上模拟像git merge --BASE='component version 1.0' --LOCAL='team change B' --REMOTE='component version 2.0'这样的合并,这样我就可以使用合并解析工具来确定生成的文件的外观。

回答

1

如果您不想要重置分支(也许这已经发布到共享存储库,并且你不希望人们必须处理强制更新s),您可以简单地将升级恢复到版本2.0,在版本1.0导入的分支上重新升级到版本2.0,然后合并该分支。

例如(假设你的分支称为mastermaster当前已检出):

# create a commit that is the opposite of HEAD, effectively undoing it 
git revert HEAD^ 
# create a new branch based on the original vendor import 
git checkout -b vendor <sha1-of-vendor-1.0-commit> 
# import the vendor 2.0 code 
git read-tree -u --reset master^ 
git commit -m "vendor 2.0 code" 
# merge in the new vendor code 
git checkout master 
git merge vendor 
+0

复位的主人是不是一种选择。我实际上最终使用了araxis merge的三路diff/merge功能。在每个窗口中选择相同的文件,然后在每个窗格中选择不同的版本:左侧团队更改B,中间通用祖先,右侧组件版本2.0。如果我没有进入实践,这将是最好的答案。 – kayaker243

0

你应该能够做到这一点这样(假设master是你的分支的名称,它可能不是):根据球队的变化性质

git checkout master 
git reset --hard <SHA of team change B> 
git checkout -b vendor-upgrade <SHA of component version 1.0> 
# replace contents of working directory with component version 2.0 
git add <everything that needs to be added> 
git commit -m "component version 2.0" 
git checkout master 
git merge vendor-upgrade 

,你可能有一些合并冲突来处理,并且取决于您是否在完成之后删除vendor-upgrade分支,或者只是将其留在那里以便在不可避免的版本3.0出来时进行分配......

相关问题