git config 配置

–list 查看当前git全局所有配置项信息

1
2
3
4
5
$ git config --list

user.name=xxx
user.email=xx@xx.com
core.excludesfile=/root/user

–global 配置git

1
2
3
$ git config --global user.name "xiaoming"        ## 配置用户名
$ git config --global user.email "xiaoming@xm.com" ## 配置邮箱
# git config --list 里所展示的项都可以去配置

配置命令别名

1
2
3
4
5
git config --global alias.co checkout      ## 定义命令别名  可以用co 来代替 checkout命令
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.last 'log -1 HEAD'

ps:

如果想找到这个配置文件所在位置 可以用 git config --list --show-origin 命令

当电脑上安装好git后首先需要配置下用户名和邮箱,这个是提交代码时要用到的,只需要配置一次,保存在全局的。

git init 创建一个空的Git仓库或重新初始化已有仓库

该命令创建一个空的Git存储库 - 本质上是一个 .git 目录,其中包含 objectsrefs/headsrefs/tags和模板文件的子目录。还将创建一个引用master分支 HEAD 的初始 HEAD 文件

git clone git克隆

1
git clone [-l] [-s] [--no-hardlinks] [-o <仓库别名>] [-b <分支名称>] <仓库地址> [<本地目录>]

-l , --local 克隆本地仓库(硬链接)

当要从中进行克隆的存储库位于本地计算机上时,此标志会绕过常规的“Git感知”传输机制,并通过为 HEAD 以及对象和引用目录内的所有内容创建副本以克隆存储库。尽可能将 .git / objects / 目录下的文件进行硬链接以节省空间

1
2
## $git clone -l <项目版本库地址> <新的版本库地址>
$ git clone -l ./testproject projectnew

从本地文件系统上的存储库进行克隆时,强制复制 .git / objects 目录下的文件,而不使用硬链接。如果您要备份存储库,则可能需要这样做。

1
2
## $git clone -l --no-hardlinks <项目版本库地址> <新的版本库地址>
$ git clone -l --no-hardlinks ./testproject projectnew

-s , --share(软连接)

当要克隆的存储库位于本地计算机上时,不使用硬链接,而是自动设置 .git/objects/info/alternates 与源存储库共享对象。生成的存储库开始时没有其自己的任何对象

1
2
## $git clone -l -s <项目版本库地址> <新的版本库地址>
$ git clone -l -s ./testproject projectnew

-o <仓库别名> , --origin <仓库别名> 修改默认的origin名称

不使用远程名称 origin 来跟踪上游存储库,而使用<仓库别名>

1
$ git clone -o house http://abc.com/cba.git    

-b <分支名称> , --branch <分支名称> 指定分支

不将新创建的 HEAD 指向克隆存储库的 HEAD 所指向的分支,而是指向<名称>分支。在非裸仓库中,这是将被检出的分支。 --branch 也可以使用标签并在生成的存储库中的提交时分离 HEAD。

1
$ git clone -b develop http://abc.com/cba.git   ## 克隆develop分支代码

git status 显示工作树状态

1
$ git status [-s] [-b] <文件地址>

显示索引文件和当前HEAD提交有差异的路径,工作树和索引文件有差异的路径,以及工作树中不被Git追踪的路径(也不被[gitignore5]忽略)。前者是你通过运行 "git commit "会提交的东西;第二和第三者是你在运行 "git commit "之前通过运行 "git add "可以提交的东西。

-s , --short 以简短的形式给出输出

1
2
$ git status -s         
M README.md

-b , --branch 显示分支和跟踪信息

1
2
3
$ git status -b     
## master...origin/master
M README.md

git add 添加内容到索引库

1
git add [-f] [-u] [--all] <文件地址>

该命令在工作树中找到的当前的内容以更新索引,为下一次提交准备暂存的内容。它通常会整体添加现有路径的当前内容,但是通过某些选项,它也可以用于仅添加对工作树文件所做的部分更改,或删除工作树中不存在的路径。

“索引”保存着工作树内容的快照,该快照作为下一次提交的内容。因此,在对工作树进行任何更改之后,以及在运行commit命令之前,必须使用add命令将所有新文件或修改过的文件添加到索引中。

