对Git使用的一些基础介绍。
常用术语
首先让我们来对Git使用遇到的一些常用术语有个认识。
- 集中式:有一台专门的服务器作为版本库,其他人要上传更新代码都得先经过它才能进行。
- 分布式:每个人的电脑都有一个自己的版本库,不需联网就能本地进行代码版本管理。
- 工作区(Workspace):项目实际存放的目录。
- 仓库区(Repository):项目下的.git目录,一个本地的版本管理仓库。
- 暂存区(Index/Stage):一个缓存区用于保存临时的改动,.git目录下有个index用来记录这些信息。
- HEAD:指示当前分支的最后一次commit的节点。
- 远程仓库(Remote):专门的服务器来保存代码库,比如GitHub,GitLab。
- 拉取(Pull):将远程版本库合并到本地版本库,相当于(Fetch+Merge)
- 获取(Fetch):从远程版本库获得最新版本。
- 合并(Merge):将两个分支代码进行合并操作。
- 添加(Add): 将修改内容添加到暂存区中。
- 提交(Commit):将所做的更改,提交到HEAD。
- 推送(Push):将所做的更改,存入远程版本库。
- 同步(Pull+Push):先将远程库拉取,再将本地库推送到远程库,相当于(Pull+Push)。
- 分支(Branch):一条新的版本记录线,有一个新的指针指向分支节点。
- 检出(Checkout):改变HEAD指向,可以用来切换分支或者检出某次提交恢复到工作区修改前的内容。
- 重置(Reset):可重置HEAD到暂存区和工作区或者重置暂存区或者重置工作区等。
- 还原(Revert):新增一个commit用来还原到指定的commit,替换后者的修改变化。
- 衍合/变基(Rebase):将某次提交后的所有提交按照需要应用到指定提交上。
- 标签(tag):相当于给commit的id(一串SHA-1值)取个别名,对于里程碑的提交节点进行标记,方便寻找。
基本概念
其次,我们需要对版本工具遇到的一些容易混淆的概念进行理解。
- 与传统版本控制工具区别
传统的CVS及SVN都是集中式的版本控制系统,而Git是分布式的,相当于每个人本地都有一份完整的版本库备份,更加安全,还可进行离线版本控制最后统一推送。Git把内容按元数据方式存储,最小控制单位是提交,直接记录快照,Git只做增加操作即使是删除文件也是进行标志增加一个记录而非直接删除文件内容;而SVN是按文件进行存储,进行差异比较。Git的分支、撤销、重置等功能都相当于对改变当前HEAD指向的提交,所以速度很快,而SVN的分支功能相当于另外备份整个项目文件,所以基本没什么用。 - 文件状态
- untracked:未添加。在仓库目录刚创建的尚未添加至 repo 的文件状态即是 untracked。也可以把已存在于 repo 中的文件从中删去,这时文件的状态也会回到了 untracked。
- unmodified:新文件添加进来后并没有对照的历史版本,状态即 unmodified。
- modified:unmodified 的文件发生修改、变动后其状态会改变为 modified。
- staged:暂存状态。通过 add 命令记录待提交的文件,文件的状态会变味暂存状态。
- commited:暂存文件提交后其状态即是 commited,当然也是 unmodified。
- 分支管理
不同项目不同团队可按照具体的实际的开发过程进行自行创建分支并进行管理。- Master分支:默认分支,可用于发布生产版本。每次发布后,可用git tag进行标记。
- Dev分支:开发分支,日常的开发活动在此分支进行。
- Test分支:测试分支,用于发布测试环境的版本。
- Feature分支:用于重大功能开发。
- reset、revert、checkout区别
命令\作用对象 | 文件 | commit |
---|---|---|
reset | 清除文件的未提交改动 | 丢弃私有分支中某次提交之后的所有提交,或者丢失未提交的改动 |
checkout | 放弃工作目录中的所有改动 | 切换分支,或者检出某个版本的文件快照 |
revert | 将公共分支的代码强制覆盖为某个版本的代码 |
- Revert:将指定的历史commit版本反转,会生成一次新的提交,并作为最新版本提交,期间的所有commit保留在版本库中。
- Reset:从版本库中删除该历史commit以后的所有commit。
当合并出现冲突,如果要撤销到未合并的状态,使用reset命令,不能用revert。
- rebase、merge区别
如图5,假设master分支也提交了一个快照C3,同时有个experiment分支在C2快照后提交了一个新的快照C4,使用git checkout master;git merge experiment
会将把两个分支的最新快照(C3?和?C4)以及二者最近的共同祖先(C2)进行三方合并,合并的结果是生成一个新的快照(并提交),如图6。
而使用git checkout experiment;git rebase master
可将提交到某一分支上的所有修改都移至另一分支上,如图7。最后再使用{git checkout master;git merge experiment}进行一次快进合并,这样最终的分支树(版本历史)即看起来就清晰明了。
rebase 和 merge的另一个区别是rebase 的冲突是一个一个解决。
常用操作
接着,介绍一下使用git命令的一些基本操作流程。
- 创建一个新项目的仓库
- 本地已有项目,上传到远程仓库
- 本地已有仓库,修改要推送的远程仓库
- 多人协作开发,同步代码过程
- 合并dev分支到master分支,发布生产版本代码
- 代码撤销或回滚
- 使用stash缓存提交
使用IDE插件和图形化工具
使用IDEA git插件
- clone项目
- 提交代码并推送到远端仓库
- 由于本地代码不是最新版本推送失败,需要拉取代码进行合并解决冲突后再重新提交并推送,要使用rebase方式来进行拉取,方便版本历史查看。
- 切换分支、合并分支、撤销合并
- 使用rebase将当前分支的快照变基到选择的分支的快照之后(相当于将另一个分支的修改合并到当前分支,并且保持版本树的清晰)
变基前
变基后 - 切换分支,并将当前分支的快照变基到目标分支之后
变基前
变基后
使用Visual Studio git插件
- clone项目
- 拉取代码、解决冲突后重新提交并推送代码
- 切换分支、合并分支
使用TortoiseGit图形化工具
- 拉取代码、提交并推送代码
- 切换分支、合并分支、撤销提交
其他
.gitignore忽略文件使用
提交代码时有一些文件例如日志、临时文件、本地IDE配置文件、编译生成的中间文件、可执行文件等等没必要放到版本库中,可以在工作区中新建一个.gitignore文件,把要忽略的文件名填进去,提交代码时git就会忽略这些文件。不同类型项目的忽略文件模板可在https://github.com/github/gitignore这个链接上面下载,具体的忽略文件的语法规则可自行搜索。
.gitattributes 属性文件
可对特定的路径配置某些设置项。一个典型的用法是如果dev分支和master分支有一些config配置文件内容分别为开发环境和生产环境。每次合并dev分支到master分支的时候会出现冲突,此时可在master分支下新增.gitattributes文件,指定特定的文件合并分支时不进行合并,例如.gitattributes merge=ours、src/main/resources/jdbc.properties merge=ours指定.gitattributes本身文件合并策略为冲突时以当前分支的为准,配置完设置项后还需要执行git?config?merge.ours.driver?true命令启动设置项。以后在master分支下合并dev分支的代码时就不会合并那些文件。
参考资料
- git官方中文资料
- 廖雪峰的Git教程
- 阮一峰的常用Git命令清单
- Kxxoling的Git入门
- Git忽略提交规则
- Git撤销&回滚操作
- Git rebase&merge区别
- visual studio git插件使用
- TortoiseGit工具使用
原文地址:https://www.cnblogs.com/universal/p/10420221.html