我认为我不理解git分支。

3
大家好,
我一直在开发一个bash脚本,作为学习UNIX脚本和git使用的小型暑期项目。
这是我第一次在git中使用分支,通常我只使用主分支。
当我使用图形方式查看git日志(git log --graph)时,我注意到我的“develop”分支似乎已经与“master”合并了。就像这样:
master   ----1--------3----4----5----6----HEAD
develop      \---2---/
但是从第三个提交开始,都是在“develop”分支上完成的。使用 git checkout mastergit checkout develop 命令可以证实这一点。
究竟发生了什么?这就是所谓的快速前进吗? 更新#1: 提交1实际上不是我的repo中的第一个提交,而是我在“master”上做出的最后一个提交。 更新#2: 这是使用gitk --all命令给出的图形。
                   标签 '1.0-0'
                        |
master    --*--*--*--*--*--*----2\
develop                     \1----3----4----5----6

更新 #3:

我仔细查看了 gitk,发现直到提交 1,所有提交都同时发生在 'develop' 分支和 'master' 分支。

感谢 SimoneDemoGentili 指出我错误使用了 git checkout develop

P.S.: 提交 1 和 2 对我来说也是个谜,因为提交 2 实际上是对提交 1 的修改(据我所知,我使用了这个 建议


你的提交3似乎确实是合并的结果...?请注意,你的分支实际上指向一个提交(很可能提交3是你的主分支,HEAD是你的开发分支),所以像你这样写是误导的。你的提交1和2实际上在两个分支中都存在。$ gitk --all可以帮助你了解你的分支是什么样子的。此外,快进不涉及像这样分叉的分支,只涉及一个分支追赶另一个分支。 - François
@SimoneDemoGentili:没有,我只是执行了 git branch develop - Hans
如果您运行“git branch”命令,那会怎么样?我认为您没有develop分支。 - sensorario
你说所有的提交都发生在开发分支和主分支上,这是非常困难的事情。更有可能的情况是它们被快进合并了。你可以向我们展示 git reflog 的输出 - 这将告诉我们大部分发生的故事。 - wadesworld
@wadesworld: 我决定在另一个堆栈的问题中询问这个问题:(http://stackoverflow.com/questions/11157479/how-does-one-split-a-branch-from-master)。 - Hans
显示剩余5条评论
1个回答

2

分支

Git分支只是指向特定提交的可移动指针。提交本身没有任何与分支相关的属性。如果提交是分支指针所附加的提交的祖先,则Git会将提交显示为属于某个分支。

假设您有以下历史记录:

     4 <- A
     |\
     | \
     2  3 <- B
     | /
     |/
     1
     |
     0

然后,由于所有提交都是提交4的祖先,所以所有提交都在分支A上。但只有0、1和3在分支B上,因为这些提交是提交3的历史记录。
快进合并是指可以简单地将一个分支指针移动到新的提交位置而不会丢失历史记录的合并。这种情况发生在目标提交是当前分支指向的提交的后继时。在上面的例子中,分支A可以被快进合并到分支B上,因为提交4是提交3的后继。在此合并之后,B也会像A一样指向提交4。以下历史记录显示了一个非快进合并的示例:
A -> 2  3 <- B
     | /
     |/
     1
     |
     0

在这里,B不能移动到提交2,因为这样提交3将从历史记录中消失。为了解决这个问题,必须创建一个真正的2和3之间的合并,从而导致以下历史记录:

     4 <- B
     |\
     | \
A -> 2  3
     | /
     |/
     1
     |
     0

谢谢,这比git文档中给出的解释更清晰。 - Hans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接