Git常用命令
目录
1.0 常用Git命令
根据日常使用的git代码的作用范围,可将常用的git命令分为三个大类。灵活的使用这些常见的命令,搭建完善且健全的项目管理结构,不仅可以节约开发时间,避免冲突风险,而且可以做到多项任务同步运行,开发维护两不误。
1.1 本地代码管理
git branch //列出本地所有分支
git add . //将所有修改提交到暂存区
git commit -m [message] //将暂存区的代码提交到当前分支,并为此次保存提供描述
git checkout [branch] //切换到已有分支,并更新工作区(注:如有未提交内容,切换失败)
git checkout -b [new-branch] //复制当前分支到一个新分支,并切换到该新分支
git branch -d [branch] //删除本地分支(注:需要在非删除分支下)
git branch -D [branch] //强制删除本地分支(注:需要在非删除分支下)
本地分支管理是实现多项任务同步运行的基础,在一个健全的项目管理结构中,一个功能就意味着一个分支。建立一个新的分支可以用来开发新功能,合并代码,修改Bug。。。同样,删除冗余的,过期的,已发布的分支则会让你的管理结构简洁明了,更加高效的对分支进行操作。
1.2 与远端代码的交互
git branch -r //列出远程所有分支
git branch -a //列出本地和远程所有分支
git clone [url] //将远程项目拉到本地
git fetch origin [a]:[b] //从远程origin仓库的a分支下载到本地并新建一个分支b
git pull origin [a]:[b] //取回远程origin仓库中的a分支的更新,再与本地b分支合并
git push origin [a]:[b] //将本地的a分支提交到远程origin仓库的b分支(没有会自动新建)
git push origin :[b] //删除远程b分支(将本地的空分支提交到远程origin仓库的b分支)
git push origin --force //强行推送当前分支到远程仓库
与远端代码的交互是实现多人开发的基础,在有些项目中,不止一个开发人员。不同的开发人员在对同一个平台进行开发,如果不增加一个远程仓库作为汇总,势必会出现代码重复,代码冲突等问题。所以,如果要想顺利的进行任务的分配与整合,合理的远端分支也是必不可少的一部分。
1.3 代码的合并与冲突的解决
git merge [a] //将本地分支a的代码合并到当前分支
git log //显示当前分支的版本历史 git reflog //显示所有分支的操作记录(包括被删除的)
git reset --hard //重置暂存区与工作区,与上一次commit保持一致
git reset --hard [commit] //通过查询历史,获取commit版本号,回退到指定版本(撤销需要git reflog)
git revert -n [commit] //通过查询历史,获取commit版本号,复制指定版本为一个新的版本
代码的合并与冲突的解决是实现多人开发与多项同步任务运行的必要过程。如果开发人员都有养成良好的开发习惯,那么,项目合并只需要git merge,git add,git commit,git push等几个简单的命令即可,但如果代码分支管理不规范,导致项目冲突过多甚至是打包报错严重,那么就需要开发者通过查询历史来达到回退的目的,保证项目的正常运行。
2.0 常见开发场景
人员配置: 负责人A、现场开发者B、远程开发者C
功能需求: 功能a、功能b、功能c、
注:[xxx]是指自定义命名,小写为本地分支,大写为远端分支,名字都不定。[base]指代基础分支,指的是正常使用的代码,前期多为敲定的模板,后期指的是生产环境代码
场景一:代码拉取
负责人A开发完项目的初始代码,所有开发者需要获得此代码并在该代码的基础上开发功能。
实施步骤:
1、负责人A登录git网站http://xxxx.com/,点击右上角的New project按钮,根据提示建立新的项目。
2、负责人A点击项目列表进入项目,获取项目在git上的地址。
- HTTPS:不管是谁,拿到url随便clone,但是在push的时候需要验证用户名和密码;
- SSH:clone的项目你必须是拥有者或者管理员,而且需要在clone前添加SSH Key。SSH 在push的时候,是不需要输入用户名的,如果配置SSH key的时候设置了密码,则需要输入密码的,否则直接是不需要输入密码的。
3、负责人A在本地建立项目文件夹,通过下面的命令将代码推送至远端分支。
git clone [url] //拉取远程项目
git checkout -b [xxx] //建立自己的分支 然后将本地代码复制粘贴至项目文件夹下
git add . git commit -m 'xxxxxxx' //将修改提交
git push origin [xxx]:A //将代码提交到远端A分支下
4、负责人A点击项目侧边栏的成员按钮添加开发人员,并将地址和要拉取的分支通知其他开发者。
5、开发者B、C,通过下面的命令拉取代码。
git clone [url] //拉取远程项目
git fetch origin A:[xxx] //将代码A拉到自己建立的分支
git add . git commit -m 'xxxxxxx' //将代码提交
git push origin [xxx]:[XXX] //将自己的xxx分支提交到远端的一个新建的XXX分支下
场景二:功能并行开发
A开发功能a,B开发功能b,C开发功能c。
实施步骤:
1、A通过下面的命令,在功能分支上开发功能a。
git fetch origin [base]:[aaa] //将远程origin仓库的基础分支下载到本地并新建一个新的分支
git checkout [aaa] //切换到功能分支进行开发
git add . git commit -m '功能a的xx模块' //将开发进度提交
git push origin [aaa]:[AAA] //将自己的aaa功能分支提交到远端的一个新建的AAA分支下
2、B和C相同的步骤。
场景三:代码分支合并
负责人A合并自己的分支aaa,B的分支BBB与C的分支CCC,部署一版用于测试
实施步骤:
1、A通过下面的命令合并分支。
git fetch origin [base]:[kkk] //将远程origin仓库的基础分支下载到本地并新建一个合并分支[kkk]
git fetch origin [BBB]:[bbb] //将远程origin仓库的BBB分支下载到本地并新建一个分支[bbb]
git fetch origin [CCC]:[ccc] //将远程origin仓库的CCC分支下载到本地并新建一个分支[ccc]
git checkout [kkk] //切换到合并分支进行合并(先提交自己修改,否则切换不了)
git merge [aaa] //合并本地分支aaa。(如果有冲突,解决冲突并进行下两步,否则跳过下两步)
git add . git commit -m '合并分支aaa' //将合并提交 git merge [ccc] //合并本地分支bbb。(如果有冲突,解决冲突并进行下两步,否则跳过下两步)
git add . git commit -m '合并分支bbb' //将合并提交
git merge [ccc] //合并本地分支ccc。(如果有冲突,解决冲突并进行下两步,否则跳过下两步)
git add . git commit -m '合并分支ccc' //将合并提交(如果有冲突修改) 运行打包命令。打包部署。确定没问题后进行下边步骤,否则开发者提交修改,负责人重复上边步骤,继续合并
git checkout [aaa] //返回自己开发的功能分支
git branch -D [bbb] git branch -D [ccc] git branch -D [kkk] //只是用于合并,所以部署没问题后直接删除
场景四:代码部署
a,b功能测试通过,用户提出将a,b功能部署生产
实施步骤:
1、A通过下面的命令合并分支。
git fetch origin [base]:[jjj] //将远程origin仓库的基础分支下载到本地并新建一个合并分支[jjj]
git fetch origin [BBB]:[bbb] //将远程origin仓库的BBB分支下载到本地并新建一个分支[bbb]
git checkout [jjj] //切换到合并分支进行合并(先提交自己修改,否则切换不了)
git merge [aaa] //合并本地分支aaa。(如果有冲突,解决冲突并进行下两步,否则跳过下两步)
git add . git commit -m '合并分支aaa' //将合并提交
git merge [ccc] //合并本地分支bbb。(如果有冲突,解决冲突并进行下两步,否则跳过下两步)
git add . git commit -m '合并分支bbb' //将合并提交 运行打包命令。打包部署。
git push origin [jjj]:[JJJ] //将这版生产环境部署的代码,推送到远端分支,最好分支名能辨认出是什么时候的生产环境
git checkout [aaa] //返回自己开发的功能分支
git branch -D [bbb] git branch -D [jjj] //只是用于合并,所以部署后直接删除
场景五:新功能开发
生产部署后,A和B开发新功能,C继续开发原有功能
实施步骤:
1、A和B只需要按照场景二即可
2、对于C或者其他一些没有上线的功能分支,一定要更新功能分支,来确保之后上线对自己开发功能的影响
git pull origin [JJJ]:[ccc] //将远程origin仓库中新的基础分支,与本地ccc分支合并 或者 git fetch origin [JJJ]:[jjj] git merge [jjj] //等价
场景六:代码冲突回滚
负责人A合并C的代码发现大量报错,需要C重新修改。
实施步骤:
1、负责人A在合并操作后,发现大量报错
git merge [ccc] //然后大量报错 git reset --hard //直接放弃本次合并 git log //查看历史确认一下
场景七:BUG紧急部署
** 生产环境出现BUG,需要立刻修改,紧急部署。**
实施步骤:
1、提交手中的工作,将生产环境代码拉取到新的分支,修改后视情况部署
git add . git commit -m 'XXXXX' //提交手中的工作
git fetch origin [base]:[ggg] //获取当前生产环境代码到新建的BUG分支
git checkout [ggg] //跳转到BUG分支 //然后修改代码
git add . git commit -m 'XXXBUG修改' //改动量大的部署UAT测试后,没问题后部署生产 //改动小直接部署生产
git push origin [ggg]:[base] //将改动推送到远端的基础分支上
2、然后通知生产环境改动,测试者开始测试,开发者更新一下基础分支
场景八:代码回滚
用户觉得功能b不如原来好用,希望删除功能b。
实施步骤:
1、方法一:还原代码至未合并b的时候,重新合并除b功能以外的代码
git log //查看提交历史
git reset --hard [commit] //适用于B功能刚部署 指令后面是版本号,用git log查看
git revert -n [commit] //适用于b功能早就部署 还原后重新合并功能