我们不时会遇到将功能分支提交到基线的问题,并且在某些情况下发现它可能会出现严重错误,因此需要还原更改,而不会丢失从那时起所做的所有其他提交。但是,有人需要继续在原始分支上工作。
我不想在主线上使用git rebase
来更改历史记录(因为这会导致各种各样的问题),但是当我在主线上git revert
时然后,只要git merge
在分支上运行,为了获取对系统所做的任何其他更改,那么所有已完成的工作都会消失。
我可以做些什么来保持分支上的更改完好无损?
答案 0 :(得分:5)
我假设您不想进行任何重组和重置,这只是合并方法。
假设您有两个分支master
和feature
。
因此,您已决定将该功能合并到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
,然后将其合并到主服务器中?
这样基线保持不变,您可以继续使用功能分支。