【问题标题】:Git reset branch to remote/master keeping logsGit 将分支重置为远程/主控保存日志
【发布时间】:2015-10-01 22:15:05
【问题描述】:

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

我主要在一个带有分支的叉子上工作。所以我有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 在进行上述重置之前。

【问题讨论】:

    标签: git branch commit reset


    【解决方案1】:

    是的,这就是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
    

    【讨论】:

    • 感谢@cdhowie,但我认为这不是我想要的(我可能是错的)。我一直在寻找一种方法来用上游重写我的提交,如果你愿意,可以丢弃,但仍然在历史中。在我的真实用例中,我只是想重置分支并删除提交;但是如果我想保留它发生的历史怎么办。
    • @davide 这两种方法都将保留它们的历史,只是方式不同。合并方法将记录发生了合并,而变基方法将重写提交以存在于 upstream/master 之上,而没有记录它们曾经存在于存储库历史中的不同位置。
    • 感谢您的耐心@cdhowie,但我不想将旧提交保留在上游 master 之上。我想要我的提交,完全由上游/大师重写。像reset --hard 这样的东西;但是在历史记录中跟踪它们,这样如果我执行git log -p,我仍然可以看到旧的提交。如前所述,我总是通过 reset --hard 来解决,如果我想保留旧提交,请创建补丁文件或压缩分支。
    • @davide 您希望保留旧的提交与git log 一样可见并且也不将它们包含在历史记录中,这完全是相互矛盾的——git log 显示历史记录,但您没有不希望他们出现在历史上。你不能两全其美。您可以将旧历史记录保留在视为存档分支的单独分支上,但是我不确定您的问题到底是什么。绘制 repo 的初始状态和您希望它处于的状态可能会有所帮助。如果你这样做,我可以帮助你到达那里。
    • 没关系。你刚刚证实了我的怀疑。分支/差异方法是唯一的方法。感谢您的耐心和支持。
    猜你喜欢
    • 1970-01-01
    • 2022-11-09
    • 2021-09-23
    • 2016-01-04
    • 1970-01-01
    • 2023-03-11
    • 2010-12-04
    相关资源
    最近更新 更多