我假设您不想进行任何变基和重置,这是仅合并的方法。
假设您有两个分支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 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。