不可恢复的git推?

时间:2012-02-21 07:17:31

标签: git version-control github git-rebase

我仍在努力了解rebase的影响并重写Git历史。想象一下github上的一个存储库R,它有一年的宝贵源代码历史。让我们说它是这个星球上唯一的副本。

提交者可以做些什么,通过克隆存储库,进行一些更改并推回它们,这会导致该存储库永久丢失?我不知道,一些奇怪的重复,删除,推动的序列?如果是这样,是否有任何此类序列立即不可逆转(而不是在垃圾收集后一个月左右发生)?

3 个答案:

答案 0 :(得分:2)

默认情况下,服务器会拒绝非快进推送。但是,从git-push man page,您可以找到一种方法来强制服务器接受可能具有破坏性的推送操作:

  

-f, - force

     

通常,该命令拒绝更新不是本地祖先的远程引用   ref用来覆盖它。此标志禁用检查。 这可能会导致遥控器   存储库丢失提交;小心使用。

正如警告所说,这可能会导致遥控器丢失一个或多个提交。具体而言,如果无法从另一个分支的HEAD访问目标分支的提交,则可能会发生这种情况。

例如,以下方案可能导致服务器丢失提交:

git clone ...
edit ...
git add .
git commit --amend -m "These changes overwrite origin/master's HEAD."
git push -f origin master

但是,如果您刚刚尝试覆盖的提交恰好被标记或可从另一个分支的HEAD访问,则提交不会丢失。

答案 1 :(得分:1)

如果强制推送到存储库,AndréCaron解释说,某些提交可能无法访问。

Github不允许您访问存储库(因为这不是一个标准的git存储库,因为这不是您的业务)。所以在这种情况下,你实际上会丢失信息。

但是如果你是这个存储库的有效管理员,你可以在某种程度上通过浏览reflog从强制推送中恢复,然后让分支恢复生机。

请注意,您的本地存储库(您强制推送的存储库)应该包含待处理的提交,然后您应该能够在需要时复活它们。

答案 2 :(得分:1)

是的,某些操作会永久破坏您的历史记录,例如:

git push repo-name +master 

将使用本地分支丢失主历史记录覆盖主仓库(repo-name)。

但废弃历史记录的最常见方式是通过互动式重新定位:

git rebase -i 6bd80e12

...仅在尚未推送到外部存储库的提交上执行此操作。如果其他人的工作基于您要删除的提交,则可能会发生许多冲突。如果已经与他人共享,请不要重写您的历史记录。

我建议您阅读更多内容:

http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html

http://progit.org/book/ch6-4.html

http://book.git-scm.com/4_interactive_rebasing.html