假设我将文件从
a.txt
重命名为 b.txt
。 Git 正确地检测到这一点;很不错。
这是一个更棘手的案例。我有两个相同的文件,x.txt
和 y.txt
。我想删除它们并将结果称为z.txt
。 Git 报告一项重命名和一项删除。问题是,哪个文件被重命名,哪个文件被删除?谁在乎,它们是一样的,对吧?但只有重命名的那个才能保留其历史,我确实有偏好。
如果你有偏好,不要依赖git的去重。使用
git mv x.txt z.txt
明确重命名您想要的一个,并使用 git rm y.txt
删除另一个。注意:这假设你想保留x.txt
的历史。如果你想保留y.txt
的历史,在上述命令中交换x.txt
和y.txt
。
这是 hackish 但它可以通过在单独的分支上重命名并 forcing git 将两个文件保持在合并中来欺骗 git 本身来解决。
git checkout -b rename-branch
git mv a.txt b.txt
git commit -m "Renaming file"
# if you did a git blame of b.txt, it would _follow_ a.txt history, right?
git checkout main
git merge --no-ff --no-commit rename-branch
git checkout HEAD -- a.txt # get the file back
git commit -m "Not really renaming file"
直接复制,你会得到这个:
$ git log --graph --oneline --name-status
* 70f03aa (HEAD -> master) COpying file straight
| A new_file.txt
* efc04f3 (first) First commit for file
A hello_world.txt
$ git blame -s new_file.txt
70f03aab 1) I am here
70f03aab 2)
70f03aab 3) Yes I am
$ git blame -s hello_world.txt
^efc04f3 1) I am here
^efc04f3 2)
^efc04f3 3) Yes I am
使用侧面的重命名并取回文件,您将获得:
$ git log --oneline --graph master2 --name-status
* 30b76ab (HEAD, master2) Not really renaming
|\
| * 652921f Renaming file
|/
| R100 hello_world.txt new_file.txt
* efc04f3 (first) First commit for file
A hello_world.txt
$ git blame -s new_file.txt
^efc04f3 hello_world.txt 1) I am here
^efc04f3 hello_world.txt 2)
^efc04f3 hello_world.txt 3) Yes I am
$ git blame -s hello_world.txt
^efc04f3 1) I am here
^efc04f3 2)
^efc04f3 3) Yes I am
理由是,如果你想查看 original 文件的历史,git 会毫无问题地完成它......如果你想在 copy 上进行,那么 git 将遵循重命名所在的单独分支,并且那么它就可以在copy之后跳转到原始文件,只是因为它是在that分支上完成的。