是否有通用的git“撤消”命令?

时间:2016-07-26 19:51:38

标签: git

看一下有史以来最常见的一些问题,似乎撤销git错误是一个非常普遍的问题。这些问题都得到了很好的回答,git命令本身也很简洁,但我想知道git是否已经 - 或计划在即将发布的版本中实现 - 一个通用的 git undo 命令。这个命令实际上会完全撤消你最近执行的git命令。

编辑:仅仅是为了特异性,我的意思是git undo在您输入错误命令之前查看存储库的状态,并将其恢复为该状态的精确副本是

例如,如果我执行 git add --all ,然后键入类似 git undo 的内容,git将取消暂存刚刚暂存的所有文件和存储库看起来与我输入git add all之前的内容相同。

此外,这是一个很棒的resource summarizing undoing git commands

2 个答案:

答案 0 :(得分:3)

自己制作这样的命令会很容易。

export STORE=/home/me/.git_backup 
mkdir $STORE
export ROOT=/home/me/src/somegitrepos
alias git='tar czf /$STORE/state.tar.gz -C $ROOT . ; /usr/bin/git'
alias git-undo='rm -rf $ROOT/* $ROOT/.??* ; cd $ROOT/ ; tar xzf /$STORE/state.tar.gz' 

(显然,需要添加健壮性;即确保$STORE/state.tar.gz之前确实存在rm -rf,并支持多个不同的存储库等。)

当然,这只是一个概念证明。对于较大的存储库,解决方案会令人恼火。在这种情况下,请使用快照文件系统,而只是在git别名中创建快照,并存储快照的名称而不是完整的tar.gz存档。非常简单,并且在良好的FS(例如xfs)中,它在速度和空间使用方面是绝对可忽略的。你甚至可以轻而易举地进行多步撤销......

解决方案很简单,因此实施一个复杂的解决方案是完全疯狂的。 git中的版本本身可以实际跟踪所有类型的更改,只是为了使空间使用更加优化(与快照相比,而不是tar"解决方案")。

顺便说一下,至少有两个原因没有内置git undo

  • 这将是一个水平的"特征,即,必须触摸不是只读的每个最后git命令(例如,statuslog)。此外,每个未来的命令都需要包含对此的支持。可能有也可能没有命令,根本不可能这样做(没有回到像这里建议的愚蠢的tar解决方案。)
  • 经过cvs,svn和git的多年经验,我发现git似乎非常非常抵抗数据丢失。我不是在谈论错误,而是使用git命令来打破"打破"一些东西。除了像git reset --hard之类的一些命令修改git商店之外的文件(即工作目录中未添加的更改)之外,所有内容都可以通过非常简单的方式恢复(直到垃圾收集删除了东西...... )。

    git的数据存储方案也很容易理解,并且"参见"对于普通用户(哎呀,gitk并且您已完成)。这与我使用其他工具的经验非常不同,我绝对害怕svn中的复杂合并...所以当你知道如何撤消东西时,需要"需要" git undo消失了。

    强大的工具,例如git rebase -i或简单的事实,分支只是"粘滞便笺"让你几乎可以轻松地从任何东西中恢复过来(例如,以某种方式合并一个已经合并原始分支的重新分支,以及在实践中可能发生的任何愚蠢的事情;)。

答案 1 :(得分:2)

不,没有这样的功能。据我所知,没有人建议添加它。

我可以引用任何文档来证明此功能的 - 存在,而Stack Overflow不是讨论或提出软件功能的地方,因此我将其留在那里。