很多次我听说过在Git或Mercurial中保留线性历史记录。这实际上意味着什么?有人能给我提供一个简单的例子吗?线性历史在修订控制中意味着什么?
3
A
回答
1
TL; DR - 在直线状的源控制,每改变必须在其他之后进行。在非线性源代码控制中,可以在任何点同时进行代码更改并合并到主线。
如果源代码控制你的代码有一个线性的历史,这意味着在代码中的每个提交的更改是一前一后制成。把它看成是代码变化长,单链,这样的:
[A]---->[B]---->[C]---->[D]
*
的*
表示HEAD
。
使用这种方法,您必须始终使用最新的代码,所以如果您使用的是[B]
,并且您正在进行最终将提交[D]
的更改,则需要从存储库中提取从[C]
获取更改以便无冲突地推送您的代码。
但是,GIT中让你branch
你的代码,这样你就可以在代码的多个版本一次。比方说,这是怎么了你的提交历史至今:
[A]---->[B]
*
现在假设你想做出一些改变,但你不想打扰[B]
。 (也许其他人正在同时处理这些代码,谁知道呢?)在Git中,您可以使用branch
来处理您自己的当前代码版本。这是混帐的基石:多的人可以在同一个文件上工作,而不会覆盖彼此的更改。与严格线性历史的源代码控制相比,这是一个巨大的优势,代码碰撞更麻烦。
不管怎样,回到例子。您创建一个新的分支,而其他人继续将更改推送到原始的master
分支。
[A]---->[B]
\
[E]
*
比方说,他们做两次提交,[C]
和[D]
当你对你自己的分支:
[A]---->[B]---->[C]---->[D]
\
[E]
*
现在,这不要紧,他们在做什么,因为在您的分支,你有你自己的代码的副本,你可以随意做任何你想做的事情。所以,您在您的分支两次提交,[F]
和[G]
:
[A]---->[B]---->[C]---->[D]
\
[E]---->[F]---->[G]
*
测试更改后,你决定它的不够好,合并到master
:
*
[A]---->[B]---->[C]---->[D]---->[H]
\ /
[E]---->[F]---->[G]
这基本上是如何非线性源代码管理工作。你可以看到很多人很容易在不踩脚趾的情况下完成相同的代码。现在,如果两个人在同一文件的工作,仍然会有合并冲突,但Git有一个叫做git-merge
极好的工具,有利于合并在同一个文件中的两个人的并发修改。
相关问题
- 1. /(斜线)在CSS中意味着什么?
- 2. 是什么| 1意味着泊坞历史
- 3. 什么是“安全性:?IsTrusted”在Java控制台意味着
- 4. 修订历史和修订
- 5. 在AngularJS中结尾意味着什么double意味着
- 6. StackOverflowError在Java中意味着什么?它的修复是什么?
- 7. 什么%*%意味着R中
- 8. 什么呢##意味着在$ {}
- 9. 什么===在PHP意味着
- 10. 什么。意味着在PHP?
- 11. “...:”在Ipython控制台anaconda中意味着什么?
- 12. “RTMREL”在软件版本控制中意味着什么?
- 13. “public api”在语义版本控制中意味着什么?
- 14. 这个警告在corona sdk控制台中意味着什么?
- 15. 这是什么logcat线意味着
- 16. 不变属性意味着什么?
- 17. 这意味着什么可扩展性?
- 18. 什么是“U”意味着“性别”值?
- 19. 从修订历史
- 20. 在线程间共享对象的性能意味着什么?
- 21. 〜=是什么。在Stata意味着什么?
- 22. BigInteger无限制意味着什么?
- 23. ImageIO中控制缓存意味着什么
- 24. void **意味着什么
- 25. PREEMPTIVE_XE_DISPATCHER这意味着什么?
- 26. Field.Index.NOT_ANALYZED_NO_NORMS意味着什么
- 27. HttpServletResponse.SC_BAD_REQUEST意味着什么?
- 28. Solr意味着什么?
- 29. 溢出意味着什么?
- 30. * | *这意味着什么CSS?
你可以通过'git-rebase'使用git实现线性历史记录 –
这个答案使得它听起来像分支一样,现代版本控制系统与线性历史的概念有某种不相容的地方。更重要的是,它混合了实际时间的概念(在Git中基本上不相关)和提交之间的父子关系(它定义了Git提交的实际排序)。 – user1643723