git 恢复合并策略的问题(他们的)

git revert issue with merge strategy (theirs)

我想恢复到分支的前一个提交,并在该提交中进行所有更改,而在当前提交中不进行任何更改。

我已将我的测试目录设置如下:

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_afile1_afile2_afile 提交的内容,但结果不包含 2_afile 的内容。谁能指出我做错了什么。

这对我来说似乎有些自相矛盾:

I want to revert to a previous commit of the branch ...

(粗体字是我的;请注意,这很简单;参见,例如,Reset or revert a specific file to a specific revision using Git? 虽然它是针对某个或多个特定文件)

... with taking all the changes in that commit and nothing from the current one.

提交不是 更改,提交是 状态

举个简单的例子,假设我告诉你,周五室外温度为 68˚F (20˚C)。那是一个状态。如果我问你昨天的温度有什么变化,你能告诉我吗?您还需要先了解什么?

如果温度上升 9˚F (5˚C),那就是 变化 。如果我告诉你它在周一和周日上升了那么多,那么周日 的温度是多少?我还需要先告诉你什么吗?


在 Git 中,每次提交都是 所有 文件的完整快照,无论它们在您提交时处于何种状态。要从提交中获得 changes,有必要 compare 该提交与其他提交。明显的 "other" 提交是紧接在前的提交,即提交的 parent。如果提交只有一个父项,Git 可以自动执行此操作:它提取前一个提交的文件(一种状态)和给定提交的文件(另一种状态),然后 减去它们 产生变化集。

如果您想要上一次提交的一个文件的内容,那很容易;查看链接的问题,这是重复的。 git revert 所做的是完全不同的:它将提交(一种状态)转变为更改,然后尝试将相同的更改应用到 current 状态。例如,请参阅我最近对 ​​ 的回答。