考虑这个测试脚本。
#!/bin/sh -x
rm -rf test
git init test
cd test
for I in {1..100}; do
echo $I >> x
done
git add x
git commit -am "initial commit"
git checkout -b branch
git mv x y
git commit -am "renamed"
rm y
for I in {1..60}; do
echo branch$I >> y
done
for I in {61..100}; do
echo $I >> y
done
git commit -am "changed the first 60 lines in branch"
git checkout master
rm x
for I in {1..60}; do
echo master$I >> x
done
for I in {61..100}; do
echo $I >> x
done
git commit -am "changed the first 60 lines in master"
git merge -s recursive -X patience branch
git status
我想要发生的是让 git 检测到 x
在分支中被重命名为 y
,并给我机会解决 merge 冲突。
相反,git 忽略(未能检测到)重命名,并说 x
在分支中被删除,同时创建了一个新的不相关文件 y
。
我怎样才能说服 git 将其作为重命名的文件来处理?
谢谢!
最佳答案
你是对的:git 进行重命名检测,而不是重命名跟踪,如果文件更改“太多”(对于“太多”的某些值),git 会声明这是一个不同的文件,而不是而不是重命名的文件。
没有完美的解决方法。如果您的 git 足够新(1.7.4 或更高版本),通常最好的选择是通过 -X rename-threshold=<n>
标记为 git merge
.降低阈值会使 git 检测到更多重命名(您可以使用 git diff -M
来测试合适的阈值)。
关于当文件在移动后被显着修改时,Git 不会检测到重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34755563/