16

我有 master/head 的分支 foo 。我想修改 master/head 并在分支 foo 上获取这些更改。我做了以下事情:

git checkout master
git add ...
git commit --amend
git checkout foo
git rebase master

问题是旧的未修改提交在修改后显示为分支 foo 的一部分,并且它被重新定位到 master 上。我做了一个 git rebase -i 并删除了旧的提交并且有效,但是有没有更简单/更安全的方法来修改作为分支基础的提交?是的,所有未推送的本地提交..

4

1 回答 1

26

你需要做的就是告诉 git 从哪里开始变基:你可以这样做

git rebase --onto master SOMESHA foo

其中 SOMESHA 是旧主 SHA。那就是如果你的树现在看起来像这样

* aaaaaa - (master)
| * bbbbbb - (foo)
| * cccccc - (old master)
|/  
* ffffff

你也是

git rebase --onto master cccccc foo

然后,您的树将如下所示。

* dddddd - (foo)
|
* aaaaaa - (master)
|
* ffffff

旁白:cccccc如果您不喜欢使用 SHA 值,我们可以为提交使用不同的名称。

> git reflog master

aaaaaa master@{0}: reset: moving to something
cccccc master@{1}: commit: change the froozle
ffffff master@{2}: commit: snarf the froozle 

这意味着我们可以引用ccccccmaster@{1}(AKA,master 的先前位置)

所以我们可以把这个变基写成

git rebase --onto master master@{1} foo

提交的另一个描述ccccccfoo^(AKA,foo 的父提交),所以我们也可以把它写成

git rebase --onto master foo^ foo

他们都做同样的事情,你可能更喜欢在不同的情况下使用不同的。我通常发现 SHA 使用起来很简单,因为我经常会在执行此类操作之前拉出我的存储库的图表。

于 2012-08-08T03:57:42.163 回答