Git中有哪些动作是很难/不可能撤销的?

  • 本文关键字:不可能 很难 Git git
  • 更新时间 :
  • 英文 :


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

最新更新