Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
git使用合并操作将远程还原为特定提交';t与-m一起工作_Git_Github_Git Revert - Fatal编程技术网

git使用合并操作将远程还原为特定提交';t与-m一起工作

git使用合并操作将远程还原为特定提交';t与-m一起工作,git,github,git-revert,Git,Github,Git Revert,我正在尝试将远程回购恢复到以前的提交。该树如下图所示: 我们的想法是,我们希望返回到该提交,而不需要从主分支提取的任何人必须处理重置回提交所产生的问题2dda031。因此,我使用的是git revert 我试图通过使用git revert--no commit 2dda031..HEAD来实现这一点 但是,我得到了这个错误: error: commit d064f7c3b04a2bda30c43a32afac822c6af633c0 is a merge but no -m option w

我正在尝试将远程回购恢复到以前的提交。该树如下图所示:

我们的想法是,我们希望返回到该提交,而不需要从主分支提取的任何人必须处理重置回提交所产生的问题
2dda031
。因此,我使用的是
git revert

我试图通过使用git revert--no commit 2dda031..HEAD来实现这一点

但是,我得到了这个错误:

error: commit d064f7c3b04a2bda30c43a32afac822c6af633c0 is a merge but no -m  option was given. 
fatal: revert failed
这是预期的,因为
d064f7c
是合并(因此
47d4161
)。因此,我建议:

然后我得到错误消息:

error: mainline was specified but commit cb420e0 is not a merge.
fatal: revert failed
所以我只是觉得我在循环。有人能告诉我恢复该提交(同时恢复历史记录)的正确方法吗?

编辑(下面的原始答案):让我从将图形转换为文本开始,(我希望)没有打字错误或其他严重错误。这就是您现在拥有的,因为
git log--graph--oneline
可能会显示它(尽管
--graph--oneline
可能会选择稍有不同的提交顺序图形查看器生成的蓝线和绿线可能会按提交日期排序,而不考虑拓扑,而不是先按拓扑排序):

(我们看不到低于这一点的任何东西,尽管显然还有更多的犯罪行为)

我想,您想要返回的提交状态是,
2dda031修复了文件的继承权

现在,最棘手的部分是,这个状态“存在于”显然是一个分支的分支上,在“合并请求”5 from“commit下。如果在还原过程中的某个时刻,您要运行git revert-m 47d4161
,您将告诉git对其第一个父级
1ff3079
,或对其第二个父级
d999b3d
进行区分。第一个差异显示了自合并基提交以来每次提交的效果,不管提交是什么:我们无法从图的这个片段中看到它;我们需要更多的图表来找到它,因为它位于“屏幕”的底部,在这里指向这两个元素中的一个,而另一个diff显示自合并基到另一个之后每次提交的效果。因此,使用
-m1
还原基本上消除了以下影响:

* e999b3d  (origin/Trying...) Adjusted ray cast length to be more realistic.
* 953e4c3  Fully functional dialogue system implemented.
* 09e350b  Added in most of the Yarn framework
* 2dda031  fixed heirarchy of files
* bf667cc  Merge branch 'develop' of ...
...
* 1f33079  updated wiki to reflect marking of prototype
...
使用
-m2
基本上消除了以下影响:

* e999b3d  (origin/Trying...) Adjusted ray cast length to be more realistic.
* 953e4c3  Fully functional dialogue system implemented.
* 09e350b  Added in most of the Yarn framework
* 2dda031  fixed heirarchy of files
* bf667cc  Merge branch 'develop' of ...
...
* 1f33079  updated wiki to reflect marking of prototype
...
(在这两种情况下,可能还有更多我们在这里看不到的承诺)。我很清楚你不想那样做,但我不确定

但是,请注意,如果您只是提取commit
2dda031
的内容,您仍然会失去
1f33079
的效果以及它下面的任何其他提交的效果,因为您在
origin/Trying…
之前获得了一些提交的状态

提交
d064f7c
更简单,因为它只是从合并基
4d7f49b
合并
d936a24
0594132
。如果要撤消提交的效果,可以使用git revert-m 1 d064f7c。如果要撤消提交的效果,可以
git revert-m 2 d064f7c
。但是,由于您(大概)想要撤消所有这些操作的效果,所以只需逐个撤消它们就更简单了,完全跳过合并

由于您可能还想通过
214cd47
撤销
cb420e0
,因此您只需单独撤销这些

如果要保持
1f33079
和更早提交的效果,只需不还原它们即可。如果您想撤销它们的效果,可以
git revert-m 2 47d4161
,这将一次撤销它们。我怀疑你是否想要那样,但和以前一样,这取决于你

请注意,任何还原都可以使用
-n
运行(在索引和工作树中还原而不提交),但一旦启动了一系列
-n
操作,您必须继续使用
-n
并最终提交,然后才能开始不使用
-n
的新还原

也许最简单的方法,取决于您想要的结果,是从尽可能早地提取commit
47d4161
的内容开始,这是一种树状态,无需执行单独的commit backout,然后在每个要还原的额外commit上使用
git revert-n
。要提取这些内容,您可以使用
git checkout--.
来避免风险(也请参见原始答案中的以下备注),因为它有轻微的风险,不会删除此后新文件的索引和工作树条目,或者
git read tree--reset-u
)。我会选择后者,给出:

git read-tree --reset -u 47d4161
git revert -n e999b3d
git revert -n 953e4c3
git revert -n 09e350b
(当然,假设这会得到您想要的最终工作树和索引状态)

(原始答案在第行下方。)


Git的
revert
不会还原为提交(这使得命令的名称很糟糕:它使用了错误的动词)。它所做的是返回(即“还原”)一个特定的提交,或者可能是一组提交。1您使用
2dda031..HEAD
,因为此范围语法实际上意味着
HEAD^2dda031
,即可以从
HEAD
访问的所有提交的集合,排除(用set减法减去)可从
2dda031
访问的所有提交集

现在,由于合并,这里有多个问题。首先,排除
2dda031
及其父级无法排除合并的另一个分支,因此您将恢复太多的提交。第二个问题是,从某种意义上说,合并提交是一种提交,作为其单个提交更改,“所有更改都由一个分支引入”。2第三个问题是,为了恢复合并提交,y