在 git 中强制推送个人分支是否安全?
Is it safe to force push personal branch in git?
假设我在一个名为 feature
的个人分支机构工作。
- 我做了 5 次提交。
- 我在 master 的基础上变基。
- 我将我的分支推送到远程。
- 我
git reset --hard
回到提交 3。
- 我从 master 合并。
- 我推送到远程(我必须使用
-f
)。
这样做安全吗?否则会导致主人出现任何问题吗?我最终需要将 feature
合并到 master
。
你就够安全了,只要真的是私有的,你只push到私有分支即可;这就是为什么。
分支是一种特定的 "reference",给出提交的 ID。
当您推送或获取时,您是在要求您的 git 使用您的存储库与另一个 git 和另一个存储库通信。使用 fetch
,您要求您的 git 要求他们的 git 给您 git 您还没有的东西,然后您的 git 设置 "remote branches" 用于您的回购,识别带来的新东西。使用 push
你要求你的 git 发送一些提交,然后要求他们的 git 使他们的引用指向(其中一些)那些提交。
当你 "force push" 让你的 git 告诉他们 git 设置这些引用时,即使这可能 "lose" 提交(la git reset
)。
记住,references make commits reachable。在 git 中,提交形成一个图("directed acyclic" 图或 DAG):
A <- B <- C
这里每个大写字母代表一个提交。每个提交都有不同的 "true name" SHA-1(40 个字符明显的废话,如 1fc3e7aa...
)。给定这些又长又丑的 SHA-1 名称之一,例如提交 C
的真实名称,您(或 git)读取提交并找到 "parent" 提交,在本例中是用于提交 B
的不同大而丑陋的 SHA-1。然后您阅读该提交并找到提交 A
.
的大而丑陋的 SHA-1
但是你从哪里得到用于提交 C
的又大又丑的 SHA-1?你可以试着记住它,但这似乎是个糟糕的计划。相反,为什么不创建一个小文件,如 .git/refs/heads/feature
,然后将丑陋的 SHA-1 写入该文件?更好的是,让 git 那样做怎么样?
这就是引用 - 在这种情况下,分支名称:refs/heads/
类别下的名称。
现在你所要做的就是记住这个名字feature
。此外,git 可以在 refs/
目录中查找 all 你的参考资料:分支(在 refs/heads/
中),标签(在 [=26= 中) ])、注释(在 refs/notes/
中),等等。
任何有指向它的名称的提交,显然是 "reachable":您(或 git)打开名称,读取 SHA-1,然后获取提交。但是任何通过这种方式间接 find-able的提交也是可以到达的:也就是说,只要我们可以直接找到C
,我们就可以用它来找到B
,然后用它来查找 A
.
当您执行 git reset
时,您是在告诉 git 移动引用。让我们稍微扩展该序列以添加新提交 D
,并使 feature
指向 D
:
A <- B <- C <- D <-- feature
现在让我们 git reset --hard
提交 C
。我真的无法用纯文本将任何内容变灰,但我会把 D
推到一边:
D
/
A <- B <- C <-- feature
我们已经告诉 git 移动 feature
指向 C
。什么指向 D
?没什么——好吧,"almost nothing":git 有 "reflogs" 并且有 reflog 条目使 D
再存活 30 天(默认情况下)。但是对于正常目的,提交 D
已经消失了。至少,它不再 容易 可达,并且 git log
默认情况下不会显示它。一旦它真的无法访问(不再有 reflog 条目),git 最终会 "garbage collect" 并将其从存储库中删除。
如果你现在要求 git push
告诉一些 other git 设置一些 other 存储库的 feature
指向提交 C
,这也会从那里丢失提交 D
(当然,假设他们首先有 D
)。
这里情况特别糟糕的地方是其他人,使用相同 "other"(共享)git 存储库的人正在使用并依赖于提交 D
。在某个时候,他会调用这个共享仓库并询问 feature
中有什么,然后得到一个回复说 "branch feature
points to commit C
" 然后他将不得不弄清楚如何在不提交 D
,或重新提供提交 D
,或其他。
你说没有其他人在使用这个分支(它是私有的),所以没有其他人依赖于提交 D
。
另一件要知道的事情是,虽然 你的 reflogs 会让你恢复提交 D
30 天以上,但你可以推送的存储库通常有reflogs 被禁用。这意味着一旦您使提交 D
在服务器上无法访问,它很可能会被垃圾收集。
最后,如果您开始养成强制推送的习惯,请非常小心您强制推送的内容,以免您不小心强制推送删除提交其他人是 using/depending-on.
假设我在一个名为 feature
的个人分支机构工作。
- 我做了 5 次提交。
- 我在 master 的基础上变基。
- 我将我的分支推送到远程。
- 我
git reset --hard
回到提交 3。 - 我从 master 合并。
- 我推送到远程(我必须使用
-f
)。
这样做安全吗?否则会导致主人出现任何问题吗?我最终需要将 feature
合并到 master
。
你就够安全了,只要真的是私有的,你只push到私有分支即可;这就是为什么。
分支是一种特定的 "reference",给出提交的 ID。
当您推送或获取时,您是在要求您的 git 使用您的存储库与另一个 git 和另一个存储库通信。使用 fetch
,您要求您的 git 要求他们的 git 给您 git 您还没有的东西,然后您的 git 设置 "remote branches" 用于您的回购,识别带来的新东西。使用 push
你要求你的 git 发送一些提交,然后要求他们的 git 使他们的引用指向(其中一些)那些提交。
当你 "force push" 让你的 git 告诉他们 git 设置这些引用时,即使这可能 "lose" 提交(la git reset
)。
记住,references make commits reachable。在 git 中,提交形成一个图("directed acyclic" 图或 DAG):
A <- B <- C
这里每个大写字母代表一个提交。每个提交都有不同的 "true name" SHA-1(40 个字符明显的废话,如 1fc3e7aa...
)。给定这些又长又丑的 SHA-1 名称之一,例如提交 C
的真实名称,您(或 git)读取提交并找到 "parent" 提交,在本例中是用于提交 B
的不同大而丑陋的 SHA-1。然后您阅读该提交并找到提交 A
.
但是你从哪里得到用于提交 C
的又大又丑的 SHA-1?你可以试着记住它,但这似乎是个糟糕的计划。相反,为什么不创建一个小文件,如 .git/refs/heads/feature
,然后将丑陋的 SHA-1 写入该文件?更好的是,让 git 那样做怎么样?
这就是引用 - 在这种情况下,分支名称:refs/heads/
类别下的名称。
现在你所要做的就是记住这个名字feature
。此外,git 可以在 refs/
目录中查找 all 你的参考资料:分支(在 refs/heads/
中),标签(在 [=26= 中) ])、注释(在 refs/notes/
中),等等。
任何有指向它的名称的提交,显然是 "reachable":您(或 git)打开名称,读取 SHA-1,然后获取提交。但是任何通过这种方式间接 find-able的提交也是可以到达的:也就是说,只要我们可以直接找到C
,我们就可以用它来找到B
,然后用它来查找 A
.
当您执行 git reset
时,您是在告诉 git 移动引用。让我们稍微扩展该序列以添加新提交 D
,并使 feature
指向 D
:
A <- B <- C <- D <-- feature
现在让我们 git reset --hard
提交 C
。我真的无法用纯文本将任何内容变灰,但我会把 D
推到一边:
D
/
A <- B <- C <-- feature
我们已经告诉 git 移动 feature
指向 C
。什么指向 D
?没什么——好吧,"almost nothing":git 有 "reflogs" 并且有 reflog 条目使 D
再存活 30 天(默认情况下)。但是对于正常目的,提交 D
已经消失了。至少,它不再 容易 可达,并且 git log
默认情况下不会显示它。一旦它真的无法访问(不再有 reflog 条目),git 最终会 "garbage collect" 并将其从存储库中删除。
如果你现在要求 git push
告诉一些 other git 设置一些 other 存储库的 feature
指向提交 C
,这也会从那里丢失提交 D
(当然,假设他们首先有 D
)。
这里情况特别糟糕的地方是其他人,使用相同 "other"(共享)git 存储库的人正在使用并依赖于提交 D
。在某个时候,他会调用这个共享仓库并询问 feature
中有什么,然后得到一个回复说 "branch feature
points to commit C
" 然后他将不得不弄清楚如何在不提交 D
,或重新提供提交 D
,或其他。
你说没有其他人在使用这个分支(它是私有的),所以没有其他人依赖于提交 D
。
另一件要知道的事情是,虽然 你的 reflogs 会让你恢复提交 D
30 天以上,但你可以推送的存储库通常有reflogs 被禁用。这意味着一旦您使提交 D
在服务器上无法访问,它很可能会被垃圾收集。
最后,如果您开始养成强制推送的习惯,请非常小心您强制推送的内容,以免您不小心强制推送删除提交其他人是 using/depending-on.