Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何防止Git自动合并具有相同更改的特定行_Git_Merge_Versioning_Automerge - Fatal编程技术网

如何防止Git自动合并具有相同更改的特定行

如何防止Git自动合并具有相同更改的特定行,git,merge,versioning,automerge,Git,Merge,Versioning,Automerge,如果您有一个版本号在两个分支中增加的文件,如何防止Git自动合并两行更改定义版本的行 * Git automatically merges here, but shouldn't |\ | * change same line to the same new text * | change some line here \| * prior history/root commit 在我们的例子中,我们有一个支持迁移的数据库模式。我们的主模式文件定义了当前的模式版本。如果两个人在不同的

如果您有一个版本号在两个分支中增加的文件,如何防止Git自动合并两行更改定义版本的行

*   Git automatically merges here, but shouldn't
|\
| * change same line to the same new text
* | change some line here
 \|
  * prior history/root commit
在我们的例子中,我们有一个支持迁移的数据库模式。我们的主模式文件定义了当前的模式版本。如果两个人在不同的表中更改模式(例如添加数据库列),并且都将模式版本增加+1 Git,则会自动合并所有内容,但结果会被破坏

我建议在任何一行上添加一个特殊的标记,使Git不会自动合并这一行。我不知道有没有类似的功能,或者如何实现

下面是用于创建示例Git历史记录的shell命令列表,该示例说明了问题:

$ git init test
Initialized empty Git repository in $PWD/test/.git/
$ cd test/
$ echo "version 1" > file
$ git add file
$ git commit -m "add file v1"
[master (root-commit) 4ef6950] add file v1
 1 file changed, 1 insertion(+)
 create mode 100644 file
$ git checkout -b a
Switched to a new branch 'a'
$ echo "version 2" > file
$ git commit -a -m "bump to v2"
[a 85dba39] bump to v2
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git checkout -b b master
Switched to a new branch 'b'
$ echo "version 2" > file
$ git commit -a -m "bump to v2 in b"
[b b0fcf46] bump to v2 in b
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git merge a
Merge made by the 'recursive' strategy.          
$ git status                                # shouldn't be clean
On branch b
nothing to commit, working directory clean

我认为你的要求是不可能的。
相同的更改是相同的更改是相同的更改

有两件事会让你想到如何解决你的问题:

  • 让开发人员在同一行上保留一条注释,该行带有一些独特的内容,例如。G当前时间降到秒,unix时间。。。当文件被更改时,两个分支上的内容不太可能相同(不要使用特定于用户的内容,一个用户可能会同时执行这两个更改并忘记它们)

  • 使用预提交挂钩。在钩子中,检查提交是否是合并提交,然后尝试确定是否存在您描述的情况,在这种情况下,两个分支都更改了该行并中止合并


  • 这听起来更像是一个过程问题,而不是git的问题。您应该尽可能避免在多个提交中进行完全相同的文本更改。这将有助于避免在以后的考古考察中混淆历史。您应该找到方法对数据库模式进行更改,而不必在版本历史记录中重复这些更改。

    您的第一个建议是可能的,尽管我看不出有什么好处。人类往往忘记事情,这就是这个问题的目的。您的第二个建议听起来像是我建议的解决方案的基于钩子的实现,但我还不知道如何实现检查。我还没有写过这么复杂的钩子。你能详细说明一下吗。当然,人类最终会忘记这样做。但如果他不忘记这一点,就会出现合并冲突。而且他很可能忘记在他更改的版本之后直接更改注释,而不是忘记版本在两个分支中增加。您还可以编写一个预提交钩子,该钩子是为忘记用户而安装的,它可以检查此冲突生成器是否已更新,也可以自动更新它(如果可能的话)。2.我没有具体的想法。类似于“检查是否是合并”,然后比较。。。。。。父提交针对相关文件的父提交的合并基,并比较两个合并分支是否进行了相同的版本更改。差不多吧。当然,这个钩子必须安装在存储库中。或者,或者/另外,你可以在中央回购的预收款挂钩中进行类似的检查(如果你有),然后在推送时集中验证。我不同意避免在两个分支中进行相同的更改。如果你有一个大型的分布式项目(.例如流行的自由/开源软件),你不能总是避免这些情况。大多数情况下,这是没有问题的,例如,如果人们修改相同的打字错误。在Git中跟踪线性版本号是一种特殊情况,但我不知道如何避免这种情况。我所知道的所有RDBMS迁移系统都使用从n到n+1的线性升级。使用Liquibase,它是我所知道的那些工具中最好的,每个变更集都由您提供的手动Id标识(可以是任何字符串,例如,一个计数的数字,对我们来说,它是变更集所在的模块加上当前日期和时间,一直到第二个,因此这些ID通常已经是唯一的)加上保存该变更集的文件加上编写该变更集的作者。