Git初始化
-
下载安装, 下载地址: https://git-scm.com/downloads 每个系统的都有(linux、mac、windows等),看官网的安装教程,很详细,此处我以windows来练习
-
首先创建一个文件夹,这个文件夹就是我们将来通过git来管理的所有文件的存放地点 。
-
在文件夹中右键 使用Git Bash
-
在弹出的窗口中执行初始化指令,让git帮我们对这个文件夹中的所有文件以及文件夹进行管理
-
git init
#创建git版本管理的本地仓库 -
产生的.git文件夹用来存放你管理的文件的所有版本以及git配置相关的内容,不要轻易动它
简单指令使用
基本操作
git status
查看仓库中所有的文件夹和文件的状态git add supercrm
让git管理单独的文件夹或者文件git add .
管理所有文件和文件夹- 配置用户名和邮箱
git config --global user.name<用户名>
git config --global user.email <邮箱地址>
管理之后进行二次开发,修改一些文件之后:
git add supercrm
git commit -m 'v2版本'
查看日志
git log
Git进阶
Git三大区域
介绍: 作区(写代码的地方)—git add暂存区(临时存储)—git commit本地库(历史版本)
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
文件往Git版本库里添加的时候,是分两步执行的:
第一步用git add把文件添加进去,实际上就是把文件修改添加到暂存区。
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
创建Git版本库时,Git自动为我们创建了唯一一个master分支,git commit就是往master分支上提交更改。add需要提交的文件修改通通放到暂存区,然后commit可一次性提交暂存区的所有修改
Git回滚
假如我们现在写了三个版本了,但是你发现第三个版本有问题,或者说被迫的下线第三个版本添加的新功能,那么我们是不是要将代码回到第二个版本的状态啊,如果我们自己手动去修改是不是就非常的麻烦了,所以此时就用到我们git回滚功能了 。
git log
#查看日志,每个版本都有版本号
Git回滚操作指令
git reset --hard 版本号
例如:git reset --hard a3c69761b4ecd8b23c392315cd245f2939024882 (第二个版本的版本号)
不过,后来你又觉得第三个版本的功能还是挺好的,接着拿回来用吧,但是你已经回滚到第二个版本了啊,这可怎么办?看操作:
先执行git log,你发现,git log里面没有显示我们原来的第三个版本,对不对,此时我们不能用这个指令来查看了,需要下面这个指令:
git reflog #也是查看日志,但是包括回滚操作的版本
再通过git reset --hard 版本号来回滚
Git的强大之处,能够让我们在任意版本之间来回切换。
我们接着学两个指令
git checkout -- 文件名 #将文件从以修改的工作区回滚到未修改的状态
如果我们将修改i的文件已经添加到了暂存区了,又怎么回滚呢?看指令
git reset HEAD 文件名
如果想让他再回到未修改时的状态,那么就又用到了我们那个git checkout -- 文件名,那个指令了 。
关于回滚,git里面还有几个其他的指令,就不一个一个的演示了,大家看图就明白了:
指令总结
git init
git add
git commit
git log
git reflog
git reset --hard 版本号
Git分支
分支可以给使用者提供多个开发环境,也就是说可以将你的工作从主线中分离出来,以免影响开发主线,等分支的代码开发完之后,再合并到主线代码上,就比如说,我们写了一个毕业论文,大致的流程写完了,但是我们可能觉得某些地方写的太少了(添加新功能),需要丰富一下,或者有些地方可能写的有问题需要调整一下(之前的代码有bug,需要修改),那么我们怎么做呢,是不是会复制一份这个论文,然后再修改,改完之后如果没有什么问题,就将改完之后的作为了最新的版本(分支上添加了新功能或者修复了bug,然后进行分支合并)。
大家在这里先不用去考虑公司里面到底是怎么使用git来进行工作的,我们首先先来看看,如果你在自己的电脑上开发程序,用git是怎么个流程,怎样开分支,分支是个什么样子?
比如,我们现在的代码开发到了第三个版本,之前我们没有说什么分支的概念,其实我们开发代码的时候,默认的分支叫做主分支(master分支),只是我们一直还不知道。
指令总结
git branch 查看当前分支
git branch dev 创建一个名为dev的分支
git checkout dev 将工作切换到dev分支上
git checkout -b dev #创建并切换到dev分支上,和上面两个指令的效果一样
git branch master
git merge bug #分支合并---首先切换到master分支,然后在master分支上执行merge指令来合并bug分支的代码
git branch -d bug 删除bug分支
比如我当前的代码只到了test3,3版本,我想添加一个新的功能test4,那么我就创建了一个dev分支,并在dev分支上添加了test4,比如说test4需要打印两行内容,但是我现在写了一行内容的时候,发现之前线上使用的代码(线上使用的代码一般是master分支上的),出现了bug,那么我们需要切换到master分支,并且在master分支上再创建一个bug分支,在bug分支上修复bug,修复完成之后,需要合并到master分支上,合并之后的版本我们暂且称为5版本,记着,5版本的代码和dev开分支时的3版本代码是有些变动的,因为修复了bug,但是dev分支上还是使用的master分支上的v3版本进行的新功能的开发,那么bug修复完之后,我们现在又要回到dev分支上继续新功能的开发,开发完成之后,需要合并到master分支上,合并的时候,你会发现报了一个错误,其实也不是错误,就是提示你,代码有冲突,这冲突怎么来的,你想,master分支已经到了c5版本,但是dev分支上的代码还是从master分支的c3版本的基础进行添加新功能的,所以合并的时候c3版本的其他代码和它c5版本的代码本身就有一些不一样的地方(就是那个bug修复的地方),所以出现了冲突的问题,那么怎么办呢,没办法,我们只能手动来修复冲突,那么怎么修复呢,git会将所有的冲突全部标记在你的代码文件中,有冲突的方法,找到它手动修改一下就可以了。其实,只要我们两个分支中的相同的文件的同一行出现了不同的内容,合并时就会出现冲突。看一下冲突的报错是什么样子的:
出现了bug,我们看看bug在哪里,其实git会将冲突在你的代码文件中标识出来,看图:
![img](https://img2018.cnblogs.com/blog/988061/201910/988061-20191015130658446-2103857502.png)
这里提示你了,dev分支上是哪些内容,master分支上是哪些内容,我们把没用的删除就可以了,然后提交一个新的版本,这样就完成了分支代码合并
Git工作流
看图:![img](https://img2018.cnblogs.com/blog/988061/201910/988061-20191015134341065-2081637868.png)
公司一般最少有两个分支,master只保留正式(线上)版本,dev(develop)分支,开发都在dev分支上搞。
Github代码管理仓库
我们做开发的时候,写程序,可能会有多个人一起开发,或者你自己有多个电脑,家里一个电脑,办公室一个电脑,但是你如果刚开始的代码都是在家里的电脑写的,然后你到了公司,你想继续开发你的程序,那么就需要你自己来回的拷贝自己的代码,并随身携带,非常麻烦,你说对不对,所以现在就出现了代码网络托管站(就类似于行李托管站一样),可以帮你保存你的代码,以及各个版本的代码和所有分支,这样的话,你在家里开发完了之后,把代码放到托管站,就不用自己随身携带了,等你到了公司,使用公司的电脑开发的时候,就可以直接通过网络托管站把自己已经开发好的代码拉下来到自己的本机,然后继续开发,开发完了之后,在交给托管站托管,这样就方便多了,有很多这样的托管站,比如今天我们要说的GIthub,还有GitLab、码云、开源中国、CSDN等都在做代码托管平台。
使用Github有这么几步
-
注册Github账号
-
创建仓库
-
本地代码推送到仓库
第一步:注册Github账号
这个就不带着大家注册了,看图,网址: https://github.com/
注册号账号之后,点击上面的sign in进行登陆,登陆成功之后,会来到这个页面,也就是你的首页
第二步:创建仓库
也就是我们说的托管站里面开辟一个自己的代码托管的空间,看操作
![img](https://img2018.cnblogs.com/blog/988061/201910/988061-20191015173907847-1429215622.png)
然后会看到下面的页面,看介绍
![img](https://img2018.cnblogs.com/blog/988061/201910/988061-20191015175132782-1057140652.png)
创建好之后我们会看到下面这个页面,其实在GitHub这个托管站上,就相当于我们创建了一个叫做dbhot(就上面我起的那个仓库名称)的文件夹,用来管理我们的项目。
![img](https://img2018.cnblogs.com/blog/988061/201910/988061-20191015180900255-946808968.png)
第三步:Github保存代码
将我们的代码和分支推送到GitHub上保存
打开我们的终端,也就是我们那个git bash,查看一下状态。
然后看一下推送代码的指令:
查看一下当前的分支
然后执行指令:
![img](https://img2018.cnblogs.com/blog/988061/201910/988061-20191015184652262-1325276167.png)
然后执行它:
![img](https://img2018.cnblogs.com/blog/988061/201910/988061-20191015184725290-1740721618.png)
会给你弹出一个窗口,让你输入GitHub的账号和密码,这里我的截图失败了,导致大家在这里看不到效果了,但是没关系,你应该可以搞定的。然后接着看:
![img](https://img2018.cnblogs.com/blog/988061/201910/988061-20191015185334056-658287118.png)
等代码都推送成功了之后,我们来GitHub上刷新一下我们的仓库页面,就会看到变化了:
推送一下dev分支到GitHub上:
刷新我们的GitHub页面,就看到有两个分支了
第四步: 拉取GitHub上的代码继续开发
- git clone 地址
例如: git clone https://github.com/clschao/dbhot.git
第五步:换一个电脑继续开发
指令总结
-
上传代码
- 给远程仓库起名
git remote add origin
远程仓库地址 - 向远程推送代码
git push -u origin
分支
- 给远程仓库起名
-
在新电脑上第一次获取代码
- 克隆远程仓库代码
git clone
远程仓库地址(内部已实现git remote add origin 远程仓库地址) - 切换分支
git checkout
分支
- 克隆远程仓库代码
-
在新电脑上进行开发
- 切换到dev分支进行开发
git checkout dev
- 把master分支合并到dev(仅一次)
git merge master
- 修改代码
- 提交代码
git add .
git commit -m 'xx'
git push origin dev
- 切换到dev分支进行开发
-
回老电脑上继续写代码
- 切换到dev分支进行开发
git checkout dev
- 拉代码
git pull origin dev
- 继续开发
- 提交代码
git add .
git commit -m 'xx'
git push origin dev
- 切换到dev分支进行开发
开发完毕之后,在dev分支上commit,然后切换到master分支上合并一下dev分支,然后推送到GitHub上的master分支上,就算是完成了 。最后,因为我们dev分支上也是最新的代码了,也可以将我们的dev分支推送到GitHub上的dev分支上,其实推送之前有个好习惯就是在dev分支上合并一下master分支的代码git merge master,这里我没有写,但是个好习惯 。以后如果我们还想继续开发,我们可以将我们的dev和master分支上的最新的代码都拉下来进行继续开发:
git pull origin dev
git pull origin master
第六步: 如果在公司忘记提交代码,怎么搞?
在公司开发的时候
-
拉代码
git pull origin dev -
继续开发
-
提交代码
git add .
git commit -m 'xx'
注:忘记push了,没有推给GitHub
回到家继续开发
- 拉代码,发现在公司写的代码忘记提交到GitHub上了
git pull origin dev - 继续开发其他功能
但是在家里写的功能有可能和你在公司开发的代码有些冲突(在同一行) - 把dev分支也推送到了远程
git add .
git commit -m 'xxx'
git push origin dev
第二天到了公司继续写代码
- 拉代码,把昨天晚上在家里写的其他功能的代码拉到本地(有合并、可能产生冲突)
git pull origin dev
- 如果有冲突,手动解决冲突(公司电脑上昨天忘记push的代码和昨日回到家后写的代码可能有些冲突)
- 继续开发其他功能
- 把dev分支也推送到远程
git add .
git commit -m 'xxxx'
git push origin dev
其实git pull origin dev
等价于下面两个指令:
git fetch origin dev
将远程仓库dev分支的代码拉到本地git的版本库中,为了和本地dev分支做个区分,远程拉下来的dev分支会叫另外一个名字:origin/dev
git merge origin/dev
合并远程拉取下来的dev分支的代码
rebase变基
指令总结
- git branch dev 和 git checkout dev 创建dev分支和切换到dev分支上
- 创建一个dev.txt文件
git add .
和git commit -m 'dev branch'
git checkout master
切换到master分支上- 创建一个master.txt文件
git add .和git commit -m 'master branch'
在master分支上提交一下最新添加的master.txt文件也作为master分支上的一个版本
在dev分支上执行一个git log查看一下dev分支提交的版本
在master分支上执行一个git log 查看一下master分支提交的版本
git log --graph #图形化界面显示所有的提交记录
git log --graph --pretty=format:'%h %s' #让图形化界面显示记录的时候更清晰一些:%h是显示版本号,%s是显示版本描述。
到目前为止,我们就做出了上面那个图的效果,在dev分支上有一个版本,在master分支上有其他的版本
那么以后我们再开发的时候,可以通过rebase来让dev分支上的记录合并到master分支上,那么我们在master分支上再查看git log --graph的时候就只能看到一条线的记录了
现在我们通过rebase来合并一下dev分支上的版本,让git log显示的记录编程一条线
-
git checkout dev
-
git merge master #注意,因为dev分支上的代码没有master分支上的全,所有先合并一下master分支,然后再进行后面的操作
-
创建一个dev1.txt -- git add . -- git commit -m 'dev branch commit 1'
-
git checkout master
-
创建一个master1.txt文件 -- git add . -- git commit -m 'master branch commit 1'
-
这样的话我们再dev分支上有个版本,master分支上又一个版本
-
git checkout dev
-
git rebase master #将dev分支上的这个新记录并到master分支的记录上
-
git checkout master
-
git merge dev
然后我们再执行git log --graph 就看到了一条线,并且这条线上有dev分支开发的那个版本
Git配合Beyond Compare来解决冲突
第一步: 安装beyond compare软件,下载地址:http://www.scootersoftware.com/download.php,就直接点击下载安装,然后和安装其他软件一样,点点点就可以了。
第二步:在git中进行以下配置
git config --local merge.tool bc3 #--local的意思是只对当前项目有效,其他的本地仓库是不生效的
git config --local mergetool.path '/usr/local/bin/bcomp' #beyond compare的执行程序的安装路径
git config --local mergetool.keepBackup false
如果通过上面的指令配置不能正常生效的话,就改动以下配置文件,打开 .gitconfig 配置文件 (windows 在 C:UsersAdministrator [Administrator 为你当前用户名], mac 在 ~/),加入以下内容:
[merge]
tool = bc3
[mergetool "bc3"]
path = D:/Program Files (x86)/Beyond Compare 3/BCompare.exe #注意win下是这个/路径分隔符,文件路径尽量不要出现空格昂
第三步:应用这个软件来解决冲突
当我们执行merge合并的时候,比如说,我们执行了一下git merge dev分支的指令,会报错,报一个代码冲突的错误,然后我们知道产生冲突了,此时我们就可以使用我们的beyond compare来进行冲突排查和修改,使用下面的指令来调用工具:
git mergetool
执行上面的指令之后,自动会打开beyond compare,你会 看到下面的页面:
![img](https://img2018.cnblogs.com/blog/988061/201910/988061-20191020134946637-1248674444.png)
Git多人协作开发
第一步:创建dev分支
第二步:将dev分支推送到远程
git push origin dev
第三步:pull request合并请求
Git配置文件详解
配置文件其实分三个:
1.项目配置文件
只有当前的git项目生效, 在项目的.git/config文件中,对应的配置指令:
git config --local user.name 'wuchao'
git config --local user.email 'wuchao@xx.com'
2.全局配置文件
所有git管理的项目都生效,mac电脑在~/.gitconfig中,windows在:,对应配置指令:
git config --global user.name 'wuchao'
git config --global user.name 'wuchao@xx.com'
3.系统配置文件
所有项目都生效,mac在/etc/.gitconfig文件中,windows在: ,对应配置指令:
git config --system user.name 'wupeiq'
git config --system user.name 'wupeiqi@xx.com'
注意:需要管理员权限,也就是root权限
应用场景:
#配置用户名和邮箱
git config --local user.name 'wuchao'
git config --local user.email 'wuchao@xx.com'
#配置beyond compare工具
git config --local merge.tool bc3
git config --local mergetool.path '/usr/local/bin/bcomp' #工具路径
git config --local mergetool.keepBackup false
#配置push的时候的远程仓库的地址
git remote add origin 地址, 默认是添加在了本地配置文件中(--local)
使用配置项的顺序:本地配置--全局配置--系统配置。
更多的配置相关内容和指令:
配置 Git 的相关参数。
Git 一共有3个配置文件:
1. 仓库级的配置文件:在仓库的 .git/.gitconfig,该配置文件只对所在的仓库有效。
2. 全局配置文件:Mac 系统在 ~/.gitconfig,Windows 系统在 C:Users<用户名>.gitconfig。
3. 系统级的配置文件:在 Git 的安装目录下(Mac 系统下安装目录在 /usr/local/git)的 etc 文件夹中的 gitconfig。
看指令:
# 查看配置信息
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> -l
# 查看当前生效的配置信息
$ git config -l
# 编辑配置文件
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> -e
# 添加配置项
# --local:仓库级,--global:全局级,--system:系统级
$ git config <--local | --global | --system> --add <name> <value>
# 获取配置项
$ git config <--local | --global | --system> --get <name>
# 删除配置项
$ git config <--local | --global | --system> --unset <name>
# 配置提交记录中的用户信息
$ git config --global user.name <用户名>
$ git config --global user.email <邮箱地址>
# 更改Git缓存区的大小
# 如果提交的内容较大,默认缓存较小,提交会失败
# 缓存大小单位:B,例如:524288000(500MB)
$ git config --global http.postBuffer <缓存大小>
# 调用 git status/git diff 命令时以高亮或彩色方式显示改动状态
$ git config --global color.ui true
# 配置可以缓存密码,默认缓存时间15分钟
$ git config --global credential.helper cache
# 配置密码的缓存时间
# 缓存时间单位:秒
$ git config --global credential.helper 'cache --timeout=<缓存时间>'
# 配置长期存储密码
$ git config --global credential.helper store
Git忽略文件
添加让git忽略的文件:
还可以添加.gitignore自己,通过*.txt能够将所有的.txt结尾的文件全部让git忽略掉
然后看到下面的内容: 地址: https://github.com/github/gitignore
注意,在公司进行开发的时候,一定要加上gitignore,不然容易将一些敏感的信息提交到远程,不安全。
GitHub做任务管理相关
1.issues
还可以做bug管理,比如你提的这个问题是个bug,你可以选择bug类型,然后指派给别人进行处理。
然后我们再点击上面这个issues选项,会看到下面的页面:
2.wiki
项目介绍,百科,其实写一个项目,都需要写wiki,来做项目的整体描述和说明,其他人来参与项目的时候,先看wiki。
![img](https://img2018.cnblogs.com/blog/988061/201910/988061-20191021220941653-266480100.png)
然后看到下面的页面:
![img](https://img2018.cnblogs.com/blog/988061/201910/988061-20191021221109607-451028730.png)
到这里,我们的git就学完了,谢谢大家!