Git中都有哪些难以/不可能撤消的操作? [关闭]

Posted

技术标签:

【中文标题】Git中都有哪些难以/不可能撤消的操作? [关闭]【英文标题】:What Are Some Actions In Git That Are Difficult/Impossible to Undo? [closed]Git中有哪些难以/不可能撤消的操作? [关闭] 【发布时间】:2013-04-25 20:25:15 【问题描述】:

Git 的优势之一是,因为它使用指针操作,所以相对容易撤消包括deleting a commit or commits 或creating and deleting remote branches 在内的大量任务。在许多情况下,您真正​​需要做的就是正确地将当前分支的 HEAD 指针重置到所需位置,然后瞧,撤消步骤。这涵盖了相当广泛的案例。

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

【问题讨论】:

我不明白这个问题的意义。 确实理解这个问题和类似问题的意义。本质上,它是在问,“龙在哪里?”这个问题远非“没有建设性”,但它更适合 Programmers Stack Exchange。在开始使用新技术时,开发人员通常想知道龙、陷阱和诱杀装置在哪里。 【参考方案1】:

根据我的经验,人们执行的最常见的不可逆操作是git reset --hard。当很多人写git reset时,--hard似乎来得太自然了,而他们真的只需要reset,也许还有--keep

【讨论】:

【参考方案2】:

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

【讨论】:

这是一个旧条目,但在这种情况下,您可以简单地reset --hardstash pop 不会自动删除存储条目以防万一。【参考方案3】:

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

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

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

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

【讨论】:

这个选项组合是否也会对reflog引用的对象进行核攻击? 这绝对比恶意更接近于闲散的好奇心。我对 Git 的源代码控制能力可能存在的限制更感兴趣。【参考方案4】:

git clean 删除未跟踪的文件。它们无法用 git 恢复。

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

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

【讨论】:

其实并不是所有被git跟踪的东西都可以恢复。删除分支似乎是永久性的。甚至还有一些不明显的方式可以发生分支删除,例如git push --mirror REMOTE;当您的本地没有远程分支时,远程分支将以非交互方式删除。 (Cf. the excerpt from git help pages: "--mirror [...] 新创建的本地 refs 将被推送到远端,本地更新的 refs 将在远端强制更新,删除的 refs 将被移除 从远端")

以上是关于Git中都有哪些难以/不可能撤消的操作? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

git 中都有哪些不同的存储库格式版本(对于 core.repositoryFormatVersion 设置)?

git 使用详解—— 3种撤消操作

perl 中都有哪些可用的框架 [关闭]

r中都有哪些可用的情感分析包? [关闭]

cpu中都有哪些寄存器资源,他们的初始值分别是多少

gitGit 基础 - 撤消操作