在简单的源代码

时间:2015-08-24 01:17:23

标签: git merge

请考虑下一个场景,从以下名为main.f90的文件开始:

program main
  integer :: i

  i=0


  !This is "the comment in the middle"


  print *, i

end program  

我想把这段代码放在git版本控制下,所以我这样做:

git init
git add main.f90
git commit -m "First commit"

稍后,我开始一个名为“abranch”的新分支,然后在“中间评论”之前将i=i+1添加到main.f90

git checkout -b abranch
sed -i '6i  i=i+1' main.f90
git commit -a -m "Add 1 before the comment"

然后我再次检查主人,并在“中间的评论”之后添加i=i+1

git checkout master
sed -i '9i  i=i+1' main.f90
git commit -a -m "Add 1 after the comment"

在此之前,如果我在“master”或“abranch”中编译并执行main.f90,我将获得1作为输出,这是所需的结果。但是,我想只有一个程序副本,所以我将“abranch”合并到主程序中:

git merge abranch

问题是现在代码将输出2,因为合并的文件是:

program main
  integer :: i

  i=0

i=i+1

  !This is "the comment in the middle"

i=i+1

  print *, i

end program  

我的观点是git merge能够以非常安静的方式给出意想不到的结果。似乎git对于我的程序的版本控制是不安全的......但我认为这是它的主要用途。所以我可能以错误的方式使用git。你能解释一下我在这里缺少什么吗?

1 个答案:

答案 0 :(得分:2)

一切正常。 Git负责版本控制文件内容,而不是分析程序。现在没有版本控制系统可以按照你的期望做到,因为它正是它 - "你期望"而不是"正确的事情"。

想象一下,您先拨打foo(),然后拨打电话bar(),而不是添加。您可以说"确保foo()已经bar(),因此该部分不是必需的"。但是git不了解Fortran,它不知道你的意图,并且它对符号执行和删除bar()的安全性一无所知。

合并是安全的,因为您没有丢失任何数据。您可以从两个分支机构获得所有信息,现在由您来决定您希望结果看起来像什么。如果您想保护自己免受意外更改,请将单元测试添加到您的应用程序中,以便您可以轻松验证前/后合并,结果是您所期望的。