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

Posted

技术标签:

【中文标题】git revert 合并策略的问题(他们的)【英文标题】:git revert issue with merge strategy (theirs) 【发布时间】:2019-05-03 03:30:11 【问题描述】:

我想恢复到分支的先前提交,并获取该提交中的所有更改,而不是当前提交中的任何更改。

我的测试目录设置如下:

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】:

这在我看来有点自相矛盾:

我想恢复分支的先前提交...

(粗体字是我的;请注意,这很容易;例如,请参阅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 的回复。

【讨论】:

以上是关于git revert 合并策略的问题(他们的)的主要内容,如果未能解决你的问题,请参考以下文章

Git Revert 然后在修复后重新合并

如何执行 git revert 并删除合并历史记录?

(Git 合并)何时使用“我们的”策略、“我们的”选项和“他们的”选项?

如果合并或重新定位,则主删除分支文件中的 Git `revert`

git revert 后,合并显示没有更改并且已经更新

合并来自 git revert 的冲突 - 我应该接受当前的更改还是传入,为啥?