我试图将2个提交合并为1,所以我从git准备好跟随"压缩提交与rebase".
我跑了
git rebase --interactive HEAD~2
Run Code Online (Sandbox Code Playgroud)
在生成的编辑器中,我更改pick
为squash
然后保存退出,但是rebase因错误而失败
没有先前的提交,不能'挤压'
既然我的工作树已达到这种状态,我就无法恢复了.命令git rebase --interactive HEAD~2
失败
交互式rebase已经开始
并git rebase --continue
失败了
没有先前的提交,不能'挤压'
Gre*_*con 1685
错误消息
没有先前的提交,不能'挤压'
意味着你可能试图"向下压缩." Git总是把一个较新的提交压缩到一个较旧的提交或者在交互式rebase待办事项列表中查看的"向上",即在前一行的提交中.更改todo列表的第一行上的命令squash
将始终产生此错误,因为第一次提交压缩没有任何内容.
首先回到你开始的地方
$ git rebase --abort
Run Code Online (Sandbox Code Playgroud)
说你的历史是
$ git log --pretty=oneline
a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
b76d157d507e819d7511132bdb5a80dd421d854f b
df239176e1a2ffac927d8b496ea00d5488481db5 a
Run Code Online (Sandbox Code Playgroud)
也就是说,a是第一次提交,然后是b,最后是c.在提交c之后,我们决定将b和c压缩在一起:
(注意:在大多数平台上默认情况下,将git log
其输出管道输出到寻呼机less
.要退出寻呼机并返回到命令提示符,请q
按键.)
Running git rebase --interactive HEAD~2
给你一个编辑器
pick b76d157 b
pick a931ac7 c
# Rebase df23917..a931ac7 onto df23917
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
Run Code Online (Sandbox Code Playgroud)
(请注意,与输出相比,此待办事项列表的顺序相反git log
.)
将b更改pick
为squash
将导致您看到的错误,但是如果您改变todo列表,则将c压缩为b(较新的提交到较旧的或"向上挤压")
pick b76d157 b
squash a931ac7 c
Run Code Online (Sandbox Code Playgroud)
并保存退出您的编辑器,您将获得其内容的另一个编辑器
# This is a combination of 2 commits.
# The first commit's message is:
b
# This is the 2nd commit message:
c
Run Code Online (Sandbox Code Playgroud)
保存并退出时,已编辑文件的内容将成为新组合提交的提交消息:
$ git log --pretty=oneline
18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
df239176e1a2ffac927d8b496ea00d5488481db5 a
Run Code Online (Sandbox Code Playgroud)
交互式rebase重写历史记录.尝试推送到包含旧历史记录的遥控器将失败,因为它不是快进的.
如果您重新分支的分支是您自己工作的主题或功能分支,那么没什么大不了的.推送到另一个存储库将需要该--force
选项,或者您可以根据远程存储库的权限,首先删除旧分支,然后推送已更新的版本.可能会破坏工作的那些命令的示例超出了本答案的范围.
重写的一个分支在你与其他人一起工作,而不已经发布的历史非常充分的理由,如泄露密码或其他敏感信息的工作力量到你的合作者,是反社会的,并会惹恼其他开发商.文档中的"从上游Rebase中恢复"部分进行了git rebase
解释,并进一步强调了这一点.
重新定位(或任何其他形式的重写)其他人基于其工作的分支是一个坏主意:它下游的任何人都被迫手动修复其历史记录.本节介绍如何从下游的角度进行修复.然而,真正的解决方法是首先避免重新定位上游....
小智 395
如果有多个提交,您可以使用git rebase -i
将两个提交压缩为一个.
如果您只想合并两个提交,并且它们是"最近的两个",则可以使用以下命令将两个提交合并为一个:
git reset --soft "HEAD^"
git commit --amend
Run Code Online (Sandbox Code Playgroud)
pam*_*bda 101
对于最常见的情况,更简单的方法.
实际上,如果你想要的只是将几个最近的提交合并为一个 但不需要drop
,reword
以及其他的rebase工作.
git reset --soft "HEAD~n"
Run Code Online (Sandbox Code Playgroud)
~n
是提交的数字轻声未提交(即~1
,~2
...)然后,使用以下命令修改提交消息.
git commit --amend
Run Code Online (Sandbox Code Playgroud)
这与长距离squash
和长距离非常相似pick
.
并且它适用于n次提交但不仅仅是两次提交,如上面的答案提示.
Hai*_*mei 52
首先,您应该检查您拥有的提交数量:
git log
Run Code Online (Sandbox Code Playgroud)
有两种状态:
一个是只有两个提交:
例如:
commit A
commit B
Run Code Online (Sandbox Code Playgroud)
(在这种情况下,您不能使用git rebase)您需要执行以下操作.
$ git reset --soft HEAD^1
$ git commit --amend
Run Code Online (Sandbox Code Playgroud)
另一个是有两个以上的提交; 你想合并提交C和D.
例如:
commit A
commit B
commit C
commit D
Run Code Online (Sandbox Code Playgroud)
(在这种情况下,你可以使用git rebase)
git rebase -i B
Run Code Online (Sandbox Code Playgroud)
而不是用"壁球"来做.剩下的很容易.如果您还不知道,请阅读http://zerodie.github.io/blog/2012/01/19/git-rebase-i/
Hom*_*man 28
假设你在自己的主题分支.如果要将最后两个提交合并为一个并且看起来像英雄,请在最后两次提交之前分支提交.
git checkout -b temp_branch HEAD^2
Run Code Online (Sandbox Code Playgroud)
然后squash在这个新分支中提交另一个分支:
git merge branch_with_two_commits --squash
Run Code Online (Sandbox Code Playgroud)
这将带来变化,但不会提交它们.所以只需提交它们就可以了.
git commit -m "my message"
Run Code Online (Sandbox Code Playgroud)
现在,您可以将此新主题分支合并回主分支.
Leo*_*rke 22
你可以用.取消rebase
git rebase --abort
Run Code Online (Sandbox Code Playgroud)
当你再次运行交互式rebase命令时,'squash; commit必须低于列表中的pick commit
Vin*_*ing 16
我经常使用git reset --mixed在你想要合并的多次提交之前恢复基本版本,然后我进行新的提交,这样可以让你的提交最新,确保你的版本在推送到服务器之后是HEAD.
commit ac72a4308ba70cc42aace47509a5e
Author: <me@me.com>
Date: Tue Jun 11 10:23:07 2013 +0500
Added algorithms for Cosine-similarity
commit 77df2a40e53136c7a2d58fd847372
Author: <me@me.com>
Date: Tue Jun 11 13:02:14 2013 -0700
Set stage for similar objects
commit 249cf9392da197573a17c8426c282
Author: Ralph <ralph@me.com>
Date: Thu Jun 13 16:44:12 2013 -0700
Fixed a bug in space world automation
Run Code Online (Sandbox Code Playgroud)
如果我想将两个提交合并为一个,首先我使用:
git reset --mixed 249cf9392da197573a17c8426c282
Run Code Online (Sandbox Code Playgroud)
"249cf9392da197573a17c8426c282"是第三个版本,在你合并之前也是你的基础版本,之后,我做了一个新的提交:
git add .
git commit -m 'some commit message'
Run Code Online (Sandbox Code Playgroud)
总而言之,希望是每个人的另一种方式.
仅供参考,来自git reset --help
:
--mixed
Resets the index but not the working tree (i.e., the changed files are
preserved but not marked for commit) and reports what has not been
updated. This is the default action.
Run Code Online (Sandbox Code Playgroud)
Gna*_*r S 12
$ git rebase --abort
如果要撤消git rebase,请随时运行此代码
$ git rebase -i HEAD~2
重新申请最后两次提交.上面的命令将打开代码编辑器
之后:wq你将处于活跃的rebase模式
注意:如果没有警告/错误消息,您将获得另一个编辑器.如果出现错误或警告其他编辑器将不显示,$ git rebase --abort
如果您看到错误或警告,您可以通过runnning中止,
否则只需继续运行$ git rebase --continue
您将看到2提交消息.选择一个或编写自己的提交消息,保存并退出[:wq]
注意2:如果运行rebase命令,则可能需要强制将更改推送到远程仓库
$ git push -f
$ git push -f origin master
如果您想将多个提交压缩在一起,则可以使用交互式变基方法来实现。(感谢 Mads 教我这一点!)
git rebase origin/develop -i
处于 git rebase 交互模式 (vim) 时的专业提示:
ciw
- (更改内部单词)将更改光标下的整个单词。s
挤压wq
写得相当,你就完成了。然后git push -f