我想恢复到先前提交的分支,并在该提交中进行所有更改,而不是从当前提交中获取任何更改。
我已经设置了我的测试目录,如下所示:
mkdir test_dir
cd test_dir
git init .
touch a_file
git add a_file
git commit -am "file added."
# say commit id 0_afile
echo "1 line" >> a_file
git commit -am "1 line"
# say commit id 1_afile
echo "2 line" >> a_file
git commit -am "2 line"
# say commit id 2_afile
echo "3 line" >> a_file
git commit -am "3 line"
# say commit id 3_afile
echo "4 line" >> a_file
git commit -am "4 line"
# say commit id 4_afile
当我运行git revert --no-edit -X theirs 2_afile
。我期待0_afile
,1_afile
和2_afile
的内容提交,但结果不包含2_afile
的内容。有人能指出我做错了什么。
这对我来说似乎有些自相矛盾:
我想恢复之前的分支提交...
(粗体是我的;注意这很容易;例如,参见Reset or revert a specific file to a specific revision using Git?,虽然它是针对某些特定文件或文件)
...获取该提交中的所有更改,而不是当前提交中的任何更改。
提交不是变更,提交是国家。
举一个简单的例子,假设我告诉你它在星期五外面是68˚F(20˚C)。那是一个州。如果我问你昨天的温度有什么变化,你能告诉我吗?你还需要先知道什么?
如果温度上升9˚F(5˚C),那就是变化。如果我告诉你它在星期一和周日的比例上升了很多,星期天的温度是多少?我还需要先告诉你什么?
在Git中,每个提交都是所有文件的完整快照,无论它们在您提交时的状态如何。要从提交中获取更改,有必要将该提交与其他提交进行比较。显而易见的“其他”提交是紧接在前的提交,即提交的父提交。如果提交只有一个父,Git可以自动执行此操作:它提取先前提交的文件(状态)和给定提交的文件(另一个状态),然后减去它们以生成一组更改。
如果你想要一个先前提交的文件的内容,这很容易;看到链接的问题,这是重复的。 git revert
所做的是完全不同的:它将提交 - 状态 - 转换为更改,然后尝试将相同的更改应用于当前状态。例如,请参阅我最近对Revert only a single file of a pushed commit的回答。