来自prev提交的Git分支并从master获取更改

时间:2015-01-20 23:06:41

标签: 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的分支。 这就是我的尝试。

  1. 在commit 2

    创建本地和远程分支

    git checkout branch mybranch hashtag-of-commit2

  2. 从origin / master(当前)拉出更改以添加B和D

    git checkout mybranch

    git fetch origin

    git merge origin / master

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

2 个答案:

答案 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,您不仅有一个选项:

1。只需显示C

的状态

git show显示特定修订版中文件的内容。所以

git show Commit2:C > /path/to/C  

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

git add /path/to/C && git commit -m "restoring C"

2。部分还原提交

我们知道C中的Commit3已经以我们不想要的方式发生了变化。要根据Commit3C中引入的更改创建补丁(即删除它),我们可以使用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"

3。重新删除删除

当您使用上一个选项时,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永不消失的新历史。