当git merge
期间发生冲突时,我有时会想知道哪一行是正确的(最后修改了哪一行)。示例:
<<<<<<< HEAD
div.some-class
=======
div.another-class
>>>>>>> commit message that doesn't give clue which commit to choose
#no clue which is good
如何确定最后修改了哪一行?
(我们假设最后一次提交是正确的,两个分支都修改它的情况会更麻烦。)
如果您真的只关心日期,git show HEAD
应该为您提供HEAD的日期和时间。如果您需要有关特定行的更多详细信息,git blame <filename>
应该可以帮助您找到相关的提交,然后您可以使用git show <commit>
来找到这些日期和时间。
类似地,对于"一些无意义的提交消息",该行应该包含一个SHA-1哈希,您也可以将其与git show <commit>
一起使用,以查找提交的日期和时间。
然而,值得重申的是,在大多数情况下,检查冲突提交的内容并在此基础上做出决定要重要得多。
经过进一步研究后编辑:可能有一种合并策略(git merge -s <strategy> [-X <strategy-option>]
)可以根据时间戳自动进行合并,但我在文档中找不到这样的选项。
经过更多研究后编辑:请参阅此处,了解可能与您的兴趣有关的类似但争议较小的SO问题。你可能不想要一个自动化的过程,那里的解决方案可能不适合你的情况,但那里提供的自定义合并驱动程序可能会帮助你。
在一个分布在多个存储库之间的股票Git配置中,你不能依赖日期来可靠地告诉你哪个提交比另一个"新"。
即使你可以,我也会犹豫是否采用基于此的合并策略
此外,如果你正在查看冲突标记,你可能最好选择一个图形合并工具来解决冲突(无论是哪一个,它们都优于手动合并)。如果要手动合并,建议配置merge.conflictstyle diff3
。
也就是说。。。
对于冲突的文件,你可以做
git log --pretty=%cd -1 HEAD -- <conflicted_file>
git log --pretty=%cd -1 MERGE_HEAD -- <conflicted_file>
这将为您提供每个分支上文件最近修改的提交日期(如前所述,这充其量是半可靠的)。您可以将其封装在一个简单的脚本中,该脚本为每个未合并的文件执行上述操作,然后打印出文件以及"我们的"或"他们的"。
git不存在正确或不正确的行,您决定哪一个是最好的选项,您只需要看到标签"header"one_answers"[other branch]",header是您当前的分支。
<<<<<<< HEAD (your actually branch)
div.some-class
======= (other branch)
div.another-class
>>>>>>> some meaningless commit message
如果你需要两个类,你必须写新行
div.some-class.another-class