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

时间:2018-12-01 00:20:36

标签: git git-merge git-revert

我想恢复到分支的上一个提交,并对该提交中的所有更改进行更改,而从当前提交中删除任何内容。

我的测试目录如下:

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的内容。有人可以指出我在做什么错。

1 个答案:

答案 0 :(得分:3)

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

  

我想还原分支的先前提交...

(粗体字是我的;请注意,这很简单;例如,Reset or revert a specific file to a specific revision using Git?是用于某些特定文件的文件)

  

...进行了该提交中的所有更改,而与当前提交无关。

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

举一个简单的例子,假设我在星期五告诉您,现在外面是68°F(20°C)。这是一个状态。如果我问你昨天的温度有什么变化,你能告诉我吗?您还需要首先了解什么?

如果温度升高9°F(5°C),则为变化。如果我告诉您,周一和周日的气温上升幅度很大,那么周日的温度是多少?我还需要先告诉你什么?


在Git中,每次提交都是所有文件的完整快照,无论提交时它们处于何种状态。为了从提交中获取更改,有必要将比较与其他提交进行比较。明显的“其他”提交是紧随其前的提交,即该提交的 parent 。如果一个提交只有一个父对象,则Git可以自动执行此操作:它会提取前一个提交的文件(一个状态)和给定提交的文件(另一个状态),然后减去它们以产生集合变化。

如果您想从上一次提交中获取一个文件的内容,那很容易;请参阅链接的问题,这是重复的问题。 git revert所做的工作非常不同:它将提交(一种状态)转换为更改,然后尝试将同一更改应用于 current 状态。例如,请参阅我最近对Revert only a single file of a pushed commit的回答。

相关问题