git - 为什么 cherry-pick 告诉我所有线路都已更改?

已更新

考虑文件 abc,在提交 A 和 B 中相同

begin
 123
 456
 789
 klm
end

在 A 中,我们重构第一行 123 => AAA 并在结果之上选择 B。 Git 告诉 文件中的所有行都已更改。但是,如果我们通过更新任何一行来修改 B,它的 diff 将正常运行。 Git 会注意到在这种情况下只有这一行文本发生了变化,如果它也是第一行则报告单行冲突。

这里是重现的代码

mkdir full-shit ; cd full-shit
git init ; echo rrr > root ; git add root
git commit -m root

git checkout -b A ; git checkout -b B

function makeABC {
    echo begin > abc
    echo " 123" >> abc
    echo " 456" >> abc
    echo " 789" >> abc
    echo " klm" >> abc
    echo end >> abc
}

echo commiting ABC into branch B
makeABC ; git add abc ; git commit -m abc

echo will make a new file for A instead of 'git cherry-pick B'
git checkout A ; makeABC
echo 'git checkout A ; git cherry-pick B' would work equally well to make copy A = B
sed -i -e 's/123/AAA/g' abc
git add abc ; git commit -m "A refactored"


echo observe that !!!PICKING B TELLS THAT ALL LINES BETWEEN A AND B ARE DIFFERENT!!!
echo whereas if we picked C instead of B this would not happen -- git would make the diff operation properly, detectinc collision at the frist line of abc
case "B" in
    "B") git cherry-pick B ;;
    "B2") git checkout B
        sed -i -e 's/123/BBB/g' abc
        git add abc ; git commit -m BBB
        git checkout A ; git cherry-pick B ;;
esac

git gui & 

echo 'full-shit' folder created

请注意 Git Gui 将所有行标记为冲突,而 EOL 字符在两次提交中完全匹配,因为它们是在同一运行中通过相同代码创建的,您甚至可以使用从 B 到 A 的 cherry-pick 来避免文件系统精确复制的操作。

出于这个原因,我认为这个问题与 previous one 相关,而不是与 EOL 相关,后者通常会导致类似的结果。同样在那种情况下,如果我在 B 中的第一次提交之上添加 B2 更改,git 开始区分单行。git 的逻辑是什么?

最佳答案

如果您更改换行符类型(Windows 换行符与 Unix 换行符),有时会发生这种情况。 git 可以显示忽略空白更改的差异。

https://stackoverflow.com/questions/34189779/

相关文章:

node.js - 如何在 mongodb 中插入嵌套对象?

visual-studio-2013 - TFS 2013 - 合并 Word 文档

eclipse - 我可以在 Eclipse Indigo 3.7.2 中使用 Tomcat 8.0

xml - 将带有越南字符的数据导入 R

php - Symfony 2 - 登录服务

javascript - 日期选择器 Bootstrap 中的工具提示错误

android - 在 android 位图 xml 上设置背景颜色

android - 方向更改后反转共享元素转换

windows - 如何在本地主机上托管 Office 加载项?

mongodb - 如何运行 mongo-express(无需身份验证)?