git 重命名 vs 删除重复启发式

问题描述 投票:0回答:2

假设我将文件从

a.txt
重命名为
b.txt
。 Git 正确地检测到这一点;很不错。 这是一个更棘手的案例。我有两个相同的文件,
x.txt
y.txt
。我想删除它们并将结果称为
z.txt
。 Git 报告一项重命名和一项删除。问题是,哪个文件被重命名,哪个文件被删除?谁在乎,它们是一样的,对吧?但只有重命名的那个才能保留其历史,我确实有偏好。

git version-control delete-file file-rename dvcs
2个回答
0
投票

如果你有偏好,不要依赖git的去重。使用

git mv x.txt z.txt
明确重命名您想要的一个,并使用
git rm y.txt
删除另一个。注意:这假设你想保留
x.txt
的历史。如果你想保留
y.txt
的历史,在上述命令中交换
x.txt
y.txt


0
投票

这是 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分支上完成的。

© www.soinside.com 2019 - 2024. All rights reserved.