因此,master
与我的分支(foo
)之间的差异显示github上的3个文件已更改。
现在,在我的本地分支foo
上,我做了git reset --soft <commit_hash>
来压缩提交,添加并提交,然后强行将其推送到origin foo
差异现在显示已更改10个文件!这怎么可能?
正如我所看到的,我所做的只是压缩了提交内容。我没有更改master
。我期望差异与压扁之前的差异相同。
答案 0 :(得分:2)
我们真的没有办法诊断这种事后事实。我将讲解使您的过程按预期工作的假设,也许这将有助于发现是否出现任何问题。另外,我建议对于挤压提交,最好使用rebase -i
。是的,还有一点额外的步骤可以编辑待办事项列表,但是它可以更明确地告诉git您打算做什么,因此出错的可能性较小。
所以...
假设您reset
进行了正确的提交(foo
和master
之间的合并基础),并且您的工作树和索引在启动时就干净了(即所有内容都已暂存并已{em>和 master
在此期间没有收到新的提交(您说您是将foo
与master
进行比较,但是可能应该将foo
与foo
和master
的合并基础进行比较),差异不应更改。
也就是说,如果您以类似的方式开始
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
时,软重置使工作树和索引保持不变。这意味着,即使未提交和未暂存的更改(和未跟踪的文件)仍然存在。因此,当您add
和commit
时,您可能会包含以前未提交的内容。要开始这种南瓜,您将
git checkout foo
git status
并确保status
说工作树是干净的,没有要提交的内容。
master
不变
如果您按预期使用git
并且未做任何会改变master
的事情(例如pull
从远程更改),那么这不应该是问题。但是,为了涵盖所有基础,如果您与master
进行比较(而不是与合并基础进行比较),那么您还会看到O
和master
之间的变化-如果{{ 1}}的过渡(最终您会得到
master
...),那么您的差异结果将发生变化。