合并上游的git壁球

时间:2013-11-13 12:52:45

标签: git

我想知道如何压缩合并上游的一些提交。下面是尝试这样做,这导致新被压缩的分支变得独立,而原始提交未合并。

$ git checkout dev-track_rpm
Switched to branch 'dev-track_rpm'
$ git lg
**removed a bunch of log for brevity**
| * 6802588 - (2 months ago)
* | 267b937 - (1 month ago)
|/
*   45f7846 - (2 months ago) Merge branch 'dev-track_rpm'
|\
| * 7e07b43 - (2 months ago) (HEAD, dev-track_rpm)
| * 5cce85b - (2 months ago)
| * e36f2fb - (2 months ago)
| * 081175b - (2 months ago)
* | 4896e1f - (2 months ago)
|/
* 4767c9d - (2 months ago)


$ git rebase -i -p 4767c9d **also tried without -p initially**
*choose to squash 5cce85b and e36f2fb**
[detached HEAD c77cf3e]
 20 files changed, 4139 insertions(+), 0 deletions(-)
**removed file list for brevity**
Successfully rebased and updated refs/heads/dev-track_rpm.
$ git lg
* 260cdce - (2 months ago) (HEAD, dev-track_rpm)
* c77cf3e - (2 months ago)
**removed same bunch of log for brevity**
| | * 6802588 - (2 months ago)
| * | 267b937 - (1 month ago)
| |/
| *   45f7846 - (2 months ago) Merge branch 'dev-track_rpm'
| |\
| | * 7e07b43 - (2 months ago)
| | * 5cce85b - (2 months ago)
| | * e36f2fb - (2 months ago)
| | * 081175b - (2 months ago)
| |/
|/|
| * 4896e1f - (2 months ago)
|/
* 4767c9d - (2 months ago)
$

我想得到这个:

$ git lg
**removed a bunch of log for brevity**
| * 6802588 - (2 months ago)
* | 267b937 - (1 month ago)
|/
*   45f7846 - (2 months ago) Merge branch 'dev-track_rpm'
|\
| * <some new sha> - (2 months ago) same changes as 7e07b43 (HEAD, dev-track_rpm)
| * <some new sha> - (2 months ago) squashed 
* | 4896e1f - (2 months ago)
|/
* 4767c9d - (2 months ago)

1 个答案:

答案 0 :(得分:0)

当您执行rebase时,您更改树的哈希顺序,因此无论您做什么,它都将显示为不同的树,唯一的解决方案是强制推动新树替换旧树,尽管通常会有气馁,特别是当这是一个你有多个提交者的共享项目时。

修改: 以下是您想要做的简单解释:

假设当前树(假设这些字母是提交哈希值)

A -> B -> C -> D -> E

您希望压制BC以及D

所以你运行这个命令

git rebase -i B~

请注意B~也与A相同,您想要编辑上次提交的父级,我通常使用~格式。

你会得到你的编辑器这些行

pick B the b message
pick C the c messasge
pick D the d message
pick E the e message

你会将选秀权改为squahses

pick B the b message
squash C the c messasge
squash D the d message
pick E the e message

rebase将开始选择提交,然后它将再次停止并向您显示您正在压缩的两个提交的日志,并要求您选择一个或编辑两个并写入新消息,只需保存并保存树将继续被重新定位。

现在你将得到一棵看起来像这样的树

A -> BCD' -> E'

请注意,即使您只编辑了BCD次提交,E也已更改,因为它下面的树已更改,如果您绘制整个树,它看起来像这样

A -> BCD' -> E' <- HEAD and BRANCH will be here
 \-> B -> C -> D -> E ( this part will be detached )

然后,您将使用强制-f

将HEAD或BRANCH推送到原点
git push origin BRANCH -f