向所有人致意,
我一直在研究一个bash脚本作为一个小型夏季项目,以了解有关UNIX脚本和使用git的更多信息。
这是我第一次在git中使用分支,通常我只是坚持使用。
当我注意到我的'develop'分支似乎与'master'合并时,我正在用图形(git log --graph
)查看git日志。像这样:
master ----1--------3----4----5----6----HEAD develop \---2---/
但是提交3以后是在开发分支内完成的。执行git checkout master
和git checkout develop
表明这是真的。
究竟发生了什么?这就是所谓的快速转发吗?
更新#1:
提交1,实际上并不是我的仓库中的第一个提交,它是我在'master'上做的最后一次提交
更新#2:
这是gitk --all
Tag '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的修正(据我所知,我使用了这个advice)
答案 0 :(得分:2)
git branch只是指向特定提交的可移动指针。提交他们自己没有附加任何分支属性。如果提交是附加分支指针的提交的祖先,Git会显示属于分支的提交。
假设您有以下历史记录:
4 <- A
|\
| \
2 3 <- B
| /
|/
1
|
0
然后所有提交都在分支A上,因为所有提交都是提交4的祖先,其中分支A指向。但是只有0,1和3在分支B上,因为这些提交是提交3的历史。
快进合并是合并,其中一个分支的分支指针可以简单地移动到新提交而不会丢失历史记录。当目标提交是分支当前指向的提交的后继时,就是这种情况。在前面的示例中,分支A可以在分支B上进行FF合并,因为提交4是提交3的后继者。在此合并之后B还希望A指向提交4.以下历史记录显示非FF合并的示例:
A -> 2 3 <- B
| /
|/
1
|
0
这里B不能移动到提交2,因为那时提交3将不属于历史记录。要解决此问题,必须创建2到3之间的实际合并,从而产生以下历史记录:
4 <- B
|\
| \
A -> 2 3
| /
|/
1
|
0