假设我在名为feature
的个人分支上工作。
git reset --hard
回到提交3。-f
)。这样做是否安全或者会导致主人遇到任何问题?我最终需要将feature
合并到master
。
答案 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
,它就可能会被垃圾收集。
最后,如果你开始养成强迫推动的习惯,那么非常小心你强行推动什么,以免你不小心强制推送删除其他人使用/依赖的提交上。