这给出了压缩多次提交的一个很好的解释:
http://git-scm.com/book/en/Git-Branching-Rebasing
但它对已经推送的提交不起作用。如何在我的本地和远程回购中压缩最近几次提交?
编辑:当我git rebase -i origin/master~4 master
时,将第一个保留为pick
,将其他三个设置为squash
,然后退出(通过cx cc在emacs中),我得到:
$ 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
提交。现在,git log
中没有出现4个提交。我希望我的编辑器能够重新启动,以便我可以输入提交消息。我做错了什么?
答案 0 :(得分:640)
Squash在本地提交
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
分支。)
答案 1 :(得分:92)
在分支上,我能够像这样(最近4次提交)
config.vm.provider "virtualbox" do |vb|
vb.name = "my-project (centos-67-x64)"
end
答案 2 :(得分:20)
只有创建一个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
我也有一些pull request notes可能会有帮助。
答案 3 :(得分:19)
接受答案的细微差别,但我在挤压时遇到了很多困难,最后得到了它。
cannot use the part (children of children.children.1.children) to traverse the element
db.collection_name.updateOne({
'name': 'test',
'children.name': 'child2',
'children.children.name': 'sub3' // locate sub3
}, {
'$set':{'children.children.$.children':[some other content]}
})
使用以下方式推送到遥控器:
$ git rebase -i HEAD~4
答案 4 :(得分:11)
git rebase -i master
你会得到编辑器vm open和msgs这样的东西
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
这会将所有提交修复为一次提交,并将删除所有其他提交。 我这样做了,它帮了我。
答案 5 :(得分:1)
使用Gitlab或Github时,您可能会遇到这种麻烦。您可以使用上述方法之一来压缩提交。我最喜欢的是:
git rebase -i HEAD~4
or
git rebase -i origin/master
选择壁球或修补程序进行提交。此时,您将使用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
+允许仅强制推送到一个分支。
答案 6 :(得分:0)
要压缩两个提交(其中一个已经被推送),可以在单个分支上进行以下工作:
git rebase -i HEAD~2
[ pick older-commit ]
[ squash newest-commit ]
git push --force
默认情况下,这将包括最新提交的提交消息,作为对旧提交的注释。
答案 7 :(得分:0)
1)git rebase -i HEAD〜4
To elaborate: It works on the current branch; the HEAD~4 means squashing the latest four commits; interactive mode (-i)
2)此时,编辑器打开并显示了提交列表,以更改第二个及以后的提交,将南瓜替换为pick然后保存。
输出:成功地重新建立了基准并更新了refs / heads / branch-name。
3)git push origin refs / heads / branch-name --force
输出: ... 远程: 远程:要为分支名称创建合并请求,请访问: 远程:http://xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D=sss 远程:到ip:sc / server.git + 84b4b60 ... 5045693分支名称->分支名称(强制更新)