我们不时会遇到一些问题,我们将功能分支提交到基线并在某些情况下发现它可能会出现严重错误,因此需要恢复更改,而不会丢失此后所做的所有其他提交.但是,有人需要继续在原始分支上工作.
我不想git rebase在主线上使用来改变历史(因为这会导致各种各样的问题),但是当我git revert在主线上做,然后一旦git merge在分支上运行,就拿起来对系统进行的任何其他更改,然后完成的所有工作都会消失.
我该怎么做才能保持分支上的更改完好无损?
我假设你不想做任何rebase和重置,这是仅合并的方法.
假设你有两个分支master和feature.所以,您已决定将该功能合并到master:
$ git merge feature
Run Code Online (Sandbox Code Playgroud)
现在,您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
Run Code Online (Sandbox Code Playgroud)
注意合并后提交的提交f3和m3.因此,您需要仔细删除仅feature出现的更改master.
要做到这一点,你可以恢复合并提交master,保持master的基础(参数-m1).为了实现它,我创建了一个基于合并点的新分支并在其中恢复:
$ git checkout -b feature-revert afb600fe
$ git revert -m1 HEAD
Run Code Online (Sandbox Code Playgroud)
现在,我们在分支上有一个恢复的更改feature-revert.现在很简单就是通过合并把它变成主人:
$ git checkout master
$ git merge feature-revert
Run Code Online (Sandbox Code Playgroud)
所以,目前master没有任何东西feature.但是,如果稍后要重新合并该功能,则所有还原的更改将在master中丢失,因为它们已合并并还原.
要解决此问题,您应该还原恢复(他 - 他)并将其合并回feature:
$ git checkout feature-revert
$ git revert HEAD
$ git checkout feature
$ git merge feature-revert
Run Code Online (Sandbox Code Playgroud)
我想我们不再需要分支了,因为我们已经将它合并了,但如果你愿意,你可以保留它:
$ git branch -d feature-revert
Run Code Online (Sandbox Code Playgroud)
你应该知道,该合并回带来的所有变化master到feature这通常是正常的工作流程.
现在,在feature您修复之后,您可以随时将其重新合并到master常规中.