Git-重新连接到主分支和分支
我从Git-重新连接到主分支和分支,git,branch,git-branch,Git,Branch,Git Branch,我从master创建了一个分支branch-1,然后对其进行了一系列提交,然后面临两个选项,因此从那里进行了分支,并对原始分支branch-1进行了一系列提交,一些提交在新分支branch-2上 原来分支branch-1上的提交被证明是一条死胡同(第二次分支后的提交),但分支branch-2上的提交将被保留 有没有办法摆脱第一个分支branch-1,只保留第二个分支的完整历史记录?重要的是要认识到,在Git中,分支不是历史。这就是历史。(没有文件历史记录,只有提交。)请注意,每个提交都有一个“真
master
创建了一个分支branch-1
,然后对其进行了一系列提交,然后面临两个选项,因此从那里进行了分支,并对原始分支branch-1
进行了一系列提交,一些提交在新分支branch-2
上
原来分支branch-1
上的提交被证明是一条死胡同(第二次分支后的提交),但分支branch-2
上的提交将被保留
有没有办法摆脱第一个分支
branch-1
,只保留第二个分支的完整历史记录?重要的是要认识到,在Git中,分支不是历史。这就是历史。(没有文件历史记录,只有提交。)请注意,每个提交都有一个“真实名称”,即它的哈希ID,一个由40个十六进制字符组成的丑陋的大字符串,如f84b9b09b09d40408cf91bbc500d9f190a7866c3e0f
每次提交都会存储源树的完整快照以及一些元数据。在这里,元数据是更有趣的部分。提交中的元数据包括:
- 您的姓名、电子邮件地址和时间戳李>
- 你的日志信息;及
- 其前一个或父提交的哈希ID
... <-F <-G <-H
...--F--G--H <-- master
\
I <-- branch1 (HEAD)
而现在的历史是一个更长的承诺
但是:我们如何知道哪个提交是链中的最后一个提交?在这个简化的示例中,使用大写字母是显而易见的,但使用真正的散列ID(看起来是随机的)则不是。事实上,只有暴力“列出每一次犯罪,看看哪一次是最后一次”才能发现。所以Git给了我们分支名称,这有助于弱小的人类(Git本身也不是那么聪明)找到最后的提交:
当我们进行新的提交时,Git会更新HEAD
所附加的名称,如下所示:
... <-F <-G <-H
...--F--G--H <-- master
\
I <-- branch1 (HEAD)
或:
通过从branch2
开始,从K
开始,向后操作,仍然可以访问提交I
:提交I
在branch1
和branch2
上。既然branch1
已经消失,I
只在branch2
上,但Git的“从所有分支名称向后走”技巧仍然可以访问它
但是,提交L-M-N
已变得不受保护。经过一段时间后,通常至少有30天的宽限期,通过Git调用reflogs的机制,Git的“垃圾收集器”最终将运行并清理无法访问的对象(提交和其他对象)。这些承诺最终将完全消失,留给您的是:
...--F--G--H <-- master (HEAD)
\
I
\
J--K <-- branch2
…--F--G--H为什么不删除第一个分支,继续处理另一个分支?
...--F--G--H <-- master, branch1 (HEAD)
...--F--G--H <-- master
\
I <-- branch1 (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
...--F--G--H <-- master (HEAD)
\
I--L--M--N [abandoned]
\
J--K <-- branch2
...--F--G--H <-- master (HEAD)
\
I
\
J--K <-- branch2