Git从上一个提交中分支,并从主文件中提取更改

Git从上一个提交中分支,并从主文件中提取更改,git,merge,branch,Git,Merge,Branch,假设我已经做出了以下承诺。 所有提交都在同一个分支中。在Commit 3中,我删除了C,现在我需要将C添加回当前 Commit 1: A, Commit 2: A, C Commit 3: A, . . . Master (current) : A, B, D 现在,我想创建一个带有a、B、C和D的分支。 这就是我尝试过的 在提交2处创建本地和远程分支 git签出分支mybranch hashtag-of-commit2 从原始/主(当前)拉取更改以添加B和D git签出mybranch

假设我已经做出了以下承诺。
所有提交都在同一个分支中。在Commit 3中,我删除了C,现在我需要将C添加回当前

Commit 1: A,
Commit 2: A, C 
Commit 3: A, 
.
.
.
Master (current) : A, B, D
现在,我想创建一个带有a、B、C和D的分支。 这就是我尝试过的

  • 在提交2处创建本地和远程分支

    git签出分支mybranch hashtag-of-commit2

  • 从原始/主(当前)拉取更改以添加B和D

    git签出mybranch

    git获取源

    git合并源/主


  • 这样做,它会删除C并添加B和D。最终结果是A、B、D。我想要的是A、B、C和D。我该怎么做?

    在更传统的布局中,我认为问题的意思是,将字母改为数字,将数字改为字母

    日志(单分支)如下所示

    ---A---B---C---D--- .... ---- HEAD master
           +x  -x
    
    提交B添加
    x
    ,提交C还原该更改。OP希望将
    x
    添加回

    假设您在master上(即,已经有提交
    D
    master
    )引入的更改,初步看来
    git revert sha-1-of-C
    应该这样做,即您正在恢复恢复原始更改的提交


    我不明白这和远程分支有什么关系

    整个
    git revert
    也会将
    Commit3
    中引入的
    A
    的更改还原,所以这不是您想要的

    要将文件
    C
    还原为
    Commit2
    中的文件,您不仅有一个选项:

    1.只需显示
    C的状态
    显示特定版本中的文件内容。所以

    git show Commit2:C > /path/to/C  
    
    将打印文件
    C
    的内容,并将其存储在
    /path/to/C
    中。我们仍然需要将其再次添加到索引中:

    git add /path/to/C && git commit -m "restoring C"
    
    git add /path/to/C && git commit -m "restoring C"
    
    2.部分恢复提交 我们知道
    C
    Commit3
    中以我们不希望的方式进行了更改。要将
    Commit3
    中引入的更改创建为
    C
    (即删除),我们可以使用:

    现在,
    c-changes.diff
    保存引入的更改。现在,我们来恢复
    C

    git apply --reverse c-changes.patch  
    
    C
    已恢复,请将其重新添加到索引中:

    git add /path/to/C && git commit -m "restoring C"
    
    git add /path/to/C && git commit -m "restoring C"
    
    3.重新设置删除的基址 使用上一个选项时,
    Commit3
    仍然会删除
    C
    ,并且您还有一个额外的提交还原
    C
    。如果自
    Commit3
    以来您没有在任何地方推送,我们可以编辑
    Commit3
    ,使其不再删除
    C
    。首先,按照选项2中所述创建修补程序。然后,调用一个交互式:

    这将在
    $EDITOR
    中打开一个对话框。您将看到
    Commit3
    。选择编辑提交、保存文件并关闭文件。然后,重新定基将开始,并在应用
    Commit3
    后立即停止。现在,使用修补程序并按相反顺序应用:

    git apply --reverse c-changes.patch
    
    已应用修补程序,现在我们修改上次提交并从历史记录中删除
    C

    git add /path/to/C && git commit --amend -C HEAD && git rebase --continue  
    

    重定基址在这之后继续进行,一旦完成,您就有了一个新的历史,
    C
    从未消失。

    也许只是您的符号是非常规的,但您是否试图说提交1、2和3都包含更改?为什么创建一个包含4个变更的分支会涉及远程回购呢?请注意,您并没有“从主分支提取变更”。您可以从远程(例如,
    源站
    )提取更改。您可以从源代码中获取它们,并将它们合并到主代码中。清理术语将真正帮助我们帮助您。谢谢您的评论。我想做的是创建一个带有a、B、C和D更改的分支。我很感激这一点,但我不太确定您现在得到了什么。(例如)提交1、2和3是否在同一个分支中?还是不同的分支?你说的“变更”是指“变更集”吗?如果是这样,变更集C在提交2后如何消失?尝试创建一个类似于git rebase上的文档的图表。所有提交都在同一个分支(主分支)中。在提交3时,我删除了C。现在我需要重新添加C,