【问题标题】:Reverting a commit only a specific branch, while keeping the "merged data"仅还原特定分支的提交,同时保留“合并数据”
【发布时间】:2019-12-22 07:19:20
【问题描述】:

假设我有两个分支 Amaster。意外添加并完成了分支A 的功能(该功能也在处理处于工作状态/合并到主控但需要稍后继续的不同功能)。

现在我希望从A 中删除产生新功能的提交,同时保持当前 HEAD 中的主状态。理想情况下是这样的:

git checkout A
git revert HEAD~2..HEAD

但是这不会也恢复 master 分支的 HEAD 吗?

【问题讨论】:

  • 首先,不要问我们会发生什么。告诉我们你想要发生什么。我理解你的问题的方式是你有一个分支,A,你(不小心)添加了一些不相关的东西,然后你将 A 合并到 master。现在,你想从 A 中恢复/撤消/删除那个不相关的东西,但你想把它保留在 master 上。我没听错吗?
  • @LasseVågsætherKarlsen - 是的,但更重要的是,我希望了解“还原之类的东西”如何与分支一起使用。他们是在一个分支上工作还是他们也恢复其他分支。
  • 恢复只是添加另一个提交,该提交与您要恢复的提交相反。如果原始提交添加了一行,则还原提交将其删除,依此类推。还原会添加另一个提交,您需要自己将该提交合并到相关分支中。 Revert 无法将提交插入历史记录,也无法更改原始提交,因此它会影响您希望它影响的分支。

标签: git git-revert


【解决方案1】:

重写历史的解决方案:

git checkout A
git reset HEAD~2
git push origin A --force

重要的是,在git reset 命令之后,您对两个最新提交所做的所有更改都将在工作目录中可用。它使您有机会创建另一个分支并继续处理它或在需要时进行存储。

不重写历史的解决方案:

git checkout A
# automatically commits
git revert HEAD~2..HEAD
git push origin A

git checkout A

# doesn't commit automatically 
git revert --no-commit HEAD~2..HEAD

git commit -m 'Revert two last commits'
git push origin A

它将添加一个新的提交来反转两个最新提交的效果。

以上所有解决方案都不会改变master分支!

理论:

HEAD 是指向当前分支引用的指针,而当前分支引用又是指向该分支上最后一次提交的指针。

git checkout [<branch>] 的真正作用是什么?

  • 更改 HEAD 以指向新分支 ref
  • 使用该提交的快照填充您的 index(暂存区)
  • index 的内容复制到您的工作目录中

git reset [<commit>] 到底是做什么的?

  • 移动HEAD指向的分支(假设你当前在master分支上。运行git reset [<commit>]将使master指向[<commit>]
  • 用快照HEAD指向的内容更新index(暂存区)

【讨论】:

    【解决方案2】:

    HEAD 是指向当前活动分支的指针。

    运行git checkout A 后,作用于HEAD 将修改A 而不是master
    运行git checkout master 后,作用于HEAD 将修改master 而不是A


    额外说明:

    如果您的意图是“取消分支 A 的最后两次提交”,您可以运行:

    git checkout A
    git reset --hard HEAD~2
    
    # if branch A was pushed,
    # you will also need to push the corrected A :
    git push origin --force-with-lease A
    

    【讨论】:

    • 我确实推送了 A(和 master)——我可以在不重写历史的情况下进行还原吗?
    • 两个还原的提交之一是从master 合并提交到A 吗?
    • 如果你可以运行reset --hard,事情会更简单,它会重写历史。如果这违反了硬性要求,您可以运行revert 命令,但稍后再检查master 中的内容,当A 合并到master 时。
    猜你喜欢
    • 2015-04-17
    • 2019-07-14
    • 2018-04-26
    • 1970-01-01
    • 2012-06-04
    • 2014-01-22
    • 2020-06-17
    • 1970-01-01
    • 2011-12-19
    相关资源
    最近更新 更多