Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git中有哪些操作很难/不可能撤销?_Git - Fatal编程技术网

Git中有哪些操作很难/不可能撤销?

Git中有哪些操作很难/不可能撤销?,git,Git,Git的优点之一是,由于它使用指针进行操作,因此撤销包括或在内的大量任务相对容易。在许多情况下,您真正需要做的就是将当前分支的头指针正确地重置到所需的位置,瞧,步骤撤消。这包含了相当广泛的案例 除了删除整个存储库或错误推送之外,在标准Git存储库中,最不容易撤消或极难撤消的操作是什么? git clean删除未跟踪的文件。他们不能用git恢复 与脏的工作树合并可能会导致难以恢复的内容 所以简而言之,git无法恢复git无法跟踪的内容。其他一切都是可恢复的。一个难以撤消的操作示例如下: git

Git的优点之一是,由于它使用指针进行操作,因此撤销包括或在内的大量任务相对容易。在许多情况下,您真正需要做的就是将当前分支的头指针正确地重置到所需的位置,瞧,步骤撤消。这包含了相当广泛的案例

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

  • git clean
    删除未跟踪的文件。他们不能用git恢复

  • 与脏的工作树合并可能会导致难以恢复的内容


所以简而言之,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
;当您的本地服务器没有远程服务器上的分支时,将以非交互方式删除远程分支。(:“--镜像[…]新创建的本地引用将被推送到远程端,本地更新的引用将在远程端强制更新,删除的引用将从远程端删除”)