7

Git 的优势之一是,因为它使用指针进行操作,所以相对容易撤消大量任务,包括删除一个或多个提交创建和删除远程分支。在许多情况下,您真正​​需要做的就是正确地将当前分支的 HEAD 指针重置为所需的位置,然后瞧,撤消步骤。这包括相当广泛的案例。

除了删除整个存储库或错误推送之外,在标准 Git 存储库中无法撤消或极难撤消的最重要的操作是什么?

4

4 回答 4

4

到目前为止,我在 git 新手中遇到的最常见的“难以撤消”错误git stashgit 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它的设计目的是:存储一个肮脏的工作索引以跳到另一个分支,修复错误,提交,推送,然后跳回原始状态。如果您尝试使用它来管理跨多个分支的大量更改,那么它不可避免地会在您不加注意的情况下咬住您。

于 2013-05-01T19:50:39.700 回答
3
  • git clean删除未跟踪的文件。它们无法用 git 恢复。

  • 与肮脏的工作树合并可能会导致难以恢复的东西。

所以简而言之,git 不跟踪的东西是 git 无法恢复的。其他一切都是可以恢复的。

于 2013-05-01T19:39:15.017 回答
3

一个难以撤消的动作的例子是:

git branch -D some-unmerged-branch-such-as-master
git gc --prune=now --aggressive

第一个删除对某些提交的引用。第二个删除所有没有引用的提交。

我希望这个问题只是一个好奇的问题,而不是你想破坏某人的回购,但由于分布式版本控制固有的冗余,我不太担心。

于 2013-05-01T19:39:39.210 回答
0

以我的经验,人们执行的最常见的不可逆转的行为是git reset --hard。当很多人写作的时候git reset--hard似乎来得太自然了,当他们真的只需要一个reset,或许有了--keep

于 2013-05-01T19:59:53.643 回答