我们说我做了以下提交。 所有提交都在同一个分支中。在Commit 3中,我删除了C,现在我需要将C添加回当前的
Commit 1: A,
Commit 2: A, C
Commit 3: A,
.
.
.
Master (current) : A, B, D
现在,我想创建一个包含A,B,C和D的分支。 这就是我的尝试。
在commit 2
创建本地和远程分支git checkout branch mybranch hashtag-of-commit2
从origin / master(当前)拉出更改以添加B和D
git checkout mybranch
git fetch origin
git merge origin / master
这样做,它会删除C并添加B和D.最后的结果是A,B,D。我想要的是A,B,C和D.我该怎么做?
答案 0 :(得分:0)
我认为这个问题意味着,在更传统的布局中,更改字母的数字和数字。
日志(单个分支)看起来像这样
---A---B---C---D--- .... ---- HEAD master
+x -x
提交B添加x
并提交更改的C恢复。 OP希望重新添加x
。
假设你在使用master(即已经提交了由D
... master
引入的更改),表面上的git revert sha-1-of-C
应该这样做,即你正在恢复已恢复的提交最初的改变。
我不知道这与远程分支有什么关系。
答案 1 :(得分:0)
整个git revert
还会将更改恢复为A
中引入的Commit3
,这样就不是您想要的了。
要恢复C
中存在的文件Commit2
,您不仅有一个选项:
C
git show
显示特定修订版中文件的内容。所以
git show Commit2:C > /path/to/C
将打印文件C
的内容,并将其存储在/path/to/C
中。我们仍然需要将它再次添加到索引中:
git add /path/to/C && git commit -m "restoring C"
我们知道C
中的Commit3
已经以我们不想要的方式发生了变化。要根据Commit3
到C
中引入的更改创建补丁(即删除它),我们可以使用git diff
:
git diff Commit3~..Commit3 -- /original/path/to/C > c-changes.patch
现在,c-changes.diff
保留所引入的更改。现在,我们apply this patch in reverse order并恢复C
:
git apply --reverse c-changes.patch
C
已恢复,请将其重新添加到索引中:
git add /path/to/C && git commit -m "restoring C"
当您使用上一个选项时,Commit3
仍会删除C
,并且您还有一个额外的提交恢复C
。如果您从Commit3
开始没有推送到任何地方,我们可以修改Commit3
,以便它不再删除C
。首先,按照选项2中的描述创建补丁。然后,调用交互式git rebase
:
git rebase -i Commit2
这会在$EDITOR
中显示一个对话框。您会看到Commit3
。选择e
dit提交,保存文件并关闭文件。然后,重新定位将开始,并且会在Commit3
应用后立即停止。现在拿你的补丁并以相反的顺序应用它:
git apply --reverse c-changes.patch
修补程序已应用,现在我们修改了最后一次提交并从历史记录中删除了C
:
git add /path/to/C && git commit --amend -C HEAD && git rebase --continue
此后重新定位仍在继续,一旦完成,您就有了C
永不消失的新历史。