修改git分支以从上游提交分支

时间:2019-06-26 09:41:08

标签: git

我创建了一个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,如果这样做有助于隔离提交。

2 个答案:

答案 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)

我能想到的另外两个选择:

  1. 如果发布提交和分支的提交之间没有很多提交,您可以还原每个提交。

  2. 如果您不希望保留所做的单个提交,则可以将master进行软重置到分支的位置,存储这些更改,将其硬重置为release提交并应用存储。

  3. p>

两个向您展示了上述两个选项的示例,我在您的图中添加了虚构的提交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"