请考虑以下步骤:
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。
答案 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。