Git 分支管理 https://www.ibm.com/developerworks/cn/java/j-lo-git-mange/index.html
大方向上分为两组: 一组是开源项目用到的管理方式,另一组是恰饭的业务项目用到的管理方式。
开源项目(个人理解就是带版本号,旧版本还需要维护的项目)
单主干(Trunk-based development,TBD)
google和facebook都在用
特点:所有团队成员都在单个主干分支上进行开发。从主干上拉分支作为发布分支
图片来自https://www.ibm.com/developerworks/cn/java/j-lo-git-mange/index.html
业务项目(线上版本号不断更新,旧版本不需要维护)
GitHub flow
一种比较简单的流程,也是目前我们公司在用的。只使用两类分支,并依托于GitHub的pull request功能(在gitlab里是merge request)。在Github flow中,master分支中包含稳定的代码,以提供稳定可靠的代码基础,任何开发人员都不允许把未测试或未审查的代码直接提交到master分支上,该分支已经或即将被部署到生产环境。
任何代码修改,都要从master创建一个新的分支,新分支的名称应该简单清晰的描述该分支的作用。所有相关代码的更改都在新分支中进行。开发人员可以自由提交代码和push到远程仓库。
当新分支的代码都完成后, 通过github/gitlab提交一个新的pull request/merge request。团队其他人员会对代码进行审查,提出意见。然后有持续集成服务器(如 jenkins)对新分支进行自动化测试。当代码通过自动化测试和代码审查之后,该分支对代码被合并到master分支。再从master分支部署到生产环境。
图片来自https://www.ibm.com/developerworks/cn/java/j-lo-git-mange/index.html
GitHub flow 要求项目有完善的自动化测试、持续集成和部署等相关的基础设施。每个新分支都需要测试和部署,如果这些不能自动化进行,会增加开发人员的工作量,导致无法有效地实施该流程。这种分支实践也要求团队有代码审查的相应流程。
git-flow
git-flow 围绕的核心概念是版本发布(release)。因此 git-flow 适用于有较长版本发布周期的项目。有很大数量的项目的发布周期是几个星期甚至几个月。较长的发布周期可能是由于非技术相关的因素造成的,比如人员限制、管理层决策和市场营销策略等。
git-flow流程中包含5类分支,分别是master、develop、feature、 release、hotfix。
master分支中包含的是可以部署到生产环境的代码。develop分支中包含的是下个版本需要发布的内容。从某种意义上说,develop是一个进行代码集成的分支。当develop分支集成了足够的新功能和代码修复后,通过一个发布流程来完成新版本的发布。发布完成后,develop分支的代码会合并到master中。其他三类分支只在需要时从develop或master分支创建。在完成之后合并到develop或master分支。完成合并后该分支被删除。
前一家公司的方式??
感觉是git-flow和github flow的合并款: 直接从master上拉分支(类似github flow)开发测试完成后,通过一个发布流程来完成新版本的发布。发布完成后,该分支代码被合并到master中(类似git-flow)
git 命令
git pull
git pull <远程仓库名> <远程分支名>:<本地分支名>
不写 :<本地分支名> → 默认当前分支
pull代码覆盖到你本地分支上,如果本地分支上修改了文件,远程分支上也同时修改了,有冲突的时候没merge,就会rejected
与git fetch的区别 : git fetch 只是把远程拉下来, 没有自动merge, diff的会看到不同,需要手动merge
git push
git push <远程仓库名> <本地分支名>:<远程分支名>
//不写本地分支名 ➡️ git push origin :master 表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。
?
1)删除远程分支 git push origin :远程分支名
2) 远程分支迁移到本地 git checkout xx origin/xx
3) 远程分支迁移到本地并替换当前所在分支 git checkout -b xx origin/xx
4) 分支图 git log graph
5)禁用fast forword合并分支 git merge —no-ff -m “xxx” (在合并分支前产生一次commit)
6)查看远程库 git remote / git remote -v
7)回退 git reset —hard HEAD^/HEAD~100
8) 回前 git reflog
9)撤销修改 git checkout — xxx
回滚:
git log 3查看日志(加个数字代表最新三条) 然后找到你要回滚到的commitid (commit后面那串码)
commit 49955b305cfd3801300a46449230ea1477298179 (HEAD -> 20180125_remind_share_TRAVEL-812, origin/20180125_remind_share_TRAVEL-812)
Author: xxxxxxx
Date: Thu Jan 25 16:57:46 2018 +0800
add remindshare
然后
git reset —hard xxxx(commitid)
最后强制提交
git push origin <分之名> —force