Git的优点之一是,因为它使用指针操作,所以撤销大量任务相对容易,包括删除一个或多个提交,或创建和删除远程分支。在许多情况下,您真正需要做的就是将当前分支的HEAD指针正确地重置到所需的位置,然后,瞧,步骤取消了。这包含了相当广泛的情况。
除了删除整个存储库或错误的推送之外,在标准的Git存储库中不能撤消或极难撤消的最重要的操作是什么?
到目前为止,我在那些新git中遇到的最常见的"难以撤销"错误是git stash
的滥用,因为git stash pop
并不总是与git stash
可逆。考虑:
git init /tmp/trash && cd /tmp/trash # make a new repo
echo A > A # create a file
git add A
git commit -m "Initial commit" # add and commit it
echo B > A # ... now change it
git stash # ... and stash it
echo C > A # and change it and commit it again
git add A
git commit -m "Another commit"
git stash pop # now pop the stash
pop
将尝试自动合并A
,并将抛出冲突,但您不能通过再次点击git stash
来退出pop。我相信git stash drop
也是永久性的,也就是说,如果你丢错了藏匿处,没有安全网。
一般来说,使用stash
来完成它的设计目的:隐藏一个脏的工作索引,以便跳转到另一个分支,修复错误,提交,推送,然后跳转到原始状态。如果您试图使用它来管理跨多个分支的大量更改,那么它将不可避免地伤害您。
-
git clean
删除未跟踪的文件。 -
与脏工作树合并可能会导致一些难以恢复的内容。
所以简而言之,git不能跟踪的东西不能被git恢复。
一个难以撤销操作的例子是:
git branch -D some-unmerged-branch-such-as-master
git gc --prune=now --aggressive
第一个删除对某些提交的引用。第二个命令删除所有没有引用的提交。
我希望这个问题只是一个无聊的好奇问题,而不是你想要废弃某人的repo,但是由于分布式版本控制中固有的冗余,我不太担心。
根据我的经验,人们执行的最常见的不可逆动作是git reset --hard
。当许多人写git reset
时,--hard
似乎太自然了,而他们实际上只需要一个reset
,也许是--keep
。