git基本使用方法
由于平时写代码和博客常常用到git和github,每次用到都去百度,感觉太麻烦了,也大大降低了效率,索性自己整理一下常用到的git指令和使用方法,对git的使用能有一个系统的认识。这里只介绍一下基本用法,对更高级的用法如果以后用到再进行补充。
git安装和配置
git的安装和配置在我的这篇搭建个人博客里,请自行参考配置,主要有一下几点:
- 下载安装git程序
- 配置github账户
- 配置SSH KEY
git工作原理
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。Git在执行更新操作时,更像是对数据的一组快照,每次你提交更新,它主要对当时的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一个链接指向之前存储的文件。
如上图所示,在version2中的B即是因为File B没有改变,所以直接存储了一个指向FileB的链接。只有修改了的文件才会产生一个新的文件,覆盖原来的文件。
git的工作原理/流程如下:
- Workspace:工作区(本地目录文件)
- Index / Stage:暂存区/缓存区
- Repository:仓库区(或本地仓库)
- Remote:远程仓库
基本操作
初始化仓库
仓库的初始化有两种方式:一种是直接从远程仓库克隆,另一种则是直接从当前目录初始化。远程初始化命令在从远程仓库获取,本地初始化命令的方法是首先创建一个文件夹,我命名为mygit,然后执行如下命令:
1 | $ git init |
执行完毕后,当前目录下会出现一个隐藏的.git文件夹,git所需的数据和资源都放在改目录中。
查看仓库状态
通过git status
来查看仓库状态,执行效果如下:
可以看到nothing to commit,表示本地工作区没有要提交的文件,我们再创建一个one.txt的文件,然后在执行git status
,效果如下:
从结果Untracked files可以看到,one.txt还没有被add到暂存区。
添加文件到暂存区
git add
命令可以将一个文件添加到暂存区,执行如下命令将one.txt添加到暂存区:
1 | git add one.txt |
将one.txt添加到暂存区后,再次执行git status
,可看到如下效果:
从Changes to be committed可以看出,one.txt已被添加到暂存区,但还未被添加到本地仓库。
提交到本地仓库
当文件提交到暂存区之后,执行git commit
命令将当前暂存区的文件提交到本地仓库,执行如下命令:
1 | git commit -m '新增一个one.txt' |
-m是指将当前暂存区的文件提交到本地仓库的时候,加上提交备注/说明,再次执行git status
,可以看到已经没有要add或commit的文件了。这里要强调一下,如果直接执行git commit
命令,会自动打开一个vi编辑器,在里面输入备注/说明即可。此外,当我们提交成功后,还可以通过git commit --amend
修改备注信息。
查看更改前后的差异
使用git diff
命令可以查看工作区和暂存区的区别,在one.txt里面写入一行hello world,然后执行git diff
命令,结果如下:
根据结果可以看到新增了一行hello world,如果我们要比较工作区与最新本地版本库的区别,可以执行git diff HEAD
,结果如下:
查看提交历史
使用git log
查看提交历史,我们首先将工作区的内容提交到本地仓库,执行git add one.txt
将更改后的one.txt添加到暂存区,执行git commit -m '添加了一行hello world'
将暂存区的内容提交到本地仓库,然后执行git log
,结果如下:
git撤销修改
工作区的代码撤销
使用git checkout
撤销工作区的代码。我们先向one.txt添加一行hello everyone,执行cat one.txt
查看内容,再执行git checkout -- one.txt
撤销之前的操作,让one,txt恢复之前的状态,然后执行cat one.txt
再次查看内容,效果如下:
可以看到,工作区的内容已经被修改,这时候本地文件刚刚添加的内容就被撤销了。
暂存区的代码撤销
使用git reset HEAD
撤销暂存区的代码。首先在one.txt添加一行hello people,执行git add one.txt
将更改的内容提交到暂存区,git reset HEAD
来撤销暂存区的代码,如下图:
撤销暂存区的代码之后,如需要将代码添加到暂存区,则需要再次执行git add
命令
本地仓库的代码撤销
可以使用git reset --hard <版本号>
来撤销本地仓库的代码,版本号有几种不同的写法:
- 可以使用HEAD来描述版本,一个表示前一个版本,两个^^表示前两个版本,以此类推。
- 也可以使用数字来代替^,比如说前100个版本可以写作HEAD~100。
- 也可以直接写版本号,表示跳转到某一个版本处。我们每次提交成功后,都会生成一个哈希码作为版本号,所以这里我们也可以直接填版本号,哈希码很长,但是我们不用全部输入,只需要输入前面几个字符即可,就能识别出来。执行
git log
后那一串长符号就是哈希码版本号。
依次执行如下命令:
1 | $ git add 'one.txt' |
执行git reset --hard head^
后的效果如下:
可以从结果看出,前半部分816b208是执行撤销操作以后,当前版本的版本号前七位,后半部分是该版本的备注,可以用git log
来查看不同版本的版本号和备注。
再次查看本地one.txt文件,发现本地目录的刚刚添加的内容已经没有了,如需要再次提交到本地仓库,则可执行git add
和git commit
命令。需要注意的是,当撤销到最开始版本的时候,git reset --hard head^
就不能再用了,否则会报如下的错误:
git分支管理
查看分支
通过git branch
来查看当前仓库有哪些分支和我们处于哪一分支中,如下所示:
可以看到,当前本地仓库只有一个master分支,这是git默认创建出来的,master前面的*表示我们当前处于这一个分支中。
分支创建和切换
可以利用git branch <分支名>
来创建一个分支,利用git checkout <分支名>
来切换分支,如下所示:
分支合并
由于math分支是从master分支中创建出来的,所以此时math分支的内容和master分支的内容是一致的,现在,我们在math分支向one.txt添加一行hello branch math(由于刚刚执行了本地仓库的代码撤销,所以one.txt现在的内容是空白的),此时math分支的one.txt和math分支的one.txt就不同了,具体效果如下:
执行完毕后,我们也可以在本地查看,先在math分支下,打开one.txt可以看到我们刚刚添加的内容,然后再切换到master分支,再从本地打开one.txt文件,就看不到内容了。
可以通过git merge <分支名>
合并分支,先切换到master分支,然后执行git merge math
合并math分支到master分支上,效果如下:
可以看到再次在master分支下查看one.txt,就可以显示math分支的内容了。
通常合并分支时,git一般使用”Fast forward”模式,fast-forward方式表示当条件允许时,git直接把HEAD指针指向合并分支的头,完成合并,这种方式合并速度快,但是在整个过程中没有创建commit。在这种模式下,删除分支后,会丢掉分支信息,可使用带参数 –no-ff
来禁用”Fast forward”模式,即删除时可以实用git merge --no-ff <分支名>
以图表方式查看分支
可以用git log --graph
命令来直观的查看分支的创建和合并等操作,合并math和master分支前的效果如下:
合并math和master分支后的效果如下:
解决冲突
我们创建一个新的分支dev,并在dev分支下给one.txt添加一行12345,然后提交,如下所示:
同样,我们现在切换到master分支上来,也在one.txt添加一行内容,内容为56789,并提交,如下所示:
现在,我们将dev分支合并到master上来,如下所示:
从结果中可以看出,=======之前是主分支的内容,=======之后是dev分支的内容,此时我们用文本编辑器修改one.txt的冲突然后提交即可,如下所示:
分支策略:首先master主分支应该是非常稳定的,也就是用来发布新版本,一般情况下不允许在上面干活,干活一般情况下在新建的dev分支上干活,干完后,dev分支代码可以合并到主分支master上来。
github远程仓库
关联远程仓库
在此之前我相信你已经配置SSH KEY,如果没有,可以参考我的这篇搭建个人博客里进行配置,配置完成以后在github上创建一个仓库,这里命名为test,我们可以看到仓库的地址,例如:https://github.com/wxler/test.git
。然后将我们之前的本地仓库和这个远程仓库进行关联,使用git remote add
命令,如下:
1 | $ git remote add origin https://github.com/wxler/test.git |
推送到远程仓库
把本地库的内容推送到远程,使用git push -u origin master
命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了–u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令,不用加-u了,效果如下:
推送成功后,可以立刻在github页面中看到远程库的内容已经和本地一模一样了。从现在起,只要本地作了提交,就可以通过命令:git push origin master
把本地master分支的最新修改推送到github上了,现在你就拥有了真正的分布式版本库了。
**我们一般不把其它分支推送到远程仓库,master主分支是最稳定的版本,一般情况下不允许在上面干活,干活一般情况下在新建的分支上干活,干完后,把分支代码可以合并到主分支master上来。**当然,你也可以将其它分支推送到远程仓库,可以执行如下命令:
1 | $ git checkout fa |
从远程仓库获取
我们可以通过git clone命令克隆一个远程仓库到本地,方式也简单,在本地创建一个空文件夹,执行如下命令:
1 | $ git clone https://github.com/wxler/test.git |
此时克隆的是master分支到本地仓库,我们可以通过git branch -a
来查看本地仓库和远程仓库的信息,-a参数可以同时显示本地仓库和远程仓库的信息,如下:
我们也可以把远程仓库其它分支的内容clone下来,可以执行如下命令:
1 | $ git branch fa origin/dev |
上面的指令表示根据远程仓库的dev分支创建一个本地仓库的dev分支,然后再切换到dev分支,注意由于dev分支就是从远程仓库克隆下来的,所以这里可以不添加-u参数。
从远程仓库更新
使用git pull
获取远程仓库最新的代码和数据,例如,我们可以通过以下代码将远程主机的master分支最新内容拉下来后与当前本地分支直接合并
1 | git pull origin master |
git命令大全
git常用命令速查表,方便查阅:
遗留问题
到现在,我们就可以使用git的大多数操作了,但是还有git的一些操作平常没有用到,我也就不主动去一个个试了,毕竟一口吃不成胖子,查了也记不住,就不自找苦吃了,遗留的问题主要有:
- git分支衍合
- git标签管理
- bug分支&stash功能
参考文档
松哥git教程
Git从入门到熟练使用
史上最简单Git入门教程
git命令大全
特别声明:本篇博客只做个人学习交流和参考手册使用,不作任何商业目的,内容上较多参考了松哥git教程,根据自己实际应用进行删减,并加上了自己的理解和补充,如有侵权,请联系博主本人删除。