Git 如何撤消从要素分支提交到主线的更改,但使分支保持最新?
我们有时会遇到一些问题,在这些问题中,我们会将一个特性分支提交到基线,并发现在某些情况下它可能会出现严重错误,因此需要恢复更改,而不会丢失自那时以来完成的所有其他提交。但是,需要有人继续处理原始分支 我不想在主线上使用Git 如何撤消从要素分支提交到主线的更改,但使分支保持最新?,git,Git,我们有时会遇到一些问题,在这些问题中,我们会将一个特性分支提交到基线,并发现在某些情况下它可能会出现严重错误,因此需要恢复更改,而不会丢失自那时以来完成的所有其他提交。但是,需要有人继续处理原始分支 我不想在主线上使用git-rebase来更改历史记录(因为这本身会导致各种问题),但是当我在主线上执行git-revert时,只要分支上运行git-merge,以获取对系统所做的任何其他更改,那么所有完成的工作都会消失 如何保持分支上的更改完好无损?您是否尝试过在功能分支上执行git revert,
git-rebase
来更改历史记录(因为这本身会导致各种问题),但是当我在主线上执行git-revert
时,只要分支上运行git-merge
,以获取对系统所做的任何其他更改,那么所有完成的工作都会消失
如何保持分支上的更改完好无损?您是否尝试过在功能分支上执行
git revert
,然后将其合并回master
这样基线保持不变,您可以继续处理您的功能分支。我假设您不想进行任何回退和重置,这是仅合并的方法 假设您有两个分支
master
和feature
。
因此,您决定将该功能合并到主控
:
$ git merge feature
* 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
现在,您的功能
已全部更改到主机上。我假设最困难的情况是,在合并两个分支后都会进行提交。但是,您突然发现功能的任何功能都不起作用,所有功能都已损坏并决定恢复。您的历史记录是(您可以通过git log--graph feature master
查看):
请注意合并后提交的f3和m3。因此,您只需小心地删除出现在master
中的功能
中的更改
为此,您可以在主机上恢复合并提交,保持主机的基础(参数-m1
)。为了实现这一点,我基于合并点创建了一个新分支,并在其中恢复:
$ git checkout -b feature-revert afb600fe
$ git revert -m1 HEAD
现在,我们在分支功能revert
上恢复了更改。现在很简单,只需通过合并将其放入master即可:
$ git checkout master
$ git merge feature-revert
因此,目前主机
没有任何功能
。但是,如果以后要重新合并该功能,所有已还原的更改将在主控中丢失,因为它们已合并并还原
要解决此问题,您应还原还原(he he)并将其合并回功能
:
$ 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
的恢复,等等。如果这样做,我将如何保留更改?这难道不会消除这些变化吗?如果我立即恢复了恢复,后续的合并会起作用还是会再次删除更改?这是您要恢复的合并提交吗?如果是这样的话,看看啊,我看到问题了,你正在把主线并入你的分支。我想我上面提供的链接可以帮你。您只需在您的分支上“还原还原”。好的,这里提到的一些东西看起来很有用,但是一旦我还原了主版本,我就无法将主版本合并回功能分支,这是我需要做的。是的,你可以,只是先还原还原。这是上面项目符号列表中的第三点,在图中表示为~~Mi
(在下面的段落中进行了描述),并显示在链接文档中Linus的引用下方。难道不能根据链接文档,通过git rebase--no ff a
重新创建分支吗,其中a是分支点?是,这也行。问题是,除了bug修复之外,功能分支(fj..fx
)上是否仍在进行新的工作还不清楚,而在人们处理分支时重新设置分支的基址是一件坏事。