Git不跟踪提交中的更改。每个提交包含存储库中文件的完整副本。“更改”是通过对比两个提交来确定的。
因此,简而言之,将
E
,
B
和
C
压缩成提交
F
,然后将其合并到dev分支上绝对没有问题。
B
提交仍将存在于dev分支上。当git将
F
与
B
进行比较时,只会将
C
和
E
引入的更改归属于
F
。
当然,您可以通过使用
git rebase
来解决这个问题,但这会带来一系列其他问题。例如,由于
git rebase
更改了您的分支历史记录(将您的提交移动到来自dev的最新提交之上),如果存在冲突,则每次重新基础时都必须重新解决这些冲突。如果您的问题需要一段时间才能解决,需要多次重新基础以保持与dev同步,那么这种情况很快就会变得无聊。
为了证明这一切都是真实的,你无需担心,我已经设置了一个GitHub示例存储库: https://github.com/cyborgx37/sandbox
首先,我们有dev分支,它有B
提交。
B:patch
|
A
我创建了feature1分支,其中包含提交记录C
、D
和E
。(请注意,因为D是一个合并提交,因此有两个父提交,B
也出现在提交历史中)
E
|
D:merge with dev
|\
C \
| B
A
最后,还有dev-with-feature1分支。
F
|
B:patch
|
A
我从dev创建了这个分支,然后使用了
git merge --squash feature1
git commit -m "F"
将feature1的所有提交压缩为单个提交F
。如果您检查F
提交的差异, 您会发现它不会"应用补丁"。由于B
已经包含了这些更改, 而F
只是重复了它们,git不会将它们与F
关联。
从另一个角度来看,这是责任链:
initial hello!
B:patch patch!
F new feature!!!
Git不跟踪提交中的更改。它存储您的完整项目状态。通过将提交与其父(或前任)提交进行比较,确定“更改”。因为
B
有补丁,所以git将该更改与
B
关联。因此,预计补丁也会在
F
中。唯一的例外是如果您删除了补丁,那么它就不会在
F
中。
dev
上进行变基即可解决这个问题。 - undefined