有时我们会遇到问题,我们将功能分支提交到基线,并在某些情况下发现它可能会出错,因此需要恢复更改,而不会丢失此后所做的所有其他提交。但是,需要有人继续在原始分支上工作。
我不想git rebase
在主线上使用来更改历史记录(因为这本身会导致各种问题),但是当我git revert
在主线上这样做时,一旦git merge
在分支上运行,就可以拿起对系统进行的任何其他更改,则所做的所有工作都会消失。
我能做些什么来保持分支上的更改完好无损?
有时我们会遇到问题,我们将功能分支提交到基线,并在某些情况下发现它可能会出错,因此需要恢复更改,而不会丢失此后所做的所有其他提交。但是,需要有人继续在原始分支上工作。
我不想git rebase
在主线上使用来更改历史记录(因为这本身会导致各种问题),但是当我git revert
在主线上这样做时,一旦git merge
在分支上运行,就可以拿起对系统进行的任何其他更改,则所做的所有工作都会消失。
我能做些什么来保持分支上的更改完好无损?
我假设您不想做任何变基和重置,这是仅合并的方法。
假设您有两个分支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
,保留 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 (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
当git revert
您进行更改时,它会创建一个新的提交,其树没有这些更改。
虽然没有删除更改,但它们的原始提交仍然存在。
所以就:
git revert
您在 master 上的合并提交(请记住选择正确的父级)。现在 master 没有从您的功能分支中引入的损坏代码有关更多详细信息,请参见此处(或本地 git 文档中的相同文件,如果已安装)。
你的历史最终看起来像:
--- a -- ... -- Mi ... ~Mi ... ~~Mi -- Mx [master]
\ / /
f1 ... fi -- fj ........ x -- fx [feature]
Mi
您从功能分支的原始合并在哪里,~Mi
是您注意到问题时的恢复,是fj .. fx
功能分支的后续修复,~~Mi
是 的恢复~Mi
等等。
您是否尝试过git revert
在功能分支上执行然后将其合并回主分支?
这样,基线保持不变,您可以继续处理您的功能分支。