我想知道如何压缩合并上游的一些提交。下面是尝试这样做,这导致新被压缩的分支变得独立,而原始提交未合并。
$ 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)
答案 0 :(得分:0)
当您执行rebase时,您更改树的哈希顺序,因此无论您做什么,它都将显示为不同的树,唯一的解决方案是强制推动新树替换旧树,尽管通常会有气馁,特别是当这是一个你有多个提交者的共享项目时。
修改强>: 以下是您想要做的简单解释:
假设当前树(假设这些字母是提交哈希值)
A -> B -> C -> D -> E
您希望压制B
和C
以及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'
请注意,即使您只编辑了B
,C
和D
次提交,E
也已更改,因为它下面的树已更改,如果您绘制整个树,它看起来像这样
A -> BCD' -> E' <- HEAD and BRANCH will be here
\-> B -> C -> D -> E ( this part will be detached )
然后,您将使用强制-f
git push origin BRANCH -f