为什么Git中没有撤消/重做?
据我所知,当你想在Git中撤销某些东西时,你必须明确地找到命令来撤消你所做的任何事情并发布它。 例如,许多撤销提交和重做的方法之一是遵循这里的例子,
$ git commit ...
$ git reset --soft HEAD^
$ edit
$ git add ....
$ git commit -c ORIG_HEAD
或者撤消拉,你可以按照这里的指示,
$ git reset --hard
但是这些命令不一定可以互换。 Git不允许简单的撤消和重做命令吗? 与它背后的哲学有什么关系? 另外,我没有太多其他版本控制系统的经验,但是他们中的任何一个都提供了简单的撤消和重做命令?
这样一个概念有几个问题:
并非所有的操作都是可逆的。 有时候,这是因为Git没有记录足够的信息来推断先前的状态 - 总体而言,这样做的代价非常昂贵。 有时候就像git reset --hard
或者git clean
,这会破坏未经修改的更改。 为了撤消它们,它必须不断自动备份。 有时候这是因为撤销的概念是不明确的 - 就像你自己指出的那样,撤销提交有很多方法。
如果一个操作是可逆的,并且涉及某种历史,撤消/重做是否也应该在历史中,还是应该使它消失? 是否应通过重新设置或恢复(创建另一个提交以取消它)来撤消提交?
如果没有记录你所做的每件最后的事情,你怎么知道最近的操作是什么? 假设你向索引添加了一个文件,并创建了一个分支。 没有第一个记录。
即使所有内容都有明确的定义,但实施起来也是荒谬的。 你如何确定什么是单一行为? 一个Git命令可能会做很多事情。 它应该撤消一步,整个事情? 如果你已经运行了一个zillion命令,每个步骤都很小,并且你想要全部撤消这些命令呢? 它必须是完美的,完全完美的,因为这种功能将被没有经验的用户使用,他们不知道如何从任何错误中恢复过来。
因此,正如Git为您提供工具一样,它可以为您提供工具来查看您所做的工作,并在需要时自行解决问题。
另外,关于“重做”,正如你在你的问题中所定义的那样,它重复一个命令,而不是再次执行原始操作。 当你重新提交一个提交时,它是一个不同的提交。 重新运行以前的命令是命令行shell设计的目的。 Git不需要重新创建它。
其实你的第一个例子可以通过以下方式执行:
$ git commit ...
$ edit
$ git add ...
$ git commit --amend
你的第二个例子应该更像git reset --hard <hash>
你的问题的答案是,它可能是可能的,但是是的,它更多的是驾驶git的哲学,这意味着它还没有完成。 从理论上讲,无法通过创建或删除另一个来确定是否需要进行提交,但使用reflog可能可能......以前没有真正考虑过这个问题。
我不认为'撤消'和'重做'在源代码管理中是非常普遍的事情,但如果我错了,请纠正我。
编辑:你可能会钻一个脚本,可以做你使用reflog后 - 你不知道是否有足够的信息,但它可能是值得一试。
git
实际上是多个小工具,它们作用于存储库,索引和工作目录,因此它没有任何'撤销'的“核心”部分。
这就是说它有各种日志,比如reflog
让你回顾一下完成的事情。
最后,按照惯例,许多git动作通常被认为是“单向的”,也就是说,你不希望任何人公开看到它,所以git在进入时会尝试“让你绕着块跑”上市。 如果你仍然在本地回购,你可以使用各种命令备份,但全局撤销并不是一个合适的命令。
链接地址: http://www.djcxy.com/p/94779.html