lad*_*ads 7 git push git-amend
我已经在远程分支上推送了一个提交,现在我想改变它的内容,所以我尝试了git修改.如果执行git status,则表示两个分支分别具有1个和1个不同的提交.现在,如果我使用相同的提交消息推送修改后的提交将添加新提交,或者它将更改我推送的最后一次提交?
pok*_*oke 13
git commit --amend就像git rebase,将创建一个新的提交对象.该对象基于先前存在的提交,但它仍然是新提交并完全替换旧提交.
看看历史,这可能是这样的:
master
?
* --- * --- * --- A
Run Code Online (Sandbox Code Playgroud)
考虑到这A是原始提交.如果我们现在修改此提交,那么我们得到以下结果:
* --- * --- * --- A
\
--- A'
?
master
Run Code Online (Sandbox Code Playgroud)
所以我们得到一个不同的提交对象A',使用不同的哈希,并且我们所在的分支(这里:master)被更新为指向这一个.
现在,如果我们向该视图添加一个远程存储库,并且我们A之前将其推送到远程,那么它看起来像这样:
origin/master
?
* --- * --- * --- A
\
--- A'
?
master
Run Code Online (Sandbox Code Playgroud)
所以远程仍指向原始提交A,但我们的本地分支指向修改后的A'.这是一个问题,因为我们无法推送A'和origin/master指出,A'因为这将从A历史记录中删除已经推送的提交.
我们可以执行强制推送使用git push --force强制Git更新远程分支并确实A从历史记录中删除.重要的是要注意,这将打破已经A从遥控器取出的每个人的历史.如果其他开发人员A现在和远程点都在A',那么他们就会发生冲突,他们必须手动修复.这通常是一件痛苦的事情,因此您应该始终遵循以下规则:
永远不要改变(或修改)以前发布的提交.
更好的选择是添加一个新的提交B,它只是修复A:
origin/master
?
* --- * --- * --- A --- B
?
master
Run Code Online (Sandbox Code Playgroud)
这样,已发布的历史记录仍然与新的历史记录兼容,因此我们可以B毫无冲突地推向远程,每个人都很高兴.