9

我有两个存储库。有时,我想将的内容合并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."

添加othermain远程。

git remote add other ../other/
git fetch other

合并其内容。

git merge --squash other/master
git commit -m "Merge other."

它正确地添加了文件。现在,删除other.

cd ../other/
git rm two
git commit -m "Remove two."

合并更改为main.

cd ../main/
git fetch other
git merge --squash other/master

合并后git status说:

# On branch master
nothing to commit (working directory clean)

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

4

1 回答 1

8

这里的问题是您使用壁球提交。

当你做 amerge --squash时,你放弃了一个分支的所有历史。你还没有真正“合并分支”——你只是应用了它的历史的浓缩表示。因此,如果您稍后执行merge --squash,git 将重新应用分支历史记录中的所有提交(因为两个分支没有共同的祖先)。

当您执行第一个 时,您将创建一个包含“创建一、二和三”merge --squash的提交。main所以历史main是先“创四”,后“创一、二、三”。

当您执行第二个merge --squash时,您添加了一个提交,该提交由(实际上)“创建一个、两个和三个”加上“删除两个”组成。这两个提交的网络压扁!)是“创建一个和三个”。因此 git 会自动将“创建一和三”提交与您当前的回购状态合并 - 为您留下四个文件。内容合并自动成功,因为文件“一”和“三”两边相同。

如果您想使用遥控器使存储库保持最新,则应该使用“真正的”合并或挑选而不是挤压。Amerge --squash与“播放远程存储库中的所有新提交并将它们集成到这里”不同。

于 2013-01-15T17:54:14.473 回答