joh*_*ohn 9 git version-control undo undo-redo
据我所知,当你想在Git中撤消一些东西时,你必须明确地找到命令来撤消你已经完成的任何事情并发布它.例如,许多撤消提交和重做它的方法之一是遵循这里的示例,
$ git commit ...
$ git reset --soft HEAD^
$ edit
$ git add ....
$ git commit -c ORIG_HEAD
Run Code Online (Sandbox Code Playgroud)
或者要撤消拉动,您可以按照此处的说明操作,
$ git reset --hard
Run Code Online (Sandbox Code Playgroud)
但是这些命令不一定可以互换.有没有理由为什么Git不允许简单的撤销和重做命令?它与背后的哲学有什么关系?另外,我对其他版本控制系统没有太多经验,但是它们中的任何一个都提供了简单的撤销和重做命令吗?
这种观念有几个问题:
并非所有操作都是可逆的.有时候这是因为Git没有记录足够的信息来推断先前的状态 - 一般来说这是非常昂贵的.有时它会像git reset --hard或git clean那些破坏未经修改的变化.为了撤消它们,它必须不断自动备份.有时这是因为撤消的概念含糊不清 - 正如您自己指出的那样,有很多方法可以撤消提交.
如果一个操作是可逆的,并且它涉及某种历史,那么撤消/重做是否也应该在历史中,或者它们是否应该消失?是否应该通过重置或通过还原(创建另一个提交以取消它)撤消提交?
如果不记录你做的每一件事,你怎么知道最近的操作是什么?假设您向索引添加了一个文件,并创建了一个分支.没有记录是第一次.
即使一切都已明确定义,实施这些工作也是荒谬的.您如何确定单一行动的构成?单个Git命令可能会做很多事情.它应该撤消一步,整个事情?如果您运行了大量命令,每个步骤都执行一小步并且您想要将其全部撤消,该怎么办?它必须是完美的,完全完美的,因为它是那些不知道如何从任何错误中恢复的缺乏经验的用户将使用的功能.
因此,正如Git为您提供了处理工作的工具,它为您提供了工具,可以查看您已完成的工作,并在需要时自行撤消.
此外,关于"重做",正如您在问题中定义的那样,它正在重复命令,而不是再次执行原始操作.重做提交时,它是一个不同的提交.重新运行以前的命令是命令行shell 设计用来执行的操作.Git不需要重新发明它.
实际上,您的第一个示例可以通过以下方式执行:
$ git commit ...
$ edit
$ git add ...
$ git commit --amend
Run Code Online (Sandbox Code Playgroud)
你的第二个例子应该更像git reset --hard <hash>
你的问题的答案是它有可能,但是是的,更多的是驱动 git 的哲学,这意味着它还没有完成。从理论上讲,没有办法判断您是否通过创建提交或删除另一个提交来进行提交,但使用引用日志也许是可能的......以前没有真正以这种方式考虑过。
我不认为“撤消”和“重做”在源代码管理中是很常见的事情,但如果我错了,请纠正我。
编辑:您可以编写一个脚本,该脚本可以在使用引用日志后执行您的操作 - 不确定那里是否有足够的信息,但它可能值得一试。