【问题标题】:How do you undo changes committed to main line from a feature branch but keep the branch up to date?您如何撤消从功能分支提交到主线的更改但保持分支最新?
【发布时间】:2013-07-22 06:35:01
【问题描述】:

有时我们会遇到问题,我们将功能分支提交到我们的基线,并发现在某些情况下它可能会出错,因此需要恢复更改,而不会丢失此后所做的所有其他提交。但是,需要有人继续在原来的分支上工作。

我不想在主线上使用git rebase 来更改历史记录(因为这本身会导致各种问题),但是当我在主线上使用git revert 时,只要git merge 在分支上运行,以获取对系统所做的任何其他更改,然后所有完成的工作都消失了。

我可以做些什么来保持分支上的更改完好无损?

【问题讨论】:

  • 这是您要还原的合并提交吗?如果是这样,请查看stackoverflow.com/questions/1078146/…
  • 啊,我看到了问题,您正在将主线合并到您的分支中。我认为我上面提供的链接将为您解决问题。你只需要在你的分支上“revert the revert”。
  • 哦。好的,里面提到的一些东西看起来很有帮助

标签: git


【解决方案1】:

您是否尝试过在功能分支上执行 git revert,然后将其合并回 master?

这样基线保持不变,您可以继续在您的功能分支上工作。

【讨论】:

  • 如果我这样做了,我将如何保留更改?那不会删除更改吗?如果我立即恢复还原,后续合并会起作用还是会再次删除更改?
【解决方案2】:

我假设您不想进行任何变基和重置,这是仅合并的方法。

假设您有两个分支masterfeature。 因此,您决定将该功能合并到master

$ git merge feature

现在,您的所有feature 更改都在主服务器上。我假设最困难的情况 - 在两个分支上合并后都有提交。但是,突然你看到feature 没有任何效果,一切都被破坏并决定恢复它。你的历史是(你可以通过git log --graph feature master查看):

* commit 838f29fda2333bdbfc0d1be44d2387e6119dc4e8
| 
|     f3
|    
| * commit 58d1e3f0e032cc77d4ab2bbf0bdfe6407b96b7e6
| | 
| |     m3
| |     
| *   commit afb600fe382befe095f9b8a6e9eef98be25c929b
| |\  Merge: 5cddc52 8660a59
| |/  
|/|   
| |       Merge branch 'feature'
| |   
* | commit 8660a59eeb13f9b3447846ba6977140f7c86c7a4
| | 
| |     f2
| |   
* | commit 6f76e2288d69808b97981340198fd8044ab47630
| | 
| |     f1
| |   
| * commit 5cddc528de424a01d1d18552ddea93435618e2f7
| | 
| |     m2
| |   
| * commit fa6ebb76f9f0308f7dcd1148503534668fa15358
|/  
|   
|       m1
|  
* commit 4e3aa05d6f46eb14bbbc253a42325e9a53a3393e

注意合并后完成的提交 f3 和 m3。因此,您需要小心地删除仅从 feature 中出现的更改在 master 中。

要做到这一点,您可以恢复master 上的合并提交,保留master 的基础(参数-m1)。为了实现它,我基于合并点创建了一个新分支并在其中恢复:

$ git checkout -b feature-revert afb600fe
$ git revert -m1 HEAD

现在,我们对分支 feature-revert 进行了还原更改。现在很简单,只需将其合并到master中即可:

$ git checkout master
$ git merge feature-revert

所以,目前master 没有来自feature 的任何内容。但是,如果稍后您想重新合并该功能,所有恢复的更改都将丢失在 master 中,因为它们已被合并和恢复。

要解决该问题,您应该revert the revert(he-he)并将其合并回feature

$ git checkout feature-revert
$ git revert HEAD
$ git checkout feature
$ git merge feature-revert

我想我们不再需要分支了,因为我们已经合并了它,但如果你愿意,你可以保留它:

$ git branch -d feature-revert

您应该知道,将其合并回来会将所有更改从 master 带入 feature,这通常是正常的工作流程。

现在,在对feature 进行修复后,您可以随时像往常一样将其再次合并到master

【讨论】:

    【解决方案3】:

    当您git revert您的更改时,它会创建一个新的提交,其树没有这些更改。

    这些更改并未删除,但它们的原始提交仍然存在。

    所以,只是:

    • git revert 您在 master 上的合并提交(记得选择正确的父级)。现在 master 没有从你的特性分支引入的损坏代码
    • 修复功能分支
    • 恢复主服务器上的第一个恢复。这将重新引入您最初合并功能的 broken 状态
    • 合并功能分支修复

    有关详细信息,请参阅here(或本地 git 文档中的相同文件,如果已安装)。

    你的历史最终看起来像:

     --- a -- ... -- Mi ... ~Mi ... ~~Mi -- Mx  [master]
          \         /                      /
           f1 ... fi -- fj ........ x -- fx     [feature]
    

    其中Mi 是您从功能分支中的原始合并,~Mi 是您发现问题时的还原,fj .. fx 是功能分支的后续修复,~~Mi~Mi 的还原,等等

    【讨论】:

    • 但是一旦我 git 恢复了 master,我就无法将 master 合并回 feature 分支,我需要这样做。
    • 是的,您可以,只需先还原还原。这是上面项目符号列表中的第三点,在图表中表示为 ~~Mi(并在下面的段落中进行了描述),并显示在链接文档中 Linus 的引用下方。
    • 不能根据链接文档通过git rebase --no-ff a 重新创建分支,其中a 是分支点?
    • 是的,这也有效。除了错误修复之外,功能分支 (fj..fx) 上的新工作是否仍在进行中的问题尚不清楚,并且在人们处理分支时重新设置分支是邪恶的。
    猜你喜欢
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多