如何撤消功能分支中对主线的更改,但保持分支更新?

时间:2013-07-23 09:11:31

标签: git

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

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

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

3 个答案:

答案 0 :(得分:5)

我假设您不想进行任何重组和重置,这只是合并方法。

假设您有两个分支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上的合并提交,保持主人的基础(参数-m1)。为了实现它,我基于合并点创建了一个新的分支并在其中恢复:

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

现在,我们在分支feature-revert上进行了还原的更改。现在很简单就是通过合并把它变成主人:

$ git checkout master
$ git merge feature-revert

所以,目前master没有来自feature的任何内容。但是,如果以后要重新合并该功能,则所有还原的更改将在master中丢失,因为它们已合并并还原。

要解决此问题,您应还原还原(他 - 他)并将其合并回feature

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

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

$ git branch -d feature-revert

你应该知道,合并它会将master的所有变化带到feature,这通常是正常的工作流程。

现在,在feature中进行修复后,您可以随时将其重新合并到master

答案 1 :(得分:1)

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

虽然已删除,但其原始提交仍然存在。

所以,只是:

  • git revert您在master上的合并提交(记住选择正确的父级)。现在master没有从您的功能分支引入的破解代码
  • 修复功能分支
  • 恢复主人的第一个还原。这将在您最初合并时重新引入该功能的已损坏的状态
  • 合并功能分支修复

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

你的历史最终看起来像:

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

其中Mi是来自功能分支的原始合并,~Mi是您发现问题时的回复,fj .. fx是功能分支的后续修补程序~~Mi~Mi等的回归

答案 2 :(得分:0)

您是否尝试过在功能分支上执行git revert,然后将其合并到主服务器中?

这样基线保持不变,您可以继续使用功能分支。