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
在这一特定背景下,最后一项是最重要的。如果我们使用一个大写字母作为丑陋的大哈希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