看一下有史以来最常见的一些问题,似乎撤销git错误是一个非常普遍的问题。这些问题都得到了很好的回答,git命令本身也很简洁,但我想知道git是否已经 - 或计划在即将发布的版本中实现 - 一个通用的 git undo 命令。这个命令实际上会完全撤消你最近执行的git命令。
编辑:仅仅是为了特异性,我的意思是git undo在您输入错误命令之前查看存储库的状态,并将其恢复为该状态的精确副本是
例如,如果我执行 git add --all ,然后键入类似 git undo 的内容,git将取消暂存刚刚暂存的所有文件和存储库看起来与我输入git add all之前的内容相同。
答案 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
命令(例如,status
,log
)。此外,每个未来的命令都需要包含对此的支持。可能有也可能没有命令,根本不可能这样做(没有回到像这里建议的愚蠢的tar
解决方案。)经过cvs,svn和git的多年经验,我发现git似乎非常非常抵抗数据丢失。我不是在谈论错误,而是使用git命令来打破"打破"一些东西。除了像git reset --hard
之类的一些命令修改git商店之外的文件(即工作目录中未添加的更改)之外,所有内容都可以通过非常简单的方式恢复(直到垃圾收集删除了东西...... )。
git的数据存储方案也很容易理解,并且"参见"对于普通用户(哎呀,gitk
并且您已完成)。这与我使用其他工具的经验非常不同,我绝对害怕svn
中的复杂合并...所以当你知道如何撤消东西时,需要"需要" git undo
消失了。
强大的工具,例如git rebase -i
或简单的事实,分支只是"粘滞便笺"让你几乎可以轻松地从任何东西中恢复过来(例如,以某种方式合并一个已经合并原始分支的重新分支,以及在实践中可能发生的任何愚蠢的事情;)。
答案 1 :(得分:2)
不,没有这样的功能。据我所知,没有人建议添加它。
我可以引用任何文档来证明此功能的非 - 存在,而Stack Overflow不是讨论或提出软件功能的地方,因此我将其留在那里。