了解如何压缩提交

时间:2019-08-29 09:58:01

标签: git github

因此,master与我的分支(foo)之间的差异显示github上的3个文件已更改。

现在,在我的本地分支foo上,我做了git reset --soft <commit_hash>来压缩提交,添加并提交,然后强行将其推送到origin foo

差异现在显示已更改10个文件!这怎么可能?

正如我所看到的,我所做的只是压缩了提交内容。我没有更改master。我期望差异与压扁之前的差异相同。

1 个答案:

答案 0 :(得分:2)

我们真的没有办法诊断这种事后事实。我将讲解使您的过程按预期工作的假设,也许这将有助于发现是否出现任何问题。另外,我建议对于挤压提交,最好使用rebase -i。是的,还有一点额外的步骤可以编辑待办事项列表,但是它可以更明确地告诉git您打算做什么,因此出错的可能性较小。

所以...

假设您reset进行了正确的提交(foomaster之间的合并基础),并且您的工作树和索引在启动时就干净了(即所有内容都已暂存并已{em>和 master在此期间没有收到新的提交(您说您是将foomaster进行比较,但是可能应该将foofoomaster的合并基础进行比较),差异不应更改。

也就是说,如果您以类似的方式开始

x -- x -- O <--(master)
           \
            A -- B -- C <--(foo)

然后仅压缩提交内容意味着您应该以

结尾
x -- x -- O <--(master)
           \
            ABC <--(foo)

ABC上的内容应与C上的内容匹配,并且O当然没有变化,因此差异应该相同。

但是让我们看一下每个假设:

重置为正确的提交

通常,您实际上可以从

之类的东西开始
x -- x -- O -- y <--(master)
           \
            A -- B -- C <--(foo)

您仍然希望从O而不是从当前的master头进行替换提交,否则您的“压缩”提交将隐式撤消从y开始更改。那就是你要结束的

x -- x -- O -- y <--(master)
           \
            ABC <--(foo)

不是

x -- x -- O -- y <--(master)
                \
                 ~yABC <--(foo)

(如果您想结尾为

x -- x -- O -- y <--(master)
                \
                 ABC <--(foo)

然后您真的需要查看rebase而不是reset。)

所以reset命令可能类似于

git reset --soft $(git merge-base master foo)

或者如果您知道分支上有多少个提交

git reset --soft HEAD~3

或者如果您已经知道O的特定名称,则可以使用它。

工作树和索引清理

在移动HEAD时,软重置使工作树和索引保持不变。这意味着,即使未提交和未暂存的更改(和未跟踪的文件)仍然存在。因此,当您addcommit时,您可能会包含以前未提交的内容。要开始这种南瓜,您将

git checkout foo
git status

并确保status说工作树是干净的,没有要提交的内容。

master不变

如果您按预期使用git并且未做任何会改变master的事情(例如pull从远程更改),那么这不应该是问题。但是,为了涵盖所有基础,如果您与master进行比较(而不是与合并基础进行比较),那么您还会看到Omaster之间的变化-如果{{ 1}}的过渡(最终您会得到

master

...),那么您的差异结果将发生变化。