评估git和merge似乎不像我预期的那样工作

时间:2012-06-25 21:30:44

标签: git svn git-merge

我正在尝试评估从svn转移到git是否可行。我听说git中的合并比svn中的合并要好得多,但在我的测试中我没有看到它。

这就是我所做的:

  • 创建了一个名为main.c的文件

    #include <stdio.h>    
    
    function main() {
      int myNum = 10;
    
      printf("Hi, my num is %d\n", myNum);
    
      return 0;
    }
    
  • git init,git add。,git commit -m“Created main.c”,并推送到原始主人

  • 在main.c文件中,我故意不遵守编码标准,并且错误地命名了该函数。
  • 另一位用户出现并更改代码以遵守编码标准(花括号移动到下一行),提交和推送

    #include <stdio.h>    
    
    function main()
    { //This was changed to a specific coding standard
      int myNum = 10;
    
      printf("Hi, my num is %d\n", myNum);
    
      return 0;
    }
    
  • 我在main之前添加一个函数,提交并尝试推送它告诉我我的主分支不是最新的,所以我做了一个git pull origin master来使它更新,然后我得到冲突

    <<<<<<< HEAD
    function main() {
      int myNum = 10;
    =======
    function main()
    {
      int myNum = 10;
    >>>>>>> f0aceffb16f0a24638493367f4be6f2a09e22a82
    

问题:任何人都可以告诉我,如果我这样做不正确吗?我是否会遗漏某些步骤而导致自己悲伤?也许我真的不明白合并应该比svn更简单?

感谢您抽出时间,
克里斯

2 个答案:

答案 0 :(得分:1)

当您对同一行进行两次更改时,Git无法猜出您想要的是什么。没有SCM可以做到这一点。一个人必须告诉它什么版本应该“赢”。

有一些极端情况下git合并比subversion更干净。我没有在他面前,但坦率地说,在现代颠覆中,合并不太可能存在实质性差异。

你决定是否使用git不会归结为某种合并黑魔法。它将归结为git如何作为一个整体运作。

对我而言,git与其他SCM的区别在于它是如何运作的。因为它使用了一个加法模型(新的提交是对图形的补充)并且每次提交都是经过哈希处理的,所以用git丢失任何东西都非常困难。这种复杂的合并变得非常糟糕,导致一个不圣洁的混乱,你不确定你将如何倒带?只需git reset --hard到合并前的提交。重置你的分支11提交,然后决定它应该是10次提交?没问题,只需将分支移回第10次提交即可。决定你的最新功能分支应该是基于开发而不是高手?只需要几个命令就可以做出改变。

Git的不可变性和内容的哈希给了我一些我从未有过的SVN。置信度。相信如果我搞砸了什么,我可以想办法回到原来的位置。有信心,我可以检查我的变化,并确保他们在与他人分享之前是正确的。我不会感到恐慌“哦不......我只是对每个人做了什么?”

此外,虽然它不是我经常使用的东西,但是能够直接从其他开发者那里获取更改,甚至应用通过电子邮件发送给我的补丁文件的灵活性。

答案 1 :(得分:1)

你们两个都改变了接近的行,而Git在合并这样的近距离区域时是谨慎的。但是,如果在完全不同的区域进行了更改,则合并将完成。

像kdiff3这样的合并工具会自动解决这个合并,大部分时间都是正确的,但我相信Git不希望自动解决有风险的合并。