-f , --force 允许添加已被忽略的文件

在git当中有些文件是被忽略的,使用add也不会添加到暂存库里,这里就需要-f参数来提交被忽略的文件。

1
$ git add -f index.html

-u , --update 添加索引库已有的内容到索引库

1
$ git add -u index.html 

-A , --all , --no-ignore-removal 整个工作树中的所有文件都将更新

1
$ git add --all

.gitignore 忽略文件

一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文 件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件的模式。

文件 .gitignore 的格式规范如下:

• 所有空行或者以 # 开头的行都会被 Git 忽略。

• 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。

• 匹配模式可以以(/)开头防止递归。

• 匹配模式可以以(/)结尾指定目录。

• 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。

.gitignore 文件的例子:

1
2
3
4
5
6
7
8
9
10
11
12
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf

git diff 显示提交、提交和工作树等之间的更改

–staged , --cached查看暂存区的变化

1
$

<分支名1> <分支名2> 查看分支之间的变化

1
$

git commit 记录对存储库的更改

1
2
3
4
5
6
7
8
git commit [-a | --interactive | --patch] [-s] [-v] [-u<mode>] [--amend]
[--dry-run] [(-c | -C | --squash) <commit> | --fixup [(amend|reword):]<commit>)]
[-F <file> | -m <msg>] [--reset-author] [--allow-empty]
[--allow-empty-message] [--no-verify] [-e] [--author=<author>]
[--date=<date>] [--cleanup=<mode>] [--[no-]status]
[-i | -o] [--pathspec-from-file=<file> [--pathspec-file-nul]]
[(--trailer <token>[(=|:)<value>])…] [-S[<keyid>]]
[--] [<pathspec>…]

-a , --all 跳过使用暂存区域提交

文件只要修改过而且提交过暂存区,不使用add就直接可以提交到本地仓库

1
$

-m <描述信息> , --message=<描述信息> 使用给定的描述作为提交消息

1
$

–date=<时间日期> 覆盖提交中使用的作者日期。

1
$

–amend 撤消最近提交操作

1
$

–amend --no-edit 使用之前的提交信息做提交

1
$

–author=<作者名> 覆盖提交作者

1
$

git log 显示提交日志

1
git log [<options>] [<revision range>] [[--] <path>…]

-<数量> , -n <数量> , --max-count=<数量> 显示多少条

1
$

-p , --patch 按补丁格式显示每个提交引入的差异(非常详细)

1
$

–stat 显示每次提交的文件修改统计信息(略详细)

1
$

–pretty=<oneline|short|full|fuller|format> 使用不同于默认格式的方式展示提交历史

1
$

format:‘

选项 说明
%H 提交的完整哈希值
%h 提交的简写哈希值
%T 树的完整哈希值
%t 树的简写哈希值
%P 父提交的完整哈希值
%p 父提交的简写哈希值
%an 作者名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 --date=选项 来定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期(距今多长时间)
%s 提交说明
1
2
3
4
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : changed the version number
085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
a11bef0 - Scott Chacon, 6 years ago : first commit

–graph 在日志旁以 ASCII 图形显示分支与合并历史

1
$

–abbrev-commit 仅显示 SHA-1 校验和所有 40 个字符中的前几个字符

1
$

–oneline 是–pretty=oneline和–abbrev-commit 合用的简写

1
$

–author=<作者名> 仅显示作者匹配指定字符串的提交

1
$

–since=<时间> , --after=<时间> 仅显示指定时间之后的提交

1
$

–until=<时间> , --before=<时间> 仅显示指定时间之前的提交

1
$

git remote 远程仓库管理

1
2
3
4
git remote [-v | --verbose]
git remote add [-t <branch>] [-m <master>] [-f] [--[no-]tags] [--mirror=(fetch|push)] <name> <url>
git remote rename <old> <new>
git remote remove <name>

-v 列出仓库地址

1
$ git remote -v

add <仓库别名> <仓库地址> 添加一个新的远程 Git 仓库,同时指定一个方便使用的名称:

1
$ git remote add origin http://gitserver/test.git

rename <旧仓库别名> <新仓库别名> 重名远程仓库名称

1
$ git remote rename origin neworigin

rm <仓库别名> , remove <仓库别名> 移除远程仓库

