Git重置分支到远程/主保持日志

时间:2015-07-13 15:04:30

标签: git branch commit reset

我想我知道答案,但无论如何我都会问。

我主要使用分叉的fork。所以我有upstreamorigin后者是我的叉子。

然后我创建像origin/new-feature这样的分支(从现在开始 nf)。没有异国情调。 :)

所以在nf中进行了一段时间的实验,然后推了推 实验origin我已经做过的工作不会飞。

使用

重置我的本地和原点
$ git checkout upstream-master
$ git pull
$ git checkout nf
$ git reset --hard upstream/master
$ git push --force

现在的问题。有没有办法保持我的旧历史 在同一个分支中提交?

如果我想保留它们,我会创建一个新分支 在进行上述重置之前origin/nf-abandoned

1 个答案:

答案 0 :(得分:0)

是的,这是git rebase的用途。它将在签出分支(源)和命令行(目标)上给出的分支上运行,并将重放源的历史记录,直到它从目标转移到目标上作为新提交,但保留作者时间戳以及提交消息。

$ git checkout origin/new-feature
$ git fetch upstream
$ git rebase upstream/master
$ git push --force origin new-feature

结果:(C是您最初分支的提交)

A -- B -- C -- D -- E (original origin/new-feature)
           \-- F -- G (upstream/master)
                     \-- D` -- E` (rebased origin/new-feature)

请注意,您的提交D和E在upstream/master之上被重写为D`和E`,保持历史呈线性。

或者,如果项目接受这样的拉取请求,您可以将upstream/master合并到您的分支中并继续开发。这种方法的优点是可以记录确切的历史记录,包括合并操作,这意味着不需要--force将分支推回origin

$ git checkout origin/new-feature
$ git fetch upstream
$ git merge upstream/master
$ git push origin new-feature

结果:

                    v (original origin/new-feature)
A -- B -- C -- D -- E -- H <- (post-merge origin/new-feature)
           \-- F -- G --/
                    ^ upstream/master