我创建了一个git存储库,从new_feature
分支了master
,开发了一项新功能,然后将分支合并回了master
。像这样:
^
|
* <-- current commit
|\
| \
* *
* |
| * <-- new_feature branch
| |
* *
| /
|/
*
*
*
|
* <-- release commit on master
|
事后看来,我希望我会在提交master
时从release
分支。这是因为master不太干净,并且并非所有测试都通过。所以我希望自己有
^
|
*
* <-- next commit on master after release commit
*
|
*
|\
| \
| *
| |
| * <-- new_feature branch
| |
| *
| /
|/
* <-- release commit on master
|
这可能吗?如果可以,怎么办?我是在new_feature
工作的唯一用户,并且以前从未承诺过master
,如果这样做有助于隔离提交。
答案 0 :(得分:1)
是的,有可能,但这是 DISTRUCTIVE 的历史记录更改,您需要谨慎操作。
首先让所需的提交一些伪SHA,以便能够在git命令中识别它们:
当前状态:
^
|
* F679B1B <-- current commit on master
|
* 11937F5 <-- merge commit
|\
| \
* | D2FD393
| |
| * <-- 45C9A66 new-feature branch
| |
* | 91C021C
| /
|/
* 15B6BDD
|
* A132263 <-- release commit on master
|
其想法是:
master
:git checkout master
git checkout -b second_master
master
上的发布提交进行硬重置:git reset --hard A132263
git checkout -b new-feature
git cherry-pick 45C9A66
seond-master
进行合并或发出合并请求:git checkout second-master
git merge new-feature
master
获取其他提交:git cherry-pick 15B6BDD
git cherry-pick 91C021C
git cherry-pick D2FD393
git cherry-pick F679B1B
second-master
的状态是否正常,然后将其重置为master
master
将丢失,并被second-master
取代):git checkout master
git reset --hard second-master
完成这些步骤后,您的git repo中应具有以下状态:
结果状态:
^
|
* 75C70DB <-- current commit on master
|
|
* BC63DDC
|
|
* 03042CF
|
|
* 019D5F6
|
* E3FAABE <-- merge commit
|\
| \
| |
| |
| * <-- 45C9A66 new-feature branch
| |
| |
| /
|/
* A132263 <-- release commit on master
|
希望这对您是否值得做一个印象,并指导您完成工作。
答案 1 :(得分:1)
我能想到的另外两个选择:
如果发布提交和分支的提交之间没有很多提交,您可以还原每个提交。
如果您不希望保留所做的单个提交,则可以将master进行软重置到分支的位置,存储这些更改,将其硬重置为release提交并应用存储。
两个向您展示了上述两个选项的示例,我在您的图中添加了虚构的提交ID:
^
|
* current-commit <-- current commit
|\
| \
* *
* |
| * <-- new_feature branch
| |
* *
| /
|/
* commit-branched-off-of
* intermediate-commit-1
* intermediate-commit-2
|
* release-commit <-- release commit on master
|
然后,选项1可能很简单(如果您没有任何冲突):
git revert release-commit..commit-branched-off-of
以上命令将还原release-commit
之后直至commit-branched-off-of
之前的所有提交。
如果确实有任何冲突,只需按照提示解决冲突即可。
选项2可以是:
git reset --soft commit-branched-off-of
git stash
git reset --hard release-commit
git stash apply
git commit -m "New commit message for your feature"