2014-03-13 64 views
2

我们是一群开发人员,他们从SVN切换到Git,认为它会更简单,更标准。不幸的是,直到现在我们只遇到了失败和问题。Git合并不便

我们不需要功能分支。我们有一个名为“开发”的分支,所有开发人员都共享。

我们习惯了TortoiseSVN,所以我们决定和TortoiseGit一起为UI做准备。

提交和推送很好。拉操作出现问题。 SVN很棒,即使在本地更改下载了新版本,自动合并了可能的内容并要求解决冲突的文件。在Git下,如果你使用相同的文件进行本地修改,那么就停在那里(即使它可以自动合并)。你有两个选择,要么提交你本地的修改(即使你的工作已经完成了一半),这些修改会污染“显示日志”窗口,其中包含大量无用的提交,或者存储,拉取,弹出存储,这些操作与SVN所做的操作类似一些无用的步骤。有更好的方法吗?

隐藏弹出操作尝试自动合并(很好),但在真正的冲突事情变坏。在SVN下很容易,你有一个新的文件,另一边的本地文件在差异视图的另一边,只是固定你的本地并保存它并标记为解决。在Git下,你有四个文件,“正常”文件,BASE文件,REMOTE文件和LOCAL文件。一个完全混淆的事情是,“远程”文件(他们的)实际上是包含你所做更改的隐藏文件,所以它不能帮助清晰。

因此,您选择打开合并工具的“编辑冲突”菜单选项。 TortoiseGitMerge界面不太友好,KDiff3在网上被广泛使用,所以我们决定使用它。所以你按合并按钮创建一个“合并”选项卡,并在冲突线上,你可以按A,B,C按钮。到现在为止,没关系。问题是,当你保存这个结果文件时,它会保存在file.cs.LOCAL.cs下(而不是file.cs?)。然后,在TortoiseGit下,无论您选择“已解决”,“解决使用我的问题”或“使用他们的解决方案”,它只是删除您的合并文件,并为您提供最终文件的错误版本(未完成合并工作)。我们设法得到它的唯一方法是对合并文件进行临时备份,标记为已解决并重新备份备份。我勒个去?在我们的工作流程中,我们做错了什么?

+0

听起来像你使用Git太像SVN而不是Git,并没有利用Git在本地提交更改并在与其他开发人员共享这些更改之前重写本地历史记录的能力。另外,你能不能分开你的最后一段,这太大了,不容易消化。 – 2014-03-13 19:00:51

+0

除非使用'pull --rebase'(即在远程更改之前添加我的更改),否则在执行(本地)更改时拉(在新的远程更改中)是没有意义的。每个开发者*可以*拥有尽可能多的本地分支,并且只将它们合并到主要的分支中进行发布。也许寻找有效使用git的工作流的建议,就像[atlassian](https://www.atlassian.com/git/workflows)中的那些建议一样。 – vonbrand

+0

感谢纸杯蛋糕的回复。你正在谈论推动之前多次提交?我们可以做到这一点,并且工作得很好(即使我想不出为什么我会这么做)。正如我所提到的,问题出在Pull上。按照建议拆分我的最后一段。 vonbrad:rebase看起来很有趣,除了逻辑上你会想在本地增加远程更改,而不是相反。你为什么说这不合乎逻辑?我正在开发一项功能,其他人正在更新应用程序的其余部分,我希望在处理我的功能时看到其更改处于活动状态。 – Dunge

回答

2

我会尝试给出一些指针和提示。首先我会说这个。如果你只是需要svn-features,那么去git是没有意义的。在这些情况下svn很好。 git可以做很多更强大的事情,但你必须做到这一点,任何其他方式最好是麻烦的。

这就是说。如果你的长期目标是充分采用git思维,那么它可能有助于“只是这样做”,就像svn一段时间,并逐渐改变你的想法。

当你做一个git pull它实际上做的两件事情

git fetch 
git merge 

git fetch 
git rebase 

这取决于配置设置或选项--rebase之一。在当地的一家分店(甚至是当地的主人),我更喜欢做基调,但是当涉及到冲突时,“他们”和“我的”是非常混乱的,但是这里发生了什么。

  1. git会先退你的工作副本和HEAD回到您的本地分支,起源分支分歧
  2. 然后应用所有提交的从源头。
  3. git然后会尝试重新应用您的提交一个接一个。如果现在发生冲突,它会打电话给你的变更,然后再重新申请“他们的”,这是正确的,但很混乱。想想“我的”就是已经在工作副本中的东西,“他们的”就是将要添加的东西,而且更有意义。

当你做一个合并,而不是一个rebase那么这是另一种方式。您的更改已经在工作副本“我的”中,并且正在合并的更改是“他们的”。不幸的是很混乱。

我从来没有使用kdiff3或TortoiseGIT,所以我不能帮助那里,但我会说这个,如果你使用命令行工具发生冲突,原始名称的文件将充满冲突标记,就像svn一样。使用任何工具,你舒服来解决冲突,然后

​​

git add <conflict file> 
git commit 

取决于如果你变基或合并来解决冲突,继续前进。

+0

这很有帮助。 Rebase看起来像典型的解决方案,因为它不会通过大量无用的“合并”提交来污染文件日志。我发现要在.gitconfig中添加配置行。但是我当然不能要求所有的开发者使用控制台命令,所以我希望TortoiseGit可以。现在,它仍然没有解释为什么合并工具不能如预期的那样工作。 – Dunge

+0

是的TortoiseGit拉命令似乎忽略配置(使用它自己的参数)和Rebase菜单选项要求在进入之前隐藏我的更改..所以我仍然混淆了。 – Dunge