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 <版本号>来撤销本地仓库的代码,版本号有几种不同的写法:

  1. 可以使用HEAD来描述版本,一个表示前一个版本,两个^^表示前两个版本,以此类推。
  2. 也可以使用数字来代替^,比如说前100个版本可以写作HEAD~100。
  3. 也可以直接写版本号,表示跳转到某一个版本处。我们每次提交成功后,都会生成一个哈希码作为版本号,所以这里我们也可以直接填版本号,哈希码很长,但是我们不用全部输入,只需要输入前面几个字符即可,就能识别出来。执行git log后那一串长符号就是哈希码版本号。

依次执行如下命令:

1
2
3
$ git add 'one.txt'
$ git commit -m '添加一行hello people'
$ git reset --hard head^

执行git reset --hard head^后的效果如下:

可以从结果看出,前半部分816b208是执行撤销操作以后,当前版本的版本号前七位,后半部分是该版本的备注,可以用git log来查看不同版本的版本号和备注。

再次查看本地one.txt文件,发现本地目录的刚刚添加的内容已经没有了,如需要再次提交到本地仓库,则可执行git addgit 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
2
$ git checkout fa
$ git push -u origin fa

从远程仓库获取

我们可以通过git clone命令克隆一个远程仓库到本地,方式也简单,在本地创建一个空文件夹,执行如下命令:

1
$ git clone https://github.com/wxler/test.git

此时克隆的是master分支到本地仓库,我们可以通过git branch -a来查看本地仓库和远程仓库的信息,-a参数可以同时显示本地仓库和远程仓库的信息,如下:

我们也可以把远程仓库其它分支的内容clone下来,可以执行如下命令:

1
2
$ git branch fa origin/dev
$ git checkout 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教程,根据自己实际应用进行删减,并加上了自己的理解和补充,如有侵权,请联系博主本人删除。