Git中有哪些操作很难/不可能撤销?
Git的优点之一是,由于它使用指针进行操作,因此撤销包括或在内的大量任务相对容易。在许多情况下,您真正需要做的就是将当前分支的头指针正确地重置到所需的位置,瞧,步骤撤消。这包含了相当广泛的案例 除了删除整个存储库或错误推送之外,在标准Git存储库中,最不容易撤消或极难撤消的操作是什么?Git中有哪些操作很难/不可能撤销?,git,Git,Git的优点之一是,由于它使用指针进行操作,因此撤销包括或在内的大量任务相对容易。在许多情况下,您真正需要做的就是将当前分支的头指针正确地重置到所需的位置,瞧,步骤撤消。这包含了相当广泛的案例 除了删除整个存储库或错误推送之外,在标准Git存储库中,最不容易撤消或极难撤消的操作是什么? git clean删除未跟踪的文件。他们不能用git恢复 与脏的工作树合并可能会导致难以恢复的内容 所以简而言之,git无法恢复git无法跟踪的内容。其他一切都是可恢复的。一个难以撤消的操作示例如下: git
删除未跟踪的文件。他们不能用git恢复git clean
- 与脏的工作树合并可能会导致难以恢复的内容
所以简而言之,git无法恢复git无法跟踪的内容。其他一切都是可恢复的。一个难以撤消的操作示例如下:
git branch -D some-unmerged-branch-such-as-master
git gc --prune=now --aggressive
第一个删除对某些提交的引用。第二个删除所有没有引用的提交
我希望这个问题只是一个无聊的好奇问题,而不是你想破坏别人的回购协议,但由于分布式版本控制固有的冗余性,我不太担心。到目前为止,我在git新手中遇到的最常见的“难以撤销”错误是滥用git隐藏的,因为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
实现它的设计目的:隐藏脏工作索引以跳到另一个分支、修复错误、提交、推送并跳回到原始状态。如果您试图使用它来管理跨多个分支的大量更改,它将不可避免地毫无顾忌地咬到您。根据我的经验,人们执行的最常见的不可逆操作是git reset--hard
。当许多人编写git reset
时,--hard
似乎来得太自然了,而他们实际上只需要reset
,也许是--keep
我不理解这个问题的意思。我确实理解这个问题和类似问题的意思。本质上,它是在问“龙在哪里?”这个问题远非“没有建设性”,但它更适合程序员进行堆栈交换。当开发一项新技术时,开发人员通常想知道龙、陷阱和诱杀装置在哪里。这种选项组合是否也会对reflog
引用的对象进行核攻击?这显然更接近于无聊的好奇而不是恶意。我更感兴趣的是Git的源代码控制能力可能存在的局限性。这是一个古老的条目,但在本例中,您可以简单地reset--hard
stash pop
不会自动删除隐藏条目以防丢失。实际上,并不是git跟踪的所有内容都可以恢复。删除分支似乎是永久性的。分支删除甚至有一些不明显的方式,例如,git push--mirror REMOTE
;当您的本地服务器没有远程服务器上的分支时,将以非交互方式删除远程分支。(:“--镜像[…]新创建的本地引用将被推送到远程端,本地更新的引用将在远程端强制更新,删除的引用将从远程端删除”)