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的分支。
这就是我尝试过的
这样做,它会删除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,