我有以下简单的测试存储库(没有.gitignore
(
使用 https://gist.github.com/gabyx/6ea9cf93e3aaecc9229234ea1f1960fd 创建
testGitExamples.sh GitTest ex-wrong-committed-files && cd GitTest
Current history is:
* ec8ddf1 - Added file W (Wrong changes in W.2) (HEAD -> feature)
* 8dbb0a8 - Added file D
* 54f196a - Added file C
* 32834a3 - Added file W (Wrong committed file W.2)
* 44a223a - Added file B
* 196b079 - Added file A
* 9365b59 - Test your solution
* f00c3f7 - Init (master)
当我在这个回购上变基时
git checkout feature
git rebase -i -x 'git rm -r --cache . && git add . && git commit --amend --no-edit' HEAD~4
并在 2 号行添加echo "W.2" > .gitignore
git-rebase-todo
pick 7678be8 Added file W (Wrong committed file)
exec echo "W.2" > .gitignore
exec git rm -r --cache . && git add . && git commit --amend --no-edit
pick ded904f Added file C
exec git rm -r --cache . && git add . && git commit --amend --no-edit
pick dfb4b33 Added file D
exec git rm -r --cache . && git add . && git commit --amend --no-edit
pick 311736d Added file W (Wrong changes)
exec git rm -r --cache . && git add . && git commit --amend --no-edit
并执行git rebase --continue
(成功运行( git将上次提交 (ec8ddf1( 中的更改添加到.gitignore
中。
这是怎么回事?这是一个错误吗?
初始存储库 @ https://github.com/gabyx/GitTest
由于W.2
的内容与.gitignore
在最后pick
的内容相同,git
的重命名检测启发式认为这是对重命名文件的更改(由于它们的高度相似性(,并将更改从W.2
应用于.gitignore
。
这最终是由 git 不存储重命名的事实引起的。当你在git
中重命名一个文件时,假设有git mv
,被记录的是一个"File Added, File Deleted
"对。
一些 git 操作会看到这对,如果它们的内容相似(高于阈值,您可以选择使用--find-renames=
进行配置(,则会将其视为同一文件,但已重命名。
这不仅适用于git status
向您展示的内容,也适用于您的问题所展示的merge
和rebase
等操作。
您可以通过传递-X no-renames
来要求rebase
不执行重命名检测。
您的rebase
命令将是:
git rebase -i -x 'git rm -r --cache . && git add . && git commit --amend --no-edit' -X no-renames HEAD~4
这种类型的错误更常见于最小的工作示例中,因为 git 没有足够的上下文来做出正确的猜测。