Git rebase 奇怪地添加了对 .gitignore 的更改



我有以下简单的测试存储库(没有.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" > .gitignoregit-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向您展示的内容,也适用于您的问题所展示的mergerebase等操作。

您可以通过传递-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 没有足够的上下文来做出正确的猜测。

最新更新