GIT的基本使用

前言

       Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。在开发中也是经常用到的工具,在了解到GIT之前我就想过有没有什么工具可以方便的进行回退之类的将文件管理起来的工具,直到我慢慢的知道了GIT,并且学会了如何使用它,就知道了其实管理文件起始也挺简单的。这里就介绍以下GIT的常见用法以及命令。

先来了解几个概念

这是我觉得比较简单能理解git工作原理的一张图:

这里来解释以下图中所提到的几个概念:

工作区

工作区很好理解,其实就是我们项目工作所在的文件夹,这个就被称之为工作区

暂存区

暂存区也很好理解,通过名字就知道是暂时存放的文件夹,我们通过相应命令就可以将项目中的文件提交到暂存区当中,当作中间临时存放的区域。而暂存区中的文件等待着被提交到本地仓库中或者被清除。

本地仓库

本地仓库就是在暂存区中的文件最终确定要提交,然后会被提交到的场所。这个仓库里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”。

远程仓库

远程仓库就是远程存放我们项目文件的地方,可以通过相应命令来讲提交到本地仓库中的文件上传到远程仓库中。

了解完这几个概念之后其实就大致能明白GIT的简单工作流程了,接下来看看具体怎么操作。

GIT常用命令

git init

这个是使用git的开始,当执行了这个操作就表示这是一个git目录了,目录中会多出来一个隐藏的 .git 文件夹,这个就是git本地仓库。

1
$ git init

后面可以跟一个目录,在指定目录初始化。

git clone

可以将一个远程仓库克隆到本地

1
$ git clone [url]

这里的url地址推荐使用ssh会更快一些。

git add

通过 git add 加上文件名可以将指定文件的修改添加都暂存区。

也可以通过git add .或者是git add -A来将所有的文件修改添加到暂存区,二者区别在于前者不会将文件删除添加到暂存区,后者会。

git status

可以通过这个命令来查看当前工作区文件的所有改动

也可以添加 -s 选项来的到简短的结果:

1
$ git status -s

git diff

可以通过此命令来查看当前工作区中的文件与本地仓库中的区别,这是在没有添加到暂存区的情况下。

当添加到暂存区后可以这样查看:

1
$ git diff --cached

git commit

通过此命令可以将暂存区中的快照添加到本地仓库中。

1
$ git commit -m '通过-m 选项添加注释'

提交完成之后再用 git status 命令查看则不会有内容

git reset HEAD

通过此命令可以撤销暂存区中的快照,如果想取消某文件被添加到暂存区,那么通过此命令就可以使它不被提交到本地仓库,简单来说就是取消暂存。

git reset –hard HEAD^

这个命令的作用就是版本回退,每个^ 符号就表示每个 git log中的记录,如果要回退固定次数可以这样写:

1
git reset  --hard HEAD~100

这是回退100次。

也可以通过版本号来回退到固定版本:

1
git reset  --hard  49bdb9c

版本号可以通过git log --oneline来查看

git checkout – file

通过此命令可以丢弃工作区中的内容

如果该文件的修改提交到了暂存区就会恢复到暂存区时的样子

如果没有提交到暂存区就会恢复到和版本库一致。

git stash

通过此命令可以将当前工作区的工作状态储藏起来,这样就可以方便的切换到其他分支上进行工作。

可以通过查看储藏列表:

1
git stash list

可以通过git stash apply恢复到最近的储藏,也可以恢复到指定的储藏:

1
git stash apply stash@{2}

默认只会恢复文件的更改,并不会恢复暂存,如果要恢复暂存则需要添加一个--index选项:

1
git stash apply --index

可以通过git stash drop@{2}来删除指定储藏,也可以恢复之后立即删除:

1
git stash pop

如果想要反悔恢复的储藏,可以这样:

1
git stash show -p stash@{0} | git apply -R

基本命令

查看分支:git branch

创建分支:git branch name

切换分支:git checkout name

创建+切换分支:git checkout –b name

合并某分支到当前分支:git merge name

删除分支:git branch –d name

在git中HEAD指向的是当前分支。

解决冲突

当同时在两个分支上修改了同一个地方的话,在合并分支的时候就会产生冲突,这个时候就需要手动进行修复修改文件内容,
再进行一次提交就可以解决冲突:

1
git commit -a -m 'fix conflicts'

远程仓库管理

连接远程仓库有两种方式,一种是直接将远程仓库克隆下来,这个上面已经说过了。

还有一种就是将本地仓库连接到远程仓库:

1
$ git add origin <url>

通过这种方式就可以将本地仓库与远程仓库相连,还是推荐使用ssh。

这里的 origin只是一个名字以后,代表的是远程仓库在本地使用过程中的一个代号,可以取其他名字。在绑定分支的会用到这个名字:

向远程仓库提交时:

1
$ git push -u origin master

意思就是将本地的当前分支的内容推到远程的 master 中。获取也是一样的。

忽略提交

有时我们会需求并不是所有文件都需要进行追踪提交,比如说开发工具或者是临时文件之类的,那么这个时候我们就可以通过配置 .gitignore 这个文件来配置需要忽略的文件。

在 .gitignore 文件中每一行代表一个忽略规则。

配置语法:

  • 以斜杠“/”开头表示目录;

  • 以星号“*”通配多个字符;

  • 以问号“?”通配单个字符

  • 以方括号“[]”包含单个字符的匹配列表;

  • 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录。

  • **匹配多级目录,可在开始,中间,结束

忽略规则也存在优先级(由高到低):

  • 从命令行中读取可用的忽略规则

  • 当前目录定义的规则

  • 父级目录定义的规则,依次地推

  • $GIT_DIR/info/exclude 文件中定义的规则

  • core.excludesfile中定义的全局规则

常用规则示例:

  • bin/: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件

  • /bin: 忽略根目录下的bin文件

  • /*.c: 忽略 cat.c,不忽略 build/cat.c

  • debug/*.obj: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj

  • **/foo: 忽略/foo, a/foo, a/b/foo等

  • a/**/b: 忽略a/b, a/x/b, a/x/y/b等

  • !/bin/run.sh: 不忽略 bin 目录下的 run.sh 文件

  • *.log: 忽略所有 .log 文件

  • config.php: 忽略当前路径的 config.php 文件

要注意的一件事情是.gitignore文件只能忽略那些没有被追踪的文件,已经被追踪的文件对于 .gitignore文件来说是无效的。

总结

这里介绍了一些GIT常见的也比较简单的用法,平时常用的也不多,其他的知道了解就好了。

-------------本文结束感谢您的阅读-------------