我想我知道答案,但无论如何我都会问。
我主要使用分叉的fork。所以我有upstream
和
origin
后者是我的叉子。
然后我创建像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
。
答案 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