我们希望在git上具有每个开发人员分支。换句话说,开发人员可以从“开发”分支中分支出来,并创建自己的本地“功能”分支来进行工作。
当他们对工作感到满意时,可以交换到devel
,确保它们具有最新文件,然后合并到其“功能”分支中,并在处理任何冲突后将结果推送到原始位置。
但是,有一个问题-这会使提交历史变得非常混乱。
如果您执行git log --graph
,则不会出现“功能”分支。但是,开发人员进行的每一次提交现在都显示在devel
分支上。太丑了如果有10个开发人员,并且每个开发人员在全部合并到devel中之前对他们的功能分支进行了30次提交,那么devel现在将显示180次提交的历史,总共6个功能。如果历史记录仅显示6个消息合并为devel,那就更好了。
是否有某种方法可以避免合并时使历史变得“混乱”并在合并时忽略本地分支的历史?还是这只是在与git斗争太多?
我意识到这听起来很奇怪,但是它们非常不喜欢所有对象最终存储在远程仓库中的想法。
答案 0 :(得分:5)
正如您的团队所观察到的那样,如果您习惯将第一稿工作与所有最初的错误,笨拙的组织以及几乎足够好的实验和修补程序合并在一起,那么您的历史将是一场可怕的沼泽恐怖。
不要那样做。
在本地存储库中进行第一个草稿工作¹。然后完全重写要发布的第一稿历史记录,add_test(NAME run_check_airy_ai COMMAND run_check(check_airy_ai))
是为此推荐的常用命令,但是我发现在git rebase -i
后跟git reset --soft
来创建可复审的内容更为方便。历史,适合公众消费的历史。然后将其完全改编,以使反馈显而易见,并发布/合并干净的结果。
对于开发人员来说,第一个草稿提交系列对其他人没有什么用,只是读出他们的编辑器撤消缓冲区历史记录。实际上,这就是Git初稿的本质:一个项目范围的编辑器撤消缓冲区,带有注释以帮助解决下周不可避免的“我在想什么”?问题。没有其他人需要看那些。它们是您书桌上的笔记,工作产品,注定是出生时的垃圾桶。
¹最好有一个沼泽回购,开发人员可以在其中发送WIP内容以进行可见性和协作,重要的是不要将WIP历史记录视为可丢弃的便笺,无论谁拥有副本。您如何管理它们与如何管理已投入生产的任何事物都非常不同
答案 1 :(得分:3)
如果您执行
git log
,则不会显示“功能”分支。但是,开发人员现在所做的每个提交都会显示在devel分支上。
git log
默认情况下为您显示简单和错误的线性历史记录。 git历史不是线性的。分支机构真的是分支机构。
代替这个...
A - B - C - D - E - F - G - H [devel]
您的历史确实如此。
A ---------- E ----- H [devel]
\ / \ /
B - C - D F - G
您可以使用git log --graph
或Gitup之类的Git可视化工具查看此内容。
每个“功能泡泡”都是来自每个分支的提交。使用真实的历史记录,您可以看到作为一项功能的一部分开发了哪些提交。尽管这看起来有些“混乱”,但这对于理解代码很重要。它与git blame
一起特别有用。
在合并时是否有某种方法可以避免使历史变得“混乱”并忽略本地分支的历史?还是这只是与git斗争太多?
我的建议是习惯它,并学习如何导航。例如,git log --merges
仅显示合并提交。一个好的Git可视化工具会有所帮助。
另一种方法是鼓励开发人员在提交之前清理其分支。如果您有很多提交是“ typo fix”,“ oops”和“ broke the tests”的提交,那么这些提交就毫无价值。 They can use git commit --amend
to change the previous commit, and git rebase -i
"fixup" to merge existing commits together。这样可以确保所有提交都具有某种后果。
如果确实愿意,可以进行“壁球合并”,git merge --squash
。与其保留完整的提交历史记录,不如将分支中的所有更改和所有提交消息粉碎为一次提交。
虽然这会产生“干净的”历史记录,但会丢失许多有关代码如何开发的详细信息。例如,如果分支中有30个提交,而您执行git blame
来了解一些代码,则将获得所有30个提交的提交消息,而无法知道哪一个适用于该代码。>
您所看到的“混乱”是对为什么以这种方式编写代码的宝贵见解。这是 金 ,适用于处理所有代码的人。一旦砸在一起,就永远无法恢复。
答案 2 :(得分:0)
在合并时是否有某种方法可以避免使历史变得“混乱”并忽略本地分支的历史?还是这只是与git斗争太多?
绝对。简单地说,不要合并任何内容。有一个公共存储库,您可以在其中单独选择提交内容。一种方法是通过Gerrit这样的评论系统。
采摘樱桃可以确保您的历史记录清晰,线性,而不会合并混乱。
但是,获取单独的更改很重要:即,如果开发功能需要15次提交,则应记录15次提交。出于各种原因,这很重要。一是多个较小的提交使使用git bisect
来查找和隔离错误更加容易。如果牵涉到更改单行的小提交是导致回归的原因,那么与包含三百次更改的提交牵涉到相同的回归相比,这更容易弄清楚。
应该鼓励的是开发人员在合并之前清理其功能分支。例如,没有仅能修复琐碎的编译器错误的提交(“ parse_descriptor
中的分号,哎呀!”)。或者提交那些最初只是由相同功能开发弄乱的“清理”代码。
也不建议将“主题外”提交给功能分支。
要采用的一个好的规则是每次提交都应该建立;任何提交都不应破坏任何需要后续提交的内容。这样的提交应该一起压缩。
每个人都应该了解如何使用git
的交互式知识库来重新排序,压缩和更正提交。