1
$ git remote rm origin

show <仓库别名> 查看远程仓库的更多信息

1
$ git remote show origin

git fetch 更新取回本地

1
2
3
4
git fetch [<options>] [<repository> [<refspec>…]]
git fetch [<options>] <group>
git fetch --multiple [<options>] [(<repository> | <group>)…]
git fetch --all [<options>]

git push 推送本地仓库代码到远程仓库

1
2
3
4
5
6
git push [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
[--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose]
[-u | --set-upstream] [-o <string> | --push-option=<string>]
[--[no-]signed|--signed=(true|false|if-asked)]
[--force-with-lease[=<refname>[:<expect>]] [--force-if-includes]]
[--no-verify] [<repository> [<refspec>…]]

-u <仓库别名> <远程分支名> , --set-upstream <仓库别名> <远程分支名> 将当前分支与远程分支建立关联

1
$

–all 推送所有本地分支到远程仓库

1
$

-f , --force 强制推送本地代码,覆盖远程分支 慎用

1
$

<仓库别名> :<远程分支名> 删除远程分支

1
$

<仓库别名> --delete <远程分支名称> 删除远程分支

1
$

<仓库别名> :refs/tags/<标签名称> 删除远程标签

1
$

<仓库别名> <标签名称|分支名称> 推送本地标签或分支到远程仓库

1
$

–tags 推送所有tag

1
$

git pull 拉取远程仓库代码

1
git pull [<options>] [<repository> [<refspec>…]]

–all 拉取本地所有关联仓库的代码

1
$

git tag

创建本地tag

1
$

-d <标签名称> 删除标签

1
$

-l , --list 查看本地tag列表

1
$

git branch 分支管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git branch [--color[=<when>] | --no-color] [--show-current]
[-v [--abbrev=<n> | --no-abbrev]]
[--column[=<options>] | --no-column] [--sort=<key>]
[--merged [<commit>]] [--no-merged [<commit>]]
[--contains [<commit>]] [--no-contains [<commit>]]
[--points-at <object>] [--format=<format>]
[(-r | --remotes) | (-a | --all)]
[--list] [<pattern>…]
git branch [--track | --no-track] [-f] <branchname> [<start-point>]
git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
git branch --unset-upstream [<branchname>]
git branch (-m | -M) [<oldbranch>] <newbranch>
git branch (-c | -C) [<oldbranch>] <newbranch>
git branch (-d | -D) [-r] <branchname>…
git branch --edit-description [<branchname>]

创建分支

1
$

-l , --list 查看本地分支列表

1
$

-d <分支名称> , --delete <分支名称>删除分支(merge)以防无意的信息丢失

1
$

-D 删除分支强制(未merge)

1
$

-m <旧分支名称> <新分支名称>, --move <旧分支名称> <新分支名称>移动、重命名分支

1
$

-c <被复制分支> <新分支> , --copy <被复制分支> <新分支> 复制分支

1
$

-r , --remotes 只显示远程分支

1
$

-a , --all 列出所有本地分支和远程

1
$

-u <仓库别名>/<远程分支> <本地分支> , --set-upstream-to=<仓库别名>/<远程分支> <本地分支> 本地分支关联到远程分支

1
$

git checkout 切换分支

1
2
3
4
5
6
7
git checkout [-q] [-f] [-m] [<branch>]
git checkout [-q] [-f] [-m] --detach [<branch>]
git checkout [-q] [-f] [-m] [--detach] <commit>
git checkout [-q] [-f] [-m] [[-b|-B|--orphan] <new_branch>] [<start_point>]
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <pathspec>…
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] --pathspec-from-file=<file> [--pathspec-file-nul]
git checkout (-p|--patch) [<tree-ish>] [--] [<pathspec>…]

切换到指定分支

1
$

-b <分支名>创建并切换到这个分支

1
$

-b <分支名> <仓库别名>/<远程分支> 建立一个本地分支与远程分支关联起来,并切换到这个分支

1
$

切换到某个commit 临时分支

通过git log 查看日志 得到 commitId

1
2
3
git checkout
git checkout -b xx commitId

-t <仓库别名>/<远程分支> 建立一个与远程分支一样名称的本地分支与之关联起来

