[英]GIT: how to squash several commits that have been pushed to a remote repo?
[英]How to squash commits in git after they have been pushed?
这很好地解释了压缩多个提交:
http://git-scm.com/book/en/Git-Branching-Rebasing
但它不适用于已经推送的提交。 如何压缩本地和远程存储库中最近的几次提交?
当我执行git rebase -i origin/master~4 master
时,将第一个保持为pick
,将其他三个设置为squash
,然后退出(通过 emacs 中的 cx cc ),我得到:
$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)
Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started
其中 2f40 是pick
提交。 现在,4 个提交都没有出现在git log
中。 我希望我的编辑器会重新启动,以便我可以输入提交消息。 我究竟做错了什么?
壁球在本地提交
git rebase -i origin/master~4 master
然后用力推
git push origin +master
--force
和+
之间的区别从git push
的文档中:
请注意,
--force
适用于所有被推送的引用,因此将它与push.default
设置为matching
或配置为remote.*.push
的多个推送目标一起使用可能会覆盖当前分支以外的引用(包括本地引用严格落后于他们的远程对手)。 要强制只推送到一个分支,请在 refspec 前使用+
来推送(例如git push origin +master
强制推送到master
分支)。
在一个分支上,我能够这样做(对于最后 4 次提交)
git checkout my_branch
git reset --soft HEAD~4
git commit
git push --force origin my_branch
与接受的答案略有不同,但我在挤压时遇到了很多困难,最终得到了它。
$ git rebase -i HEAD~4
使用以下命令推送到远程:
$ git push origin branch-name --force
很多问题可以通过只创建一个branch
来工作而不是在master
上工作来避免:
git checkout -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 并发送类似这样的消息
Pick 2994283490 commit msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message
#
#some more
在这里,我将所有其他提交的选择更改为“f”(代表修复)。
git push -f origin feature/feature-branch-name-xyz
这会将所有提交修复为一个提交,并将删除所有其他提交。 我这样做了,它帮助了我。
1) git rebase -i HEAD~4
详细说明:它适用于当前分支; HEAD~4 表示压缩最近的四个提交; 交互模式 (-i)
2)此时,编辑器打开了提交列表,以更改第二个和后续提交,将 pick 替换为 squash 然后保存。
输出:成功地重新定位和更新了 refs/heads/branch-name。
3) git push origin refs/heads/branch-name --force
输出:
remote:
remote: To create a merge request for branch-name, visit:
remote: http://xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D=sss
remote:To ip:sc/server.git
+ 84b4b60...5045693 branch-name -> branch-name (forced update)
为了在单个分支上压缩两个提交,其中一个已经被推送,以下工作:
git rebase -i HEAD~2
[ pick older-commit ]
[ squash newest-commit ]
git push --force
默认情况下,这将包括最新提交的提交消息作为对旧提交的评论。
当您使用 Gitlab 或 Github 时,您可能会以这种方式遇到麻烦。 您使用上述方法之一压缩您的提交。 我最喜欢的是:
git rebase -i HEAD~4
or
git rebase -i origin/master
为您的提交选择 squash 或 fixup。 此时,您将使用 git status 进行检查。 消息可能是:
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
+ 允许强制推送到一个分支。
Sqush 远程更改
git reset --soft master
git add .
git commit -m "this is the final commit message"
git push RemoteBranch --force
在我的情况下,要求是将所有功能分支提交压缩为一个,以拥有干净的提交历史记录。 利用 GitHub UI 来做到这一点。
问题:
要求:
后续步骤:
现在,featureBranchLatest 将在单个提交中包含所有所需更改的单个提交,以及来自 master 的最新更改。 如果不需要参考,请删除旧分支 featureBranch。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.