请考虑下一个场景,从以下名为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。你能解释一下我在这里缺少什么吗?
答案 0 :(得分:2)
一切正常。 Git负责版本控制文件内容,而不是分析程序。现在没有版本控制系统可以按照你的期望做到,因为它正是它 - "你期望"而不是"正确的事情"。
想象一下,您先拨打foo()
,然后拨打电话bar()
,而不是添加。您可以说"确保foo()
已经bar()
,因此该部分不是必需的"。但是git不了解Fortran,它不知道你的意图,并且它对符号执行和删除bar()
的安全性一无所知。
合并是安全的,因为您没有丢失任何数据。您可以从两个分支机构获得所有信息,现在由您来决定您希望结果看起来像什么。如果您想保护自己免受意外更改,请将单元测试添加到您的应用程序中,以便您可以轻松验证前/后合并,结果是您所期望的。