我有两个存储库.不时,我要的内容合并other成main.但是,合并会忽略已删除的文件.让我通过一个例子解释一下:
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)
添加other到main远程.
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.我究竟做错了什么?
这里的问题是你使用壁球提交.
当你这样做时merge --squash,你放弃了分支的所有历史.你还没有真正"合并分支" - 你刚刚应用了其历史的精简表示.因此,如果你稍后再做merge --squash,git将重新应用分支历史中的所有提交(因为这两个分支没有共同的祖先).
当您执行第一个时 merge --squash,您创建一个main包含"创建一个,两个和三个" 的提交.所以历史main首先是"创造四个",然后是"创造一个,两个和三个".
当您执行第二步时merge --squash,您添加一个提交,其中包含(实际上)"创建一个,两个和三个"以及"删除两个".这两个提交的净在一起(压扁!)是"创建一个和三个".因此git自动将"创建一个和三个"提交与您当前的repo状态合并 - 留下四个文件.内容合并自动成功,因为文件"一"和"三"在两侧是相同的.
如果您想使用遥控器保持最新的回购,您应该使用"真正的"合并或挑选而不是挤压.A merge --squash与"通过远程存储库中的所有新提交进行播放并将它们集成到此处"不同.