如何在git中压缩推送后的提交?
这很好地解释了挤压多个提交: 但它不适用于已经推送的提交。如何挤压本地和远程回购中最近的几个提交 当我执行如何在git中压缩推送后的提交?,git,squash,Git,Squash,这很好地解释了挤压多个提交: 但它不适用于已经推送的提交。如何挤压本地和远程回购中最近的几个提交 当我执行git rebase-I origin/master~4 master时,将第一个设置为pick,将其他三个设置为squash,然后退出(通过emacs中的c-x c-c),我得到: 其中2f40是pickcommit。现在这4个提交都没有出现在git日志中。我希望重新启动编辑器,以便输入提交消息。我做错了什么?用 git rebase -i origin/master~4 master
git rebase-I origin/master~4 master
时,将第一个设置为pick
,将其他三个设置为squash
,然后退出(通过emacs中的c-x c-c),我得到:
其中2f40是
pick
commit。现在这4个提交都没有出现在git日志中。我希望重新启动编辑器,以便输入提交消息。我做错了什么?用
git rebase -i origin/master~4 master
然后用力推
git push origin +master
--force
和+
根据以下文件:
请注意,--force
适用于所有按下的参照,因此使用
使用push进行编辑。默认设置为matching
或多推
使用remote.*配置的目标。推送可能会覆盖其他引用
比当前分支(包括严格落后的本地引用)
他们遥远的对手)。要强制只推送一个分支,请使用+
在refspec前面推动(例如git推动原点+主控
强制
推送到主机
分支)
在一个分支上,我可以这样做(过去4次提交)
通过只创建一个分支
来处理&而不是主分支
,可以避免很多问题:
git签出-b mybranch
以下内容适用于已推送的remote
提交&混合了remote
推送提交/local
仅提交:
# example merging 4 commits
git checkout mybranch
git rebase -i mybranch~4 mybranch
# at the interactive screen
# choose fixup for commit: 2 / 3 / 4
git push -u origin +mybranch
我也有一些可能有用的方法。git-rebase-I master
您将打开编辑器vm和类似于以下内容的msgs
Pick 2994283490 commit msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message
#
#some more
在这里,我将所有其他提交的pick改为“f”(表示fixup)
git push-f原始要素/要素分支名称xyz
这将修复对一个提交的所有提交,并删除所有其他提交。
我这样做了,这对我很有帮助。与公认的答案略有不同,但我在压榨过程中遇到了很多困难,最终得到了答案
$ git rebase -i HEAD~4
- 在打开的交互式屏幕上,将“拾取”替换为“挤压”
在顶部显示所有要挤压的提交
- 通过
esc-->:wq
使用以下命令推送到远程:
$ git push origin branch-name --force
对于在单个分支上挤压两个提交(其中一个已被推送),以下操作有效:
git rebase -i HEAD~2
[ pick older-commit ]
[ squash newest-commit ]
git push --force
默认情况下,这将包括最新提交的提交消息作为对旧提交的注释。1)git rebase-i HEAD~4
详细说明:它在当前分支上起作用;HEAD~4表示压扁最近的四次提交;交互模式(-i)
2) 此时,编辑器打开了提交列表,以更改第二次和后续提交,将pick替换为squash,然后保存它
输出:已成功重新设置引用/标头/分支名称的基础并进行更新
3) git推送原点引用/头/分支名称--force
输出:
远程:
远程:要为分支名称创建合并请求,请访问:
远程:http://xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D=sss
远程:到ip:sc/server.git
+84b4b60…5045693分支机构名称->分支机构名称(强制更新)
当您使用Gitlab或Github时,您可能会以这种方式遇到麻烦。您可以使用上述方法之一挤压提交。我最喜欢的是:
git rebase -i HEAD~4
or
git rebase -i origin/master
为您的提交选择挤压或修复。此时,您将检查git状态。信息可能是:
On branch ABC-1916-remote
Your branch and 'origin/ABC-1916' have diverged,
and have 1 and 7 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
你可能会被诱惑去拉它不要那样做,否则您将面临与以前相同的情况
而是使用以下方法推送到原点:
git push origin +ABC-1916-remote:ABC-1916
+允许只强制推送到一个分支。您也可以git push--force origin master
:是的,但我总是喜欢这种语法,因为它比较短。当然,要知道,如果其他人可能已经从远程存储库中提取了,您可能不想这样做-在这种情况下,答案是“您不想”,我认为OP完全是在复制命令git-rebase-I origin/master
,并且实际上想知道如何将提交重新设置到比这更久远的位置,例如git-rebase-I origin/master~20 master
:+
只强制使用以它为前缀的refspec<代码>--force
将强制推送所有参考规范。请查看更新后的答案。在一个已经推送的分支上使用软命令执行此操作,最终为我推送了大量其他人的提交。一吨?怎么可能超过4个呢?你能详细说明一下吗?我不确定,但它与试图压扁已推送的提交有关。看起来其他人也有类似的经历-我会接受这个预期的答案。这是4个步骤中最清晰、最被接受的答案。如果编辑器是vi或vim,那么这是一个简单、有效、详细的:esc-->:wq,特别是如果你有冲突,他们可以比你强迫更容易解决push@Ray_Poly-这不会把那些远程提交放回本地提交吗?这就是我发现的。是的,它将创建一个新的提交,但您可以从中看到差异,这比每次重新设置git历史记录都要好。这需要成为最佳答案并感谢您。我发现这个答案是一种更好的挤压方法,而不是根据提交的数量盲目地进行挤压。特别是使用VM编辑器,您可以一次完成很多事情,如更改提交、删除提交,当然还有挤压。虽然不全面,但易于阅读:
On branch ABC-1916-remote
Your branch and 'origin/ABC-1916' have diverged,
and have 1 and 7 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
git push origin +ABC-1916-remote:ABC-1916