虽然 Git 同时提供了 GUI 界面 和 Bash,但是,GUI 界面的功能相对来说还是有点简陋的。要想熟练掌握 Git 的使用,还是需要了解 Git 一系列的命令!
Git 命令还是比较多的,后面我们以实际用到的功能来介绍。有个需要注意的地方就是命令的参数:参数分为简写和全称两种方式,但是功能完全相同! 例如:git clone -b xxxxx
与 git clone --branch xxxxx
其实是一模一样的,参数 --branch
简写为 -b
!但是,不是每一个参数都有简写,且在不同命令下,可能存在相同的简写,但是功能含义可能不同。下图是 Git 官网对于 Git 命令的分类列表
其中,红色框中的是我们平时常用的一些命令。
初始化仓库有两种方式:本地新建和克隆远程仓库,分别对应 git init
和 git clone
这两个命令!创建仓库后,会在指定的目录下生成一个 .git 的文件夹,其中存储 Git 管理我们代码需要的各种配置。
创建本地仓库相对比较简单,在我们想要建立仓库的文件夹中打开 Bash 命令框,执行 git init
命令即可。如下图:
完整的 git init
命令如下:
git init [-q | --quiet] [--bare] [--template=<template_directory>]
[--separate-git-dir <git dir>]
[--shared[=<permissions>]] [directory]
常用参数如下:
-q、--quiet
:仅打印错误和警告消息; 所有其他输出都将被抑制。--bare
:创建一个裸存储库。 如果未设置 GIT_DIR 环境,则将其设置为当前工作目录。下面是区别:config
文件中有些区别,其他文件完全相同!感觉这个命令用处不大啊!--template=
:指定将使用的模板的目录[directory]
:用于给出 Git 配置文件的路径(含名称)。如果不指定则表示当前目录。默认生成名字为 .git 的目录执行命令成功之后,在当前目录下生成一个名为 .git 的隐藏文件夹,Git 的所有配置文件就存在该文件夹中。接下来就可以在此文件夹(仓库)中,增删改自己的文件了。
使用 git init
初始化本地仓库之后,本地仓库是空的,连一个分支都是没有的! 如果此时进行创建分支则会报错。如下图所示:
我们也可以打开 .git 目录进行查看,会发现暂时没有 master 分支。如下图所示:
当我们提交一次修改之后,Git 会默认生成一个名为 master 的分支。
分支的默认名字 master,在 Git 中并没有任何特别的含义一样。 同时 “master” 是运行 git init
时默认的起始分支名字,原因仅仅是它的广泛使用。
以上方式创建的本地仓库只能本地使用,其没有与任何远程仓库关联!如果要关联远程仓库,则必须使用 git remote
命令进行关联。
Git 通常也会有个远程仓库。使用 git init
方式创建的本地仓库只能本地使用,其没有与任何远程仓库关联!远程仓库的增、删、改、查都是通过 git remote
命令来实现。
在 Git 中,会为关联的远程仓库创建一个本地名称,默认不显示指定时为 origin,这样我们在与远程仓库通信时,直接使用本地名称就可以了!例如,我们要将代码推送到以上关联的远程仓库,直接使用 git push origin
就可以了。以下是一些常用的命令参数
git remote -v
:参数 -v
== --verbose
。用于列出关联的远程仓库,格式为:本地名称 + 远程仓库地址。如下图:git remote add
:命令格式:git remote add [-t ] [-m ] [-f] [--[no-]tags] [--mirror=]
。关联一个远程仓库 git remote rename
:命令格式:git remote rename
。将名为 的远程仓库名重命名为。git remote rm
:命令格式:git remote remove
。其中,参数 --rm
是 --remove
的简写。删除关联的名为 与远程仓库相关的配置,均位于 工作目录下/.git/config
文件中,这是个文本文件,我们也可以直接打开改文件进行修改。
还有一点就是,一个本地仓库可以关联多个远程仓库! 如下图所示是增加了一个远程仓库之后的情况。
如上所示,建议在关联远程仓库的时候,指定一个本地名称,这样我们就可以很容易的知道关联情况。这个在我们往远程仓库提交代码是很有用处!
更新详细的说明,见独立的博文《Git 之五 通信协议(HTTPS、SSH、Git)、使用远程仓库(GitHub、GitLab、Gitee等)》!
远程仓库名字 “origin” 与分支名字 “master” 一样,在 Git 中并没有任何特别的含义一样。 同时 “master” 是运行
git init
时默认的起始分支名字,原因仅仅是它的广泛使用,“origin” 是当你运行git clone
时默认的远程仓库名字。 如果你运行git clone -o Gitx
,那么你默认的远程分支名字将会是 Gitx/master。
同样也非常简单,在我们想要保存远程仓库的文件夹中打开 Bash 命令框,执行 git clone https://github.com/ZCShou/N_W_Z_1.git
命令即可(注意将以上仓库地址换为自己的)。如下图:
该命令将远程存储库克隆到新创建的目录中,并为本地存储库中的每个分支创建远程跟踪分支,并创建和检出从远程存储库当前活动的分支派生出来的初始分支。该命令的完整格式如下:
git clone [--template=<template_directory>]
[-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror]
[-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
[--dissociate] [--separate-git-dir <git dir>]
[--depth <depth>] [--[no-]single-branch] [--no-tags]
[--recurse-submodules[=<pathspec>]] [--[no-]shallow-submodules]
[--[no-]remote-submodules] [--jobs <n>] [--] <repository>
[<directory>]
该命令常用参数如下:
-o 、--origin
:指定远程仓库的本地名称为 -b 、--branch
:用于克隆名为
:要克隆的(可能是远程的)存储库。
:指定保存克隆的仓库的本地目录名称。 如果没有明确给出目录,则使用远程库名字在当前目录。只有当目录为空时,才允许克隆到现有目录。克隆之后,默认会使用没有参数的 git fetch
将更新所有远程跟踪分支,并且没有参数的 git pull
将另外将远程主分支合并到当前主分支中(如果有的话)。其中也会有个 .git 的文件夹!
使用以上命令之后,本地仓库就会和以上指定的远程仓库管理关联,且会管理所有远程分支。在 Git 中,会为关联的远程仓库创建一个本地名称,不显示指定时默认为 origin。我们可以在以上命令中使用参数 --origin 本地名称
来指定本地名称(git clone --origin NWZ_xxx https://github.com/ZCShou/N_W_Z_1.git
)。
使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。 Git 的一大特点就是对于分支的支持!Git 的分支可谓是难以置信的轻量级,它的新建操作几乎可以在瞬间完成,并且在不同分支间切换起来也差不多一样快。
Git 引入了一个概念:upstream。一个分支的 upstream,其实就是与远程分支做关联,告诉 Git,默认此分支为推送及拉取的远程分支的信息。如下图所示:
更新详细的说明,见独立的博文《Git 之三 分支管理》!
当我们修改了仓库中的文件时,使用 git status
可以列出当前目录所有还没有被 Git 管理的文件和被 Git 管理且被修改但还未提交(git commit)的文件。
格式:$ git status [<options>…] [--] [<pathspec>…]
# git status 命令一般不用加参数,可能用到的参数如下:
$ git status -s # 将结果以简短的形式输出
如下图所示:
使用 git status
我们仅可以看到文件级别的更改,如果我们想要查看文件内部具体有哪些变动,则需要 git diff
命令。
git diff [<options>] [<commit>] [--] [<path>…]
git diff [<options>] --cached [<commit>] [--] [<path>…]
git diff [<options>] <commit> <commit> [--] [<path>…]
git diff [<options>] <blob> <blob>
git diff [<options>] --no-index [--] <path> <path>
如下图所示:
暂存英文叫 stage。一般存放在 .git
目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。在我们修改了仓库中的文件后,必须要将修改添加到 Git 中。使用 git add
命令要用于把我们要提交的文件的信息添加到索引库中。
格式:$ git add <参数> <path> # 文件名或者路径,支持通配符,多个文件可以用空格来隔开,省略表示用 . (点表示当前目录)
注意几个参数的区别:
$ git add . # 监控文件内容修改(modified)以及新文件(new),但不包括被删除的文件
$ git add -u # 仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)
$ git add -A # 是上面两个功能的合集,提交所有变化 等价于 git add *
$ git add -i # 交互式的方式进行添加
$ git add -h # 查看git add的帮助信息
如下图所示:
使用 git commit
命令提交的是暂存区里面的内容。git commit
创建一个新的提交,其中包含索引的当前内容以及描述更改的给定日志消息。 新提交是HEAD的直接子项,通常是当前分支的最顶端,并且分支被更新为指向它(除非没有分支与工作树相关联,在这种情况下,HEAD 是 “分离的”,如 git-checkout 部分的描述)。
格式:$ git commit <参数> <-F file/ -m "msg" ...>
注意几个参数的区别:
$ git commit -m # 提交说明。不用-m参数的话,git将调到一个文本编译器(通常是vim)来让你输入提交的描述信息
$ git commit -a # -a 选项可只将所有被修改或者已删除的且已经被git管理的文档提交倒仓库中。如果只是修改或者删除了已被Git 管理的文档,是没必要使用git add 命令的。
$ git commit --amend #用来修复最近一次commit. 可以让你合并你缓存区的修改和上一次commit, 而不是多出提交一个新的快照. 还可以用来编辑上一次的commit描述。注意:生成的commit是一个全新的commit, 之前的老的commit会从项目历史中被删除
例如:忘记了add一个文件:先 git add 忘记的文件,然后使用 git commit --amend --no-edit # 描述会是上一次commit的描述, --no-edit能让我们修复commit,而且不要修改commit描述.
再例如:又或者我们发现在提交时忘记使用 -a 选项,导致 Changes bu not updated 中的内容没有被提交:直接使用 git commit --amend -a 即可
如下图所示:
使用 git log
命令列出历史提交记录如下:
git log -p -2 # -p 选项展开显示每次提交的内容差异,用 -2 则仅显示最近的两次更新
如下图所示:
也可以使用 git log --oneline
命令列出历史提交记录的精简版,如下:
使用 git log --graph
命令查看历史中什么时候出现了分支、合并
git log --oneline --graph
如果只想查找指定用户的提交日志可以使用命令:git log --author=xxx
git log --author=Linus --oneline -5
如果你要指定日期,可以执行几个选项:–since 和 --before,但是你也可以用 --until 和 --after,如下:
git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges
git reset
命令将当前的分支重设(reset)到指定的或者HEAD(默认,如果不显示指定 commit,默认是 HEAD,即最新的一次提交)
格式:$ git reset [--hard|soft|mixed|merge|keep] [<commit>或HEAD]
并且根据 [mode] 有可能更新 index 和 working directory。mode 的取值可以是 hard、soft、mixed、merged、keep。下面来详细说明每种模式的意义和效果。
这部分见独立博文《Git 之五 通信协议(HTTPS、SSH、Git)、使用远程仓库(GitHub、GitLab、Gitee等)》