将git分支修改为从上游提交分支

将git分支修改为从上游提交分支,git,Git,我分叉了一个git存储库,从master分支了new\u功能,开发了一个新功能,并将我的分支合并回master。像这样: ^ | * <-- current commit |\ | \ * * * | | * <-- new_feature branch | | * * | / |/ * * * | * <-- release commit on master | 这可能吗?如果可能,如何实现?我是唯一使用new\u功能的用户,我以前从未承诺过ma

我分叉了一个git存储库,从
master
分支了
new\u功能,开发了一个新功能,并将我的分支合并回
master
。像这样:

^
|
*     <-- current commit
|\
| \
*  *
*  |
|  *  <-- new_feature branch
|  |
*  *
| /
|/
*
*
*
|
*     <-- release commit on master
|

这可能吗?如果可能,如何实现?我是唯一使用
new\u功能的用户,我以前从未承诺过
master
,如果这有助于隔离提交的话。

是的,这是可能的,但这是一种破坏性的历史更改,您需要小心处理

让我们首先给出一些虚拟SHA,以便能够在git命令中识别它们:

当前状态:

  • 主机上对释放提交进行硬重置:
git重置——硬A132263
  • 分支新功能分支:
git签出-b新功能
  • 将提交从旧功能分支移动到新功能分支,依次进行:
git cherry pick 45C9A66
  • 在发布提交时合并或向第二主控主机发出合并请求:
git签出第二台主机
git合并新特性
  • 从原始的
    主机
    获取其他提交:
git cherry pick 15B6BDD
吉特樱桃皮克91C021C
吉特樱桃精选D2FD393
吉特樱桃皮卡F679B1B
  • 检查
    第二主控
    的状态是否正常,然后将原始
    主控
    硬复位到它
    仔细的破坏命令:在此之后,原始的
    主文件
    将丢失并替换为
    第二主文件
    ):
git签出主机
git重置--硬第二主控
完成这些步骤后,您的git回购中应具有以下状态:

结果状态:

^
|

*75C70DB是的,这是可能的,但这是一个破坏性的历史变化,你需要小心处理

让我们首先给出一些虚拟SHA,以便能够在git命令中识别它们:

当前状态:

  • 主机上对释放提交进行硬重置:
git重置——硬A132263
  • 分支新功能分支:
git签出-b新功能
  • 将提交从旧功能分支移动到新功能分支,依次进行:
git cherry pick 45C9A66
  • 在发布提交时合并或向第二主控主机发出合并请求:
git签出第二台主机
git合并新特性
  • 从原始的
    主机
    获取其他提交:
git cherry pick 15B6BDD
吉特樱桃皮克91C021C
吉特樱桃精选D2FD393
吉特樱桃皮卡F679B1B
  • 检查
    第二主控
    的状态是否正常,然后将原始
    主控
    硬复位到它
    仔细的破坏命令:在此之后,原始的
    主文件
    将丢失并替换为
    第二主文件
    ):
git签出主机
git重置--硬第二主控
完成这些步骤后,您的git回购中应具有以下状态:

结果状态:

^
|

*75C70DB我能想到的另外两个选项:

  • 如果在发布提交和分支的提交之间没有太多提交,则可以恢复每个提交

  • 如果您不关心保留您所做的单个提交,您可以将master软重置到从它分支出来的位置,隐藏这些更改,硬重置到发布提交并应用隐藏

  • 两个示例显示了上述两个选项的一个示例,我已将虚构的提交ID添加到您的关系图中:

    ^
    |
    * current-commit    <-- current commit
    |\
    | \
    *  *
    *  |
    |  *  <-- new_feature branch
    |  |
    *  *
    | /
    |/
    * commit-branched-off-of
    * intermediate-commit-1
    * intermediate-commit-2
    |
    * release-commit    <-- release commit on master
    |
    
    上述命令将在
    释放提交
    之后恢复所有提交,直到并包括从
    分支出来的
    提交

    如果您确实遇到任何冲突,只需按照提示修复冲突即可

    备选办法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"
    

    我可以想到另外两个选择:

  • 如果在发布提交和分支的提交之间没有太多提交,则可以恢复每个提交

  • 如果您不关心保留您所做的单个提交,您可以将master软重置到从它分支出来的位置,隐藏这些更改,硬重置到发布提交并应用隐藏

  • 两个示例显示了上述两个选项的一个示例,我已将虚构的提交ID添加到您的关系图中:

    ^
    |
    * current-commit    <-- current commit
    |\
    | \
    *  *
    *  |
    |  *  <-- new_feature branch
    |  |
    *  *
    | /
    |/
    * commit-branched-off-of
    * intermediate-commit-1
    * intermediate-commit-2
    |
    * release-commit    <-- release commit on master
    |
    
    上述命令将在
    释放提交
    之后恢复所有提交,直到并包括从
    分支出来的
    提交

    如果您确实遇到任何冲突,只需按照提示修复冲突即可

    备选办法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"
    
    git revert release-commit..commit-branched-off-of
    
    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"