1
$

git merge合并到当前分支

1
2
3
4
5
git merge [-n] [--stat] [--no-commit] [--squash] [--[no-]edit]
[--no-verify] [-s <strategy>] [-X <strategy-option>] [-S[<keyid>]]
[--[no-]allow-unrelated-histories]
[--[no-]rerere-autoupdate] [-m <msg>] [-F <file>] [<commit>…]
git merge (--continue | --abort | --quit)

–commit 合并并提交

1
$

–no-commit 合并后不会提交

1
$

–abort 抛弃当前合并冲突的处理过程并尝试重建合并前的状态

该命令仅仅在合并后导致冲突时才使用。git merge --abort将会抛弃合并过程并且尝试重建合并前的状态。但是,当合并开始时如果存在未commit的文件,git merge --abort在某些情况下将无法重现合并前的状态。(特别是这些未commit的文件在合并的过程中将会被修改时)

警告:运行git-merge时含有大量的未commit文件很容易让你陷入困境,这将使你在冲突中难以回退。因此非常不鼓励在使用git-merge时存在未commit的文件,建议使用git-stash命令将这些未commit文件暂存起来,并在解决冲突以后使用git stash pop把这些未commit文件还原出来

1
$

–stat 合并结果的末端显示文件差异的状态

1
$

-n --no-stat 不显示文件差异状态

1
$

-m <描述信息> 设置用于创建合并节点时的提交信息

1
$

git stash 临时保存 将更改隐藏在脏工作目录中

save <描述信息> 暂存当前修改

默认情况下,git stash会缓存下列文件:

  • 添加到暂存区的修改(staged changes)
  • Git跟踪的但并未添加到暂存区的修改(unstaged changes)

但不会缓存一下文件:

  • 在工作目录中新的文件(untracked files)
  • 被忽略的文件(ignored files)
1
$

-a , --all 保存当前目录下的所有修改

1
$

-p , --patch 按补丁格式显示每个提交引入的差异(非常详细)

1
$

list 查看已保存的列表

1
$

drop 移除保存

1
$

pop 读取最近一次保存的内容

这个指令将缓存堆栈中的第一个stash删除,并将对应修改应用到当前的工作目录下

1
$

apply 将缓存堆栈中的stash多次应用到工作目录中,但并不删除stash拷贝

1
$

clear 清除所有保存

1
$

branch 将当前保存生成新的分支

如果成功,将会丢弃储藏

1
$

git clear 清空 慎用

git submodule 子模块

如果主仓库想引入某些第三方仓库作为子目录可以使用git submodule命令

1
2
3
4
5
6
7
8
9
10
11
12
git submodule [--quiet:只打印错误信息] [--cached]
git submodule [--quiet] add [<options>] [--] <repository> [<path>]
git submodule [--quiet] status [--cached] [--recursive] [--] [<path>…​]
git submodule [--quiet] init [--] [<path>…​]
git submodule [--quiet] deinit [-f|--force] (--all|[--] <path>…​)
git submodule [--quiet] update [<options>] [--] [<path>…​]
git submodule [--quiet] set-branch [<options>] [--] <path>
git submodule [--quiet] set-url [--] <path> <newurl>
git submodule [--quiet] summary [<options>] [--] [<path>…​]
git submodule [--quiet] foreach [--recursive:递归] <command>
git submodule [--quiet] sync [--recursive] [--] [<path>…​]
git submodule [--quiet] absorbgitdirs [--] [<path>…​]

add添加子模块

1
$ git submodule add <repository> [<path>]

如:添加http://test.git仓库到主仓库的src/test目录

1
$ git submodule add http://test.git src/test

foreach遍历子模块执行shell命令

1
$ git submodule foreach <command>

如:为所有子模块执行更新命令

1
$ git submodule foreach git pull

deinit移除

1
$ git submodule deinit <submodule-name>

如:移除src/test子模块

1
$ git submodule deinit src/test

init初始化

通过.gitmodules向项目中的git进行子模块的注册

1
$ git submodule init

update更新

init之后,通过克隆缺失的子模块、获取子模块中缺失的提交和更新子模块的工作树来更新已注册的子模块

此操作之后才会将子模块的仓库内容更新下来

1
$ git submodule update