git - 如何两个提交合并为一个?

  显示原文与译文双语对照的内容

在滚就绪,我打算融合 2提交到 1,所以我跟着

我跑了


git rebase --interactive HEAD~2

在结果编辑器中,我将 pick 更改为 squash,然后是 save-quit,但基线转换失败,错误为

没有前一个提交不能'壁球'

现在我的工作树已经达到了这个状态,所以我无法恢复。 这命令 git rebase --interactive HEAD~2 失败

交互式rebase已经开始

git rebase --continue 失败

没有前一个提交不能'壁球'

时间:

回到你开始的地方

$ git rebase --abort

说你的历史是

$ git log --pretty=oneline
a931ac7c808e2471b22b5bd20f0cad046b1c5d0d c
b76d157d507e819d7511132bdb5a80dd421d854f b
df239176e1a2ffac927d8b496ea00d5488481db5 a

也就是说,a 是第一个提交,然后是,最后是c 。

正在运行 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.
#

pick 改为 squash 将导致你看到的错误,但如果将文本改为,则将它的挤压为

pick b76d157 b
s a931ac7 c

然后,你的编辑器将得到另一个编辑器,它的内容是

# This is a combination of 2 commits.
# The first commit's message is:
b
# This is the 2nd commit message:
c

保存和退出时,编辑后的文件的内容将成为新组合提交的提交消息:

$ git log --pretty=oneline
18fd73d3ce748f2a58d1b566c03dd9dafe0b6b4f b and c
df239176e1a2ffac927d8b496ea00d5488481db5 a

如果有多个提交,你可以使用 git rebase -i 将两个提交放入一个。

如果只剩下两个提交,可以使用以下命令将两个提交合并到一个:


git reset --soft"HEAD^"
git commit --amend

你可以取消rebase基线

 
git rebase --abort

 

当你再次运行交互式的rebase命令时,'挤压;提交必须在列表中的选择提交之下

之后推送到server,我经常使用 git reset --mixed 反转已经基本版本,然后多个提交你想合并,那我会做一个新的提交,通过这种方式可以让你的提交最新,保证当前版本为头前


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

如果我要合并头两个提交到一个,首先使用:


git reset --mixed 249cf9392da197573a17c8426c282

"249cf9392da197573a17c8426c282"是第三个版本,也是你合并之前的基本版本,此后,我进行了一个新的提交:


git add. 
git commit -m 'some commit message'

一切都是,希望是大家的另一种方式。

仅供参考,来自 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.

如果你的主分支 git log 看起来像下面这样:


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

你想要合并前两个提交只需简单步骤:

  1. 首先在单独的分支上检查第二个提交的安全。 你可以给分支命名。 git checkout 77df2a40e53136c7a2d58fd847372 -b merged-commits
  2. 现在,将你的更改从最后一个提交添加到这个新分支,如下所示: git cherry-pick -n -x ac72a4308ba70cc42aace47509a5e ( 如果出现冲突则解决冲突)
  3. 那么,你最后一次提交的更改在第二个提交中。 但是仍然必须与不提交,所以先添加你所做的更改只是cherry-picked然后执行 git commit --amend

就是这样。如果你喜欢的话,你可以在分支"merged-commits"中按这个合并的版本。

同时,你可以在你的主分支中放弃后端两个提交。 只需将你的主分支更新为:


git checkout master
git reset --hard origin/master (CAUTION: This command will remove any local changes to your master branch)
git pull

...