我从master创建了一个分支branch-1,然后在它上面做了一堆提交,然后面对两个选项,所以从那里分支,并在原始分支branch-1上做了一堆提交,一些提交在新的分支branch-2上。
原始分支branch-1上的提交变成了死胡同(第二次分支之后的提交),但分支branch-2上的提交应该留下来。
有没有办法去掉第一个分支branch-1,只保留第二个具有完整历史的分支?
发布于 2018-10-15 23:53:22
重要的是要认识到,在Git中,分支并不是历史。提交就是历史。(并且没有文件历史记录-只有提交。)请注意,每个提交都有一个“真名”,这是它的散列ID,由40个十六进制字符组成的丑陋的大字符串,如f84b9b09d40408cf91bbc500d9f190a7866c3e0f。
每次提交都会存储源树的完整快照,外加一些元数据。这里,元数据是更有趣的部分。提交中的元数据包括:
提交您的姓名、电子邮件地址和time-stamp;
在这个特定的上下文中,最后一项是所有项目中最重要的。如果我们使用一个大写字母作为大的丑陋的散列ID的替身,我们可以像这样绘制提交:
... <-F <-G <-H其中H是最后一次提交。Commit H记住了G的散列ID,所以我们说H指向G。同时,G记住了它的父F,所以G指向F,它指向E,依此类推。
这是存储库中的历史记录。进行新的提交包括让Git冻结您的源树,添加日志消息等,并提出一个新的散列ID I。新的提交I将存储H的散列ID:
... <-H <-I而现在的历史是更长的一次提交。
但是:我们如何知道哪个提交是链中的最后一个提交?在这个简化的示例中,使用大写字母很明显,但是使用真正的散列ID,看起来是随机的,但事实并非如此。事实上,要找出答案,除了使用“每次提交都列出,看看哪一个是最后一个”之外,什么都没有。所以Git为我们提供了分支名称,这有助于弱小的人类(以及Git本身,因为它也不是那么聪明)找到最后一个提交:
...--F--G--H <-- master它变成了:
...--G--H--I <-- master在我们提交新的提交之后。
简而言之,分支名称只是指向(包含)我们和Git应该算作该分支的一部分的最后一次提交。
这意味着当你创建一个新的分支时,你选择一些现有的提交,并告诉Git在它上面放上另一个名字:
...--F--G--H <-- master, branch1现在Git需要一种方法来知道要使用哪个分支名称,所以我们让Git将特殊名称HEAD附加到两个分支中的一个:
...--F--G--H <-- master, branch1 (HEAD)当我们进行新的提交时,Git会更新HEAD所附加的名称,如下所示:
...--F--G--H <-- master
\
I <-- branch1 (HEAD)注意,提交H也在分支branch1上,它是master的提示。
如果您创建了另一个名称,只需将其绘制到它所指向的任何位置。如果它指向H,则将其绘制到指向H。如果它指向I,如branch1,则将其绘制到指向I。然后添加更多的提交,更新附加到HEAD的任何名称:
J--K <-- branch2 (HEAD)
/
...--F--G--H <-- master
\
I <-- branch1或者:
...--F--G--H <-- master
\
I <-- branch1
\
J--K <-- branch2 (HEAD)或者别的什么。
假设在这一点上我们有:
...--F--G--H <-- master
\
I--L--M--N <-- branch1 (HEAD)
\
J--K <-- branch2删除分支(名称)只意味着删除名称。提交保持不受干扰--一旦提交,没有什么可以改变它。如果您不再能够在图中找到提交,那么提交现在很容易被删除。但如果您可以从某个现有名称开始,然后返回到提交,那么提交本身就是引用安全的。因此,如果我们删除(这样我们就可以删除branch1),我们将得到:
...--F--G--H <-- master (HEAD)
\
I--L--M--N [abandoned]
\
J--K <-- branch2提交I仍然可以通过从K开始,从branch2开始,然后向后工作:提交I在branch1和branch2上。现在branch1已经不在了,I只在branch2上,但是它仍然可以通过Git的“从所有分支名称向后走”的技巧来实现,
然而,提交L-M-N已经变得不受保护。经过一段时间-通常有至少30天的宽限期,通过一种Git称为reflogs的机制-Git的“垃圾收集器”最终将运行并清理无法访问的对象(提交和其他对象)。这些提交最终将完全消失,留给您的是:
...--F--G--H <-- master (HEAD)
\
I
\
J--K <-- branch2这让它看起来好像branch1从来没有存在过。
https://stackoverflow.com/questions/52814958
复制相似问题