Git作为一个版本工具,现在为大多数公司的技术团队用于代码的版本控制,对其的掌握十分重要,这篇博文旨在从git在工作中的应用场景上做一些基本的介绍,以供公司git新人参考,快速上手。
Git一般分为远程数据库和本地数据库两种,从团队编程角度来看,本地数据库为个人开发所有,当个人的编码任务完成后,可将代码上传到远程数据库为团队共享。
在Git管理中,实际操作的并不是数据库,而是工作树,下图是git管理的一个简单示意图。
在数据库和工作树之间有索引,索引是为了向数据库提交作准备的区域,最终保存在数据库里的是索引的状态,可以避免工作树中不必要的文件提交,到达灵活操作修改的功能。
话不多说,教程开始。
使用git,首先就得创建git仓库(数据库)。
命令:gitconfig –-global user.name “用户名” (配置全局用户名)
命令:gitconfig –-global user.email “用户邮箱” (配置全局用户邮箱)
命令:gitinit (在所在目录创建一个git仓库)
建立git 仓库后,我们通常有两种场景,一种是项目为空,团队所有人一切从头开始;另一种则是中途加入项目,要从已有的代码上进行开发。
1. 场景:从头开发
在目录中编辑任何文档后,将所做修改上传到远端服务器,以供团队共享。
命令: git add . (将工作树中所做修改加入到索引)
命令: git commit -m “本次提交修改的说明描述”(将所做修改加入到)
命令: git remote add <主机名:origin> <远程地址: https://github.com/xiaoyangkuaipao/simplest-redux-example >(添加远程仓库)
命令: git push <主机名 : origin> <分支名:master>(上传代码至远程仓库)
2. 场景:中途开发
先从远程仓库中获取代码后,再编写代码。
命令: git clone<远程地址: https://github.com/xiaoyangkuaipao/simplest-redux-example> <本地目录:gitTest>(克隆远程仓库到本地)
注意: git默认的远程分支是master,故而如果远程仓库没有master分支,不能直接使用git clone ,而应该使用git clone -b <远程分支名>
获得代码后,我们就可以使用git来管理与其他同事一起编写的代码。
1. 场景:获取新的远程代码前,本地代码的管理方式
⑴ 代码阶段性完成,可使用commit提交本地当前状态
命令: git add .
命令: git commit -m “...”
命令: git pull <远程分支名> <本地分支名>(若两者同名可省略)
⑵ 代码处于不稳定状态,使用stash暂存本地当前状态
命令: git stash
命令: git pull <远程分支名> <本地分支名>(若两者同名可省略)
命令: git stash pop(应用最新stash)
或
命令: git stash list
命令: git stash apply stash@{num} (多次stash,应用时可指定stash版本)
命令: git stash clear(清空stash)
两者的区别就在于,多次使用commit提交不成熟代码,会造成log的冗余,而stash不会再log中显示,但多次stash会使本地代码在回滚时,产生错乱,因此,应该合理使用者两种方式。
2. 场景:获取不同分支的代码
⑴使用merge合并新的代码
命令: git checkout feature
命令: git merge master
这样就可以将master分支合并到feature分支中,并在feature上产生新的commit,并在log中保存master合并的历史,过多的合并会造成分支历史的污染。
⑵使用rebase合并新的代码
命令: git checkout feature
命令: git rebase master
这样同样可以将master分支合并到feature分支中,但不会在feature上产生新的commit,以及不会再log中保存master合并的历史,从而造成分支历史的污染,但这种合并方式忽略了合并的信息,会给代码回溯造成影响。
两者的差异图示
⑶ 使用cherry -pick获取指定commit中的提交
开发过程中,如果仅仅只需要某一次提交中的代码热更新到测试中时,使用cherry -pick是最合适的。
命令:git cherry-pick
3. 场景: 回退至某次代码提交的commit
(1) 使用git revert撤销某次commit,保留此次操作前其他的commit,并产生一个新的commit来覆盖撤销的commit
命令: git revert
(2) 使用git reset回退至某次commit,此次操作前其他的commit会被移除
命令: git reset