git svn:避免分支,合并和重新定位中的大规模冲突

时间:2013-03-15 21:17:05

标签: git version-control branch git-svn merge-conflict-resolution

我使用git-svn在两台机器(Mac和Windows)上工作。我的远程仓库是一个svn。我使用Mac作为主仓库,Windows作为奴隶。因此,所有git-svn操作都在Mac上完成,而Windows机器只对Mac进行“git pull”或“git push”。

我的工作流程如下所示,经常让我陷入需要解决数百个冲突的境地:

  1. 我主要在Mac上工作,然后让Windows“git pull”并进行测试。
  2. 有时我需要在Windows上工作并提交功能分支。
  3. 然后我“git push origin”将分支推回Mac。
  4. 然后在Mac上我将“git merge windows_branch”导入我的主分支。
  5. 最后我“git svn rebase”和“git svn dcommit”。
  6. 在第5步,冲突就来了!! 我曾经花了3个小时来完成每一次冲突,使用“git mergetool”,“git rebase --continue”,“git rebase - -skip“和”git rebase --abort“工作流程。如果我很幸运,我可以弄清楚所有这些;但有时候,其中有太多的方式,更糟,重定位在遍历历史时反复经历同一组冲突(git只知道变化,而不知道文件);最终我感到困惑,误解了其中一些,并导致更大的噩梦。我学到的一些脚本可以帮助我做一些像“git accept-ours”或“git accept-theirs”这样的东西,但这对于涉及已删除文件的历史记录来说效果不好,我仍然需要反复接受。

    这真是一场噩梦,我真的开始犹豫使用分支和合并工作流程。问题仍然是我不确切地知道为什么会有这么多冲突。但是,如果有推荐的工作流程或实践可以帮助我防止此类冲突或轻松批量解决,那就太棒了。

    谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

我终于找到了问题并试图回答我自己的问题:

在我的全局.gitconfig中,我禁用了自动合并

mergeoptions = --no-commit

但是在每次“git pull”之后,我实际上并没有在我的Windows奴隶上提交合并,后来又向上游推送了我的Mac主机。这就是所有冲突的来源。

我认为我从Web获得的关于rebase / merge工作流程的一般建议是:

  1. 尽可能使用“git fetch”而不是“git pull”,以便做出进一步的决定。
  2. 使用“rerere”自动解决重复的已知冲突。
  3. 在“git svn dcommit”或分支合并之前,首先使用“git rebase -i”或“git merge --squash”将小提交压缩成胖的提交。这将在一定程度上减少重复冲突的次数。
  4. 在合并或重新定位之前创建重复的分支或跟踪分支,以保留未拆分的分支历史记录。
  5. 使用“git list-files -u”在合并前显示冲突的文件。
  6. 在每次合并操作之前,在合并之前使用“git diff branch1 branch2”以避免盲目合并。
  7. 使用“git show branch..file”查看分支下的特定文件以进行验证。