这给出了压缩多个提交的一个很好的解释:
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
Run Code Online (Sandbox Code Playgroud)
其中2f40是pick
提交.现在,4个提交中没有一个出现git log
.我希望我的编辑器能够重新启动,以便我可以输入提交消息.我究竟做错了什么?
Ala*_*avi 709
壁球在当地提交
git rebase -i origin/master~4 master
Run Code Online (Sandbox Code Playgroud)
然后用力推动
git push origin +master
Run Code Online (Sandbox Code Playgroud)
--force
和之间的区别+
来自以下文件git push
:
请注意,
--force
适用于所有被推送的引用,因此使用它push.default
设置为matching
或配置了多个推送目标remote.*.push
可能会覆盖当前分支以外的引用(包括严格落后于其远程对应的本地引用).要强制推送到一个分支,请使用+
refspec前面的推进(例如git push origin +master
,强制推动master
分支).
jak*_*b-r 104
在一个分支上,我能够这样做(最近4次提交)
git checkout my_branch
git reset --soft HEAD~4
git commit
git push --force origin my_branch
Run Code Online (Sandbox Code Playgroud)
BLR*_*Boy 31
接受答案的细微差别,但我在挤压时遇到了很多困难,最后得到了它.
$ git rebase -i HEAD~4
Run Code Online (Sandbox Code Playgroud)
esc --> :wq
使用以下方式推送到遥控器
$ git push origin branch-name --force
Run Code Online (Sandbox Code Playgroud)
Stu*_*all 21
只需创建一个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
Run Code Online (Sandbox Code Playgroud)
我也有一些拉请求说明可能会有所帮助.
小智 13
Sqush 远程更改
git reset --soft master
git add .
git commit -m "this is the final commit message"
git push RemoteBranch --force
小智 12
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
Run Code Online (Sandbox Code Playgroud)
在这里,我已将所有其他提交的选择更改为"f"(代表修正).
git push -f origin feature/feature-branch-name-xyz
这将修复所有提交到一个提交,并将删除所有其他提交.我做到了这一点,它帮助了我.
为了在单个分支上压缩两个提交(其中一个已经被推送),可以使用以下方法:
git rebase -i HEAD~2
[ pick older-commit ]
[ squash newest-commit ]
git push --force
Run Code Online (Sandbox Code Playgroud)
默认情况下,这将包括最新提交的提交消息作为旧提交的注释。
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)
Run Code Online (Sandbox Code Playgroud)
当您使用 Gitlab 或 Github 时,您可能会以这种方式遇到麻烦。您可以使用上述方法之一压缩您的提交。我最喜欢的是:
git rebase -i HEAD~4
or
git rebase -i origin/master
Run Code Online (Sandbox Code Playgroud)
为您的提交选择壁球或修复。此时,您将检查 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)
Run Code Online (Sandbox Code Playgroud)
你可能会想拉它。不要这样做,否则您将处于与以前相同的情况。
而是通过以下方式推送到您的原点:
git push origin +ABC-1916-remote:ABC-1916
Run Code Online (Sandbox Code Playgroud)
+ 允许只强制推送到一个分支。