【问题标题】:How to revert a commit as a new commit in a branch如何将提交还原为分支中的新提交
【发布时间】:2020-05-08 13:50:50
【问题描述】:

基本上,我有一个提交 master 的场景,我想恢复到以前的状态以提交新的更改。 整个事情应该在一个分支中完成,所以我的想法是将带有不需要的提交的主分支分支到一个新的分支b,然后在我的分支b 中恢复不需要的提交unwantedC 并将其作为新的推送提交revertedUnwantedC。我的目标是我没有得到像“你的分支是 xy 提交在 master 之后”这样的状态,因为我的分支应该在那个时候。如果可能的话,我想在分支中推送我想要的更改newCommit,然后制作一个不会抱怨与主服务器合并问题的 PR,因为他认为主服务器领先。这样的事情可能吗?我必须使用哪些命令?

【问题讨论】:

    标签: git github


    【解决方案1】:

    是的,您所描述的应该很容易实现。考虑以下历史:

    A-B-C-D-E <- master
    

    现在,C 是您想要还原的错误提交(然后在该还原状态的基础上进一步构建):

    $ git checkout -b unwanted C
    

    您现在位于一个名为 unwanted 的新分支上,其中包含您的错误提交以及之前的所有内容(但不是之后的所有内容)。

    A-B-C-D-E <- master
        ^--      unwanted
    

    现在,恢复 C(将在您的分支上创建一个新的提交)并继续工作:

    $ git revert C
    # hack hack hack
    $ git commit
    # hack hack hack
    $ git commit
    

    给你(C' 是提交 C 的还原):

    A-B-C-D-E    <- master
         \
          C'-X-Y <- unwanted
    

    然后您可以推送并创建拉取请求/合并请求,或者简单地将 unwanted 合并回 master

    $ git checkout master
    $ git merge unwanted
    

    请注意,在合并之后,C 的任何更改都将不再存在于 master 中(它们已被还原并且合并也会合并这些 反向更改)。

    【讨论】:

    • 感谢您的回复,我尝试了您所写的内容,但是一旦我尝试还原不需要的c,我就会遇到提交是合并提交的问题,is a merge but no -m option was given. 你能解释一下我的意思吗?会做吗? Tbh 我不明白主线 (-m) 开关在做什么
    • 主线开关告诉 Git 保留合并的哪一侧以及丢弃哪一侧。当您提交“将分支 B 合并到 master”时,运行 git revert -m 1 将恢复 B 的更改并保留 master。传递-m 2 将恢复master 的更改并保留B。阅读 Git 文档中的How to revert a faulty merge 了解更多详细信息。
    【解决方案2】:

    您可以使用git revert 命令创建一个撤消先前提交的新提交。 This StackOverflow question 更详细地介绍了它的工作原理。

    当您将分支与新提交合并回master 时,您将拥有一个进行更改的提交和另一个撤消该更改的提交。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-12
      • 2020-09-20
      • 1970-01-01
      • 2014-01-03
      • 2018-04-22
      • 2014-06-02
      • 1970-01-01
      • 2019-05-31
      相关资源
      最近更新 更多