本文主要讲解Git的原理以及使用。
文章目录
- 一、 Git原理
- 1.1 Git详解
- 1.2 Git版本控制流程
- 1.3 git回滚及三大区域
- 1.4 初识分支
- 二、Git的使用
- 2.1 基于Github做代码托管
- 2.2 详谈rebase(变基)
- 2.3 beyondcompare软件
- 三、Gitflow工作流
- 3.1 gitflow之初始项目和版本
- 3.2 gitflow之代码review
- 3.3 gitflow之为开源社区贡献代码
- 四、其他知识点补充
- 4.1 git配置文件
- 4.2 git免密登录
- 4.3 git忽略文件
- 4.4 github任务管理
- 4.5 前期出现的bug解决方案
- 4.6 实际案例
- 总结
首先来介绍一下Git的原理。
一、 Git原理
1.1 Git详解
1)没用过git工具的可能不了解git是什么软件,用来做什么的,下面详解git的功能和用途。
2)git是一个分布式版本控制软件,这个解释里面有三个关键字我们来详细说一说;第一个是软件,软件想必大家都了解,就是可以安装在手机或者电脑上运行的工具;第二个是版本控制,这个就需要详细阐述,版本控制是做什么的呢,举例来说就是你在写毕业设计论文的时候会有初稿、终稿、最终稿、死也不改版等,那么这其中的每个版本我们通过拷贝复制,然后修改文件名称再去修改内容,这个就是版本控制。版本控制的软件作用是帮你把文件的多个版本保存下来,你只有一个当前的版本,你在论文版本v3需要以前的论文版本时,你可以通过版本控制软件来恢复以前的论文版本v2,也可以找到v2版本之后再恢复v3版本,接下来说一说版本控制的几种方式。
(1)本地版本控制:以你的毕业设计论文为例,本地版本控制软件会只保留你的一个论文版本,其他版本是软件帮助你保存下来的,如果你要恢复,通过软件即可恢复到原先的版本。
(2)集中式版本控制:集中式版本控制软件会把你的论文版本全部存储到类似于云服务器的地方,你可以从存储的地方获取你想要的版本的论文;集中式版本控制可以完成多人协同的工作,但是如果云服务器不能用了,那么就无法协同工作了,这是它的缺点,从而诞生了下面的版本控制软件。
(3)分布式版本控制: 它克服了集中式版本控制的缺点,分布式版本控制是在每个用户和云服务器都有所有的论文版本,如果云服务器不能使用的情况下几个用户之间仍然可以协同工作,git在做的就是分布式版本控制。
3)安装git,以Windows环境为例,进入Git官网,下载Git的安装包安装即可,安装完成后在终端输入以下命令,如果显示git的版本号即可认为安装成功。
git --version1.2 Git版本控制流程
接下来说一说git做简单版本控制的流程,从简到难来学习git。
1)进入要管理的文件夹;要做版本控制肯定要进入要管理的文件夹,类似于你要管理一个班级的学生必须进入该班级,下面是进入管理文件夹的命令。
cd D:\study\learning2)初始化(提名);初始化的意思类似于你要管理一个班级需要一个提名,相当于宣布以后这个班级归我管理,以下是初始化的命令,执行命令后该文件夹下会有.git文件夹,这是git管理要用的东西。
git init3)管理;在管理之前,有一个命令需要说,在你未管理一个文件之前输入下面的命令文件名为红色,执行后变为绿色,生成版本后执行就看不到这个文件名了,这里是通俗解释专业术语后面会讲,下面是命令。
git status管理的意思类似于你已经管理这个班级了,你可以选择管理哪个人或者管理全部的人,如果你想一个一个添加要管理的人或者一次全部管理起来,执行以下的命令。
git add helloworld.py 一次添加一个文件 git add . 一次添加全部的文件4)生成版本;生成版本相当于是你已经把所有的人都管理起来了,你需要记录当前的版本号,因为后面可能这个班级来了别的人,就和现在班级里的人数和你管理的人数不一样了,执行以下的命令。
git commit -m 'v1' 双引号里面是自定义的字符,用来记录版本号Notes:如果是第一次执行git,执行git commit -m会报错,原因是没有指定用户名和邮箱,用这两个语句指定邮箱和用户名即可。
git config --global user.name "xxxx" git config --global user.email “xx@xx”1.3 git回滚及三大区域
1)回滚作用是用来返回你的论文至以前的版本的,比如你的论文有v1、v2、v3,你现在想在v3版本回滚到v2版本去,那就可以执行以下命令:
git log 找到对应版本的版本号 git reset --hard 版本号 在版本号位置输入对应的版本号2)如果你回到了v2版本再想回到v3版本,此时git log已经无法查看v3版本了,此时就需要以下的命令。
git reflog 找到对应版本的版本号 git reset --hard 版本号 在版本号位置输入对应的版本号
3) 在1.2讲的git做简单版本控制的流程中,讲过修改过的或新添加的文件为红色,它属于工作区的一部分,另一部分是已经管理的版本中的文件,这个部分就是已经管理的当前论文版本存储的区域;绿色的部分为暂存区,大概类似于如果我想锤某人,先冷静一天,我再考虑要不要锤它;版本库就是存储已经管理的文件的版本。
git checkout -- helloworld.py git reset HEAD helloworld.py1.4 初识分支
1)分支:分支的作用是给使用者提供多个环境,意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。
2)开发的主线称为master,其他的分支可以自己命名,一般分离开来开发的成为dev(development的缩写),下面以一个简单的例子通俗易懂的讲解分支的使用和命令;
(1)假设你在你的软件里要新增一个商城的功能,当你开发到50%的时候原先的软件出现了bug需要紧急修复,此时你就必须停下开发商城的功能,修复bug,完成后继续开发商城功能;
(2)假设在dev分支进行商城功能开发,下面是创建dev分支并在其中开发的命令。
git branch 查看当前拥有的分支和目前所处的分支 git branch dev 创建dev分支 git checkout dev 进入dev分支开发(3)软件出现bug后,需要切换到主分支修复bug,同时将其合并到主分支master上,命令如下。
git checkout master 切换回主分支 git branch debug 创建修复bug的分支 git checkout debug 进入debug分支修复bug git checkout master 切换到主分支 git merge debug 合并debug分支到master,假设此时master分支为v6版本 git branch -d debug 删除debug分支(4)回到dev分支,开发完成商城功能,将其合并到master,命令如下。
git checkout dev 切换dev分支,开发商城功能 git checkout master 切换主分支 git merge dev 合并dev分支到master分支Notes:这里可能会存在问题,v6版本和dev合并时,如果两部分存在对同一行代码进行操作,会出现如下的问题
此时的问题就是git不知道以哪个为准,因为同一行代码有两个版本,此时需要自己打开对应的代码手动解决冲突,再提交新的版本即可。
3)开发流的概念;开发流的概念是说我们在进行开发的时候,必须要有两个分支,一个是master(正式分支),另一个是dev(开发分支),所有的开发工作必须在dev分支进行,master分支的必须是稳定版本。
二、Git的使用
2.1 基于Github做代码托管
1)上面的部分已经简单讲解了使用git在本地版本控制,接下来就要讲一讲如果你是要在家里和公司都希望同时开发代码,那就需要有远程的仓库来做代码托管,接下来看一看做代码托管的步骤。
2)创建Github的仓库,给远程仓库起别名,向远程仓库推送代码;
(1)创建Github仓库比较简单,在Github新建一个仓库加上项目名称以及项目描述创建即可;
(2)给远程仓库起别名,在家向远程仓库推送代码;
git remote add origin https://github.com/3255334616/dbhot.git 给远程仓库起别名 git push -u origin 向远程仓库推送代码(3)向远程仓库推送代码后,我们代码有master和dev分支,在家和公司都是在dev分支做开发,因此每次开发前需要拉取代码,切换到dev分支继续开发;现在我们到了公司需要做开发了,先拉取代码,把主分支代码合并到dev分支(只有第一次需要把master合并到dev分支),然后在dev分支开始做开发;
git clone https://github.com/3255334616/dbhot.git 克隆远程仓库代码 git checkout dev 切换dev分支 git merge master 合并master分支到dev分支 写代码继续开发 git add . git commit -m 'xxx' git push origin dev 开发完成提交到远程仓库dev分支(4)回到家后,需要在公司开发的代码基础上继续进行开发;
git checkout dev git pull origin dev 拉取公司开发的代码 开发,写代码 git add . git commit -m 'xxx' git push origin dev(5)最后开发完成,需要上线,也就是把dev分支的代码合并到master分支,并提交到远程仓库;
git checkout master master分支提交到远程仓库 git merge dev git push origin master git checkout dev dev分支提交到远程仓库 git merge master git push origin dev3) 公司写的代码代码忘记推送到仓库;
(1)在2.1的例子基础上,如果在公司开发了代码但是忘记推送到远程仓库了,接下来继续看这个例子;
(2)公司开发后忘记推送到远程仓库,此时回到家中我们继续开发其他的功能;
(3)家里开发完成后把代码推送到仓库,去公司继续开发拉取代码时如果家里开发的部分和前一天开发的部分代码修改了同一行,就会产生冲突,此时需要手动去编辑代码解决冲突,再把代码提交到仓库。
4)接下来说一说git push这个命令,这个命令等价于两条命令;
git push origin devgit fetch origin dev git merge origin/dev可以看到fetch命令是把仓库的代码先拉取到版本库,merge命令是把版本库的代码拉取到工作区,push命令是直接把仓库的代码拉取到工作区。
2.2 详谈rebase(变基)
1)rebase中文称为变基,它的作用是使git的提交记录更加简洁,rebase有三种情况,下面逐条来说;
2)假如老板给你了一个初始代码希望你在此基础上开发新的功能,那么如果你用了一星期开发完成,其中每天都有很多提交版本,那么老板可能希望看到的只有初始版本和最终版本;rebase的第一个作用就是把你当前的版本和在它之前的一些版本合并为一个提交记录,简化git记录的版本。假设现在有v1~v4四个版本,我想要git的提交记录只有初始版本和最终版本,执行如下的代码。
git rrebase -i HEAD~3 HEAD~3意思是合并当前的版本以及之前的两个版本,因为三个版本包含当前版本git rrebase -i dd1f5c28eebb6d79ba667b64d2d501475019f970 这个版本号是v2的,意思是合并v2-v43)假设我现在开发的代码有dev、master分支,原先的merge命令比如合并dev分支,在把dev分支合并到master分支后dev分支仍然还在;但是如果我想去掉dev分支因为已经合并过了,此时就需要用rebase。
现在dev分支开发的功能要加到master分支上,同时去掉dev分支,执行以下的命令,可以看到如下的结果。
git checkout dev git rebase master git checkout master git merge dev git log --graph --pretty=format:"%h %s"
4)前面讲过一个例子,在公司开发的代码忘记提交到远程仓库,回到家后继续开发时发现在公司忘记提交了,因此就开发了一些其他的功能,然后提交到远程仓库,那么第二天到公司继续开发就需要拉取在家开发的代码,此时提交记录会产生分叉;此时就需要使用rebase。
git pull origin dev 会产生分支使用rebase不产生分支的方案:
git fetch origin dev git rebase origin/dev5)接下来讲一下执行rebase产生冲突怎么办,解决方案和merge类似;
vim dev_rebase.py 编辑需要修改产生冲突的代码 git add . git rebase --continue2.3 beyondcompare软件
1)在前面讲merge和rebase时,我们说过如果产生冲突就自己去打开文件自己手动修改解决冲突,那么现在我们就介绍一个软件Beyond Compare,它可以用来解决代码的冲突,无需我们再手动解决。
2)第一步,安装 Beyond Compare;
3)第二步,在git中进行配置;
git config --local merge.tool bc3 # bc3为给解决冲突的工具起的别名 git config --local mergetool.path 'usr/loacl/bin/bocmp' # 路径为beyond compare软件安装的路径 git config --local mergetool.keepBackup false # 不保存备份4)应用beyond compare解决冲突;
git mergetool运行该命令后自动打开beyond compare软件因为代码产生了冲突你就可以使用软件选择代码,选择完成后关闭软件即可。
三、Gitflow工作流
3.1 gitflow之初始项目和版本
1)前面讲的都是在自己在做开发,如果现在需要多人协同开发,那么就需要使用gitflow工作流,接下来讲解初始化项目和版本;
2)创建organization->创建仓库->邀请协同开发的人;
3)创建文件夹,写东北热项目的基础功能代码(这里用的例子和前面的相同给,前面看完这里就会明白,不再详细赘述),把代码提交到给github创建的organization里面创建的仓库中;
4)把代码提交后,代码总是要使用版本号,此时我们可以给每次提交的代码打个标签,这样用标签表示不同的版本代码比版本号高效,命令如下;
git tag -a v1 -m '第一版' # v1是打的标签名字 git push origin --tags # 远程仓库就会有标签了5)代码做开发的时候需要在dev分支,因此需要创建dev分支,以前都是用git branch dev 和 git merge master命令,现在我们只需一行命令就可以创建新的分支并把当前分支的代码拉取到新的分支,命令如下;
git checkout -b dev3.2 gitflow之代码review
1)我们在dev分支要开始做开发,假设我们要在东北热项目的基础上增加斗地主功能,接下来做开发并做代码review;
2)因为做开发也要在新的分支下,所以必须创建新的分支,该分支来自于dev分支(把dev的分支拉取到该新分支,该新分支用于斗地主功能开发),命令如下;
git checkout -b ddz3)开发代码,开发完成后,提交到远程仓库,接下来就是做代码review的重要步骤了,代码review是通过github的pull request来做的;
4)在pull request之后,管理员那边通过,同意将ddz分支合并到dev分支即可完成合并;
3.3 gitflow之为开源社区贡献代码
1)下面讲一下如何为开源社区贡献代码,首先需要Fork源代码(fork的意思就是把该源代码拉取到你的远程仓库中);
2)把改代码拉取到本地做开发,开发完成后提交到自己的远程仓库,接下来向原作者的仓库pull request即可;
四、其他知识点补充
4.1 git配置文件
1)在前面第一章讲git做本地版本控制中,只说了在第一次使用git本地生成版本时commit会报错,只是说了执行几条命令完成配置,接下来我们来详细讲一讲git的配置怎么做;
2)首先是项目的配置文件,项目的配置文件只是在该项目中有效,不影响其他项目的配置文件;
项目的配置文件位置:项目/.git/config
git config --local user.name "xxxx" git config --local user.email "xx@xx"3)全局的配置文件,全局的配置文件全局有效,所有项目都使用该配置;
项目的配置文件位置:项目 ~/.gitconfig
git config --global user.name "xxxx" git config --global user.email "xx@xx"4)系统的配置文件,所有项目都使用系统的配置文件,但是要求用户有root权限;
项目的配置文件位置:项目 /etc/.gitconfig
git config --system user.name "xxxx" git config --system user.email "xx@xx"5)应用场景
git config --local user.name "xxxx" git config --local user.email "xx@xx" git config --local merge.tool bc3 # bc3为给解决冲突的工具起的别名 git config --local mergetool.path 'usr/loacl/bin/bocmp' # 路径为beyond compare软件安装的路径 git config --local mergetool.keepBackup false # 不保存备份 git remote add origin https://github.com/3255334616/dbhot.git # 默认添加在本地配置文件(--local)4.2 git免密登录
1)git的免密登录有三种方式,下面我们来详细说一说免密登录的三种方式;
2)URL免密登录;
git remote add origin https://用户名:密码@github.com/3255334616/dbhot.git git push origin master3)SSH免密登录;
(1)生成公钥和私钥(默认放在 ~/.ssh,id_rsa.puh 为公钥,id_rsa为私钥);
ssh-keygen(2)拷贝公钥的内容并设置到github中;
cat ~/.ssh/id_rsa.pub
(3)在项目中添加git地址;
git remote add git@github.com:ffyorg/dbhot-new.git(4)以后使用直接拉取代码或者提交代码即可;
git push origin master4)git自动管理凭证;Notes:企业用的最多是SSH免密登录;
4.3 git忽略文件
1)git软件可以把文件中的文件全部管理起来,但是很多时候我们希望有一部分比如数据库或者存储分析数据的文档等不做管理,这部分文件不需要管理不需要提交到远程仓库,此时就需要用gitignore文件;
2)在.gitignore文件中写上要忽略的文件和不需要忽略的文件(但是该文件包含在了忽略文件中);
vim .gitignore # 创建.gitignore文件a.h # 忽略a.h b.h # 忽略b.h *.h #忽略所有.h为结尾的文件 *.py[c|a|d] # 忽略pyc或pya或pyd后缀的文件 .gitignore # 忽略.gitignore文件 files/ # 忽略files文件夹下的所有文件 !c.h # 不忽略c.h文件3)详细的gitignore文档见https://github.com/github/gitignore;
4.4 github任务管理
1)Issues;主要用来做文档以及任务管理;使用Git做项目管理,如果存在问题就去Issues里面去提问,可以选择问题指派的人,也可以选择问题的标签,同时能够做bug管理;
2)wiki;wiki是该项目的文档,对项目的介绍;是接触该项目的其他人需要首先读的东西。
4.5 前期出现的bug解决方案
1)在github往本地拉取代码或往远程仓库上传代码时,会出现下面的错误;解决方案:git所设端口与系统代理不一致,需要重新设置;
打开设置->网络与Internet->查找代理;
git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:78904.6 实际案例
1.通过4.1和4.2配置用户、邮箱和SSH key;
2.在本地拉取分支代码(比如拉取master主分支),git fetch(获取所有新提交、分支、标签);
gitclone git@github.com:tomasvr/turtlebot3_drlnav.gitgitfetch3.checkout 切换到你想去的分支(如dev,切换分支本地代码会直接切换对应分支,而不是本地会有多套代码,这个刚开始我也很糊涂,既然所有分支都有为啥本地就一套代码哈哈哈),如果你是要本地新建分支修改(如拉取自dev,新建dev/fixbug的分支),使用 -b 命令新建分支,后面加上本地新建分支名和新建自哪个源分支, git log -1 查看你的分支号和源分支号;
gti checkout devgitcheckout-bdev/fixbug origin/devgitlog-14.修改本地dev/fix_bug分支的代码,修改完成后git status查看修改了哪些文件,接着 git add .;git commit -m “fix_bug-v1”, 后面跟的字符串是本次修改记录的名称,自定义即可;
gitstatusgitadd.gitcommit-m“fix_bug-v1”5.git push -u origin dev/fixbug命令会在远程仓库自动创建与本地同名的分支,把本地代码上传;如果要删除本地分支,增加-d即可;
gitpush-uorigin dev/fixbuggitbranch-ddev/fixbug6.-r命令可以查看所有分支,如果远程仓库该分支别人做了修改,你需要拉最新的代码再做修改,使用git pull或git merge命令;
gitpullgitmerge origin/dev/fixbuggitbranch-r总结
git原理及使用git做本地版本控制和github做代码托管讲解完毕,如有不对,欢迎指正。