关于git revert和rebase的澄清

时间:2016-09-11 00:37:26

标签: git

请考虑以下步骤:

git init
touch foo.txt
git add .
git commit -m 'initial commit'

现在,我们将创建一个新分支并添加一个名为foo2.txt的文件:

git checkout -b new_branch
touch foo2.txt
git add .
git commit -m 'added foo2.txt'

现在我们将返回主分支,并恢复初始提交'我们做了(注意:你可以找到'初始提交'使用git log命令的提交哈希)。

git checkout master
git revert <commit hash of initial commit> 

此时,我们在master分支中既没有foo.txt也没有foo2.txt。现在,让我们将new_branch合并为主

git merge new_branch

此时,foo2.txt现已合并为master,但foo.txt不存在。

所以问题是,如何让foo.txt重新掌握?我试过这样做:

git rebase new_branch

但这并没有带回来。所以一般来说,如果我们在master上恢复提交,那么我们需要将另一个分支合并回master,我们将如何强制它将任何“缺失”转移到master。文件(本例中为foo.txt)?

我找到的唯一一个相当激烈的解决方法是删除master并将new_branch重命名为master。

2 个答案:

答案 0 :(得分:1)

您可以使用带有初始提交哈希的foo.txt来恢复git cherry-pick

git revert添加一个提交,删除初始提交添加的行,当您在master上重新定义new_branch时,在此恢复之后应用此分支中所做的所有更改。

答案 1 :(得分:1)

进行新的提交以恢复foo.txt。您可以git revert <revert commit>git cherry-pick <init commit>或手动添加foo.txt并提交。

或从历史记录中删除<revert commit>。通过master<add foo2 commit>重置为git reset <add foo2 commit> --hard。它也可以通过git rebase --onto <init commit> <init commit> <add foo2 commit>制作,但它会以detached HEAD state结尾,因此您需要将master重置为此新HEAD。