在git中强制推送个人分支是否安全?

时间:2015-09-24 00:14:14

标签: git version-control git-commit

假设我在名为feature的个人分支上工作。

  1. 我做了5次提交。
  2. 我在主人身上重新开始。
  3. 我将我的分支推到遥控器上。
  4. git reset --hard回到提交3。
  5. 我从大师那里合并。
  6. 我推到遥控器(我必须使用-f)。
  7. 这样做是否安全或者会导致主人遇到任何问题?我最终需要将feature合并到master

1 个答案:

答案 0 :(得分:5)

你足够安全,只要它真的是私密的,你只能推到私人分支;这就是为什么。

分支是一种特定的"引用",给出提交的ID。

当你正在推或拿,你要求你的git使用你的回购与另一个git和另一个回购交谈。用fetch你要求你的git要求他们的git给你的git你还没有的东西,然后你的git设置"远程分支"为你的回购,识别带来的新东西。使用push,你要求你的git发送一些提交,然后让他们的git使他们的引用指向(某些)提交。(/ p>

当你"强迫推动"你正在让你的git告诉他们的git设置那些引用,即使那可能会失去"提交(la git reset)。

请记住,references make commits reachable。在git中,提交形成一个图形("有向无环"图形或DAG):

A <- B <- C

这里每个单个大写字母指的是一个提交。每个提交都有一个不同的真实姓名&#34; SHA-1(40个字符明显无意义,如1fc3e7aa...)。鉴于其中一个很长的丑陋的SHA-1名称,就像提交C的真实名称一样,你(或git)读取提交并找到&#34; parent&#34;在这种情况下,commit为提交B提供了一个不同的丑陋SHA-1。然后,您阅读该提交并找到提交A的大丑陋SHA-1。

但是你在哪里获得了提交C的丑陋SHA-1?你可以尝试记住它,但这似乎是一个糟糕的计划。相反,为什么不创建一个像.git/refs/heads/feature这样的小文件,并将丑陋的SHA-1写入该文件?更好的是, git 如何做呢?

参考是什么 - 在这种情况下,是一个分支名称:refs/heads/类别下的名称。

现在你所要做的就是记住名字feature。此外,git可以查看refs/目录并查找所有您的引用:分支(在refs/heads/中),标记(在refs/tags/中),注释(在{中{1}}),等等。

任何具有指向它的名称的提交显然是&#34;可达&#34;:你(或git)打开名称,读取SHA-1,然后获取提交。但是,任何间接可以通过这种方式查找的提交也是可以访问的:也就是说,只要我们可以直接找到refs/notes/,我们就可以使用它来查找C,然后使用它来查找B

当您执行A时,您告诉您的git移动引用。让我们稍微扩展该序列以添加新的提交git reset,并使D指向feature

D

现在让A <- B <- C <- D <-- feature 提交git reset --hard。我不能用纯文本写出任何内容,但是我会把C推到一边:

D

我们已告诉git将 D / A <- B <- C <-- feature 移至指向feature。什么指向C?什么都没有,&#34;几乎没有&#34;:git有&#34; reflogs&#34;并且有一些reflog条目使D保持活动30天(默认情况下)。但是出于正常目的,提交D已经消失。它至少不再易于可访问,并且D默认不会显示它。一旦它真正无法访问(不再有reflog条目),git最终将会“垃圾收集”#34;它并将其从存储库中删除。

如果您现在要求git log告诉某些其他 git将某些其他存储库git push设置为指向commit { {1}},也会从那里丢失提交feature(当然,假设他们首先有C。)

在这里,事情变得特别糟糕的是当有人,有人使用这个&#34;其他&#34; (共享)git repo,正在使用 - 并且依赖于提交D。在某些时候,他会打电话给这个共享的回购并询问D中的内容,并回复一个回复说&#34;分支D指向提交{{1} }&#34;然后,他必须弄清楚如何不提交feature,或重新提供提交feature,或其他任何事情。

你说没有其他人在使用这个分支(它是私有的),所以没有其他人依赖于提交C

另一件需要知道的事情是,虽然你的 reflogs会让你恢复提交D 30天,但你可以推送的存储库通常会禁用reflog。这意味着只要您在服务器上无法访问提交D,它就可能会被垃圾收集。

最后,如果你开始养成强迫推动的习惯,那么非常小心你强行推动什么,以免你不小心强制推送删除其他人使用/依赖的提交上。