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
再次点击来退出流行。这是一个相当微不足道的例子,但是如果你经常存储大量的更改,并且经常切换不同的分支,那么很容易进入一个令人讨厌的地方。我相信git stash drop
也是永久性的,即如果您丢弃错误的藏匿处,就没有安全网。
一般来说,使用stash
它的设计目的是:存储一个肮脏的工作索引以跳到另一个分支,修复错误,提交,推送,然后跳回原始状态。如果您尝试使用它来管理跨多个分支的大量更改,那么它不可避免地会在您不加注意的情况下咬住您。
git clean
删除未跟踪的文件。它们无法用 git 恢复。
与肮脏的工作树合并可能会导致难以恢复的东西。
所以简而言之,git 不跟踪的东西是 git 无法恢复的。其他一切都是可以恢复的。
一个难以撤消的动作的例子是:
git branch -D some-unmerged-branch-such-as-master
git gc --prune=now --aggressive
第一个删除对某些提交的引用。第二个删除所有没有引用的提交。
我希望这个问题只是一个好奇的问题,而不是你想破坏某人的回购,但由于分布式版本控制固有的冗余,我不太担心。
以我的经验,人们执行的最常见的不可逆转的行为是git reset --hard
。当很多人写作的时候git reset
,--hard
似乎来得太自然了,当他们真的只需要一个reset
,或许有了--keep
。