Git在合并时忽略已删除的文件

Ger*_*osi 9 git

我有两个存储库.不时,我要的内容合并othermain.但是,合并会忽略已删除的文件.让我通过一个例子解释一下:

mkdir -p test/main test/other

cd test/other/
git init
touch one two three
git add .
git commit -m "Add one, two and three."

cd ../main/
git init
touch four
git add .
git commit -m "Add four."
Run Code Online (Sandbox Code Playgroud)

添加othermain远程.

git remote add other ../other/
git fetch other
Run Code Online (Sandbox Code Playgroud)

合并其内容.

git merge --squash other/master
git commit -m "Merge other."
Run Code Online (Sandbox Code Playgroud)

它正确添加文件.现在,删除一个文件other.

cd ../other/
git rm two
git commit -m "Remove two."
Run Code Online (Sandbox Code Playgroud)

合并更改为main.

cd ../main/
git fetch other
git merge --squash other/master
Run Code Online (Sandbox Code Playgroud)

合并后git status说:

# On branch master
nothing to commit (working directory clean)
Run Code Online (Sandbox Code Playgroud)

我希望合并删除two,因为它已被删除other.我究竟做错了什么?

Bor*_*lid 7

这里的问题是你使用壁球提交.

当你这样做时merge --squash,你放弃了分支的所有历史.你还没有真正"合并分支" - 你刚刚应用了其历史的精简表示.因此,如果你稍后再做merge --squash,git将重新应用分支历史中的所有提交(因为这两个分支没有共同的祖先).

当您执行第一个时 merge --squash,您创建一个main包含"创建一个,两个和三个" 的提交.所以历史main首先是"创造四个",然后是"创造一个,两个和三个".

当您执行第二步时merge --squash,您添加一个提交,其中包含(实际上)"创建一个,两个和三个"以及"删除两个".这两个提交的净在一起(压扁!)是"创建一个和三个".因此git自动将"创建一个和三个"提交与您当前的repo状态合并 - 留下四个文件.内容合并自动成功,因为文件"一"和"三"在两侧是相同的.

如果您想使用遥控器保持最新的回购,您应该使用"真正的"合并或挑选而不是挤压.A merge --squash与"通过远程存储库中的所有新提交进行播放并将它们集成到此处"不同.