实用命令
git ls-files #列出缓存区的文件
git cat-file <-p|-e|-t|-s> <类型> #( 可以是其中之一:blob、tree、commit、tag)查看提交的信息 eg.git cat-file -p HEAD
git ls-tree <树对象> #列举仓库/树中的文件
# 例子
git cat-file -p HEAD #显示了 HEAD 快照实际的目录列表,以及其中每个文件的 SHA-1 校验 和
git配置
git的配置文件:
可以通过config文件配置用户名,邮件,diff工具,写有排除列表的文件路径,merge工具等。
电脑所有用户
在配置git config
时带上--system
选项,配置文件存储在/etc/gitconfig
,那么它就会读写该文件中的配置变量。当前用户
如果只针对当前用户,配置文件存储在~/.gitconfig
中(或者~/.config/git/config
)可以使用--global
选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效。针对当前仓库
当前git目录下的.git/config
。可以传递--local
选项让 Git 强制读写此文件,(默认情况下用的就是它)
git会查找读取配置文件,首先在当前git目录下,然后在当前用户下,最后在系统用户下。覆盖级别依次递减。
我的
~/.gitconfig
内容[filter "lfs"]
clean = git-lfs clean -- %f
smudge = git-lfs smudge -- %f
process = git-lfs filter-process
required = true
[user]
name = superqun
email = superqun@qq.com
[core]
excludesfile = /Users/chenchaoqun/.gitignore_global
[difftool "sourcetree"]
cmd = opendiff \"$LOCAL\" \"$REMOTE\"
path =
[mergetool "sourcetree"]
cmd = /Applications/Sourcetree.app/Contents/Resources/opendiff-w.sh \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
trustExitCode = true
[commit]
template = /Users/chenchaoqun/.stCommitMsg
获取帮助 @ help
三种方法,获取完整的本地帮助:
git help
git --help
man git-
简明的帮助:git -h
获取git仓库
新建初始化仓库 @ init
该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件。但是,在这个时候,我们仅仅是做了一个初始化的操作,的项目里的文件还没有被跟踪。可用通过git add
和git commit
进行仓库构建。
git init #在当前目录下新建仓库
克隆已有仓库 @ clone
可以通过git clone
克隆一个已经存在的git仓库的完整拷贝。拷贝会在你当前文件夹下新建一个仓库名称的文件夹然后把仓库内容完整拷贝进去。
# 用法
git clone <选项> -- <仓库> <路径>
# 参数
-l, --local # 从本地仓库克隆
--single-branch # 只克隆一个分支、HEAD 或 --branch
# 例子
git clone https://github.com/libgit2/libgit2
#在当前文件夹下创建一个名为libgit2 的目录并创建一个初始仓库
git clone https://github.com/libgit2/libgit2 mylibgit
#在mylibgit文件夹下创建
git clone git@gitee.com:veryqun/super_test.git /Users/chenchaoqun/SUPER_QUN/git_test/hhaah
#在制定路径下创建
记录更新
文件状态 @ status
在对本地文件操作后,可以通过git status
查看文件状态
# 用法
git status <参数>
# 参数
-s #以简洁的格式显示状态
--long #以长格式显示状态(默认)
文件状态:
?? 4.txt
: 工作区新添加文件,未追踪A 4.txt
: 对文件追踪,添加到缓存区。AM 4.txt
: 在工作区对添加到缓存区的文件进行修改,还未提交时状态
跟踪新文件 @ add
对于新创建的文件,文件是处于untrack
状态,可以使用命令 git add
开始跟踪一个文件。
# 用法
git add <参数>
# 参数
-v,--verbose # 冗长输出,如果添加了新文件会返回添加信息。
-f, --force # 允许添加忽略的文件
-u, --update # 更新已跟踪的文件
-A, --all # 添加所有改变的已跟踪文件和未跟踪文件
忽略文件
对于不希望加入跟踪列表的,可以在仓库目录或者仓库中资源文件夹下建立.gitignore
文件,可以在文件中输入要忽略的文件。支持正则表达。
# 例如
*.[oa] #忽略所有以 .o 或 .a 结尾的文件
*~ #忽略所有名字以波浪符(~)结尾的文件
!lib.a #即使规定了忽略*.a 但是对lib.a除外
/TODO #忽略当前目录下的TODO文件 而对于其他目录下的TODO则不忽略
build/ #忽略任何目录下名为 build 的文件夹
doc/*.txt #忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/**/*.pdf #忽略 doc/ 目录及其所有子目录下的 .pdf 文件
文件比对 @ diff
通过git status
可以查看哪些文件被修改而没有提交,或者提交后修改。可以通过git diff
来具体查看文件哪里不同。
# 用法
git diff <参数> <file_1> <file_3>
# 参数
--cached # 比对已暂存文件与最后一次提交的文件差异
查看工作区和缓存区的文件差异:git diff
直接使用git diff
查看工作区和缓存区的文件差异,会列出所有差异的文件和差异内容。可以指定文件查看特定文件差异。
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。也就是修改之后还没有暂存起来的变化内容。
比较暂存文件与最后一次提交的文件差异:git diff --cached
提交更新 @ commit
在确定后缓存区文件正确后可以使用git commit
进行提交。提交时候加上参数-m
来对本次提交进行注释
# 用法
git commit [<选项>] [--] <路径规格>...
# 参数
-a,--all #提交所有改动的文件,使得不用git add追踪文件
-q, --quiet # 提交成功后不显示概述信息
-m,--message <说明> # 提交说明
-o, --only # 只提交指定的文件
--dry-run # 显示将要提交的内容
# 例子
git commit -m "第二次提交_22:10"
git commit -a -m "第二次提交_22:10" #不用单独使用git add
移除文件 @ rm
工作区移除,直接使用
rm
命令移除文件,但是如果文件已经提交,移除后还需要从缓存区删除使用
git rm
进行移除缓存区的文件。如果工作区文件未删除,直接删除缓存区,会提示错误。应该先删除工作区文件,再删除缓存区文件。
如果本地文件和缓存区文件一致,使用
git rm --cached
删除缓存区文件而保留工作区文件(适合删除不小心添加不必要的文件到缓存区但是还没提交)。如果要删除缓存区和工作区有差异的文件,或强制删除工作区与暂存区的文件,则必须使用强制删除选项
git rm -f
git支持通配符* 但是需要用
\
转义。eg.git rm log/\*.log
(删除 log/ 目录下扩展名为 .log 的所有文件)
# 用法
git rm [<选项>] [--] <文件>...
# 参数
-n, --dry-run #演习
--cached #只从索引区删除
-f, --force #忽略文件更新状态检查
-r #允许递归删除
# 例子
rm 23_20.txt & git rm 23_20.txt # 在本地和缓存区删除文件
rm -f a.txt #强制删除本地和缓存区文件
移动文件/重命名 @ mv
对于已经提交过仓库,如果需要对文件重命名,可以使用git mv
来实现工作区和缓存区的重命名。
# 例子
git mv <old_name > <new_name> #对工作区和缓存区文件重命名
查看提交历史 @ log
git 可以提供提交历史的信息。使用git log
命令查看提交历史等诸多详细信息。
git log 输出格式
git log
# 按时间先后顺序列出所有的提交,命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明
git log -p <-n>
git log -p -2 #例子
#显示n次最近提交的日志,详细记录每次提交的差异。如果不指定n则默认全部展示 eg.
git log --stat
#看到每次提交的简略统计信息展示出了git log提供信息外,还展示了被修改过的文件、有多少文件被修改了以及被修改过 的文件的哪些行被移除或是添加了。
git log --oneline
# 将每个提交放在一行显示,只展示commiID和 提交信息 以及HEAD指针指向
git log --pretty=<参数>
git log --pretty=oneline #例子
git log --pretty=format[选项内容]
git log --pretty=format%H #例子 只展示每次提交的完整哈希值
# 可以自己选择展示信息的内容
git log --oneline --graph
# 形象展示分支合并信息
# 例子
$ git log --stat
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
first commit
README | 6 ++++++
Rakefile | 23 +++++++++++++++++++++++
lib/simplegit.rb | 25 +++++++++++++++++++++++++
3 files changed, 54 insertions(+)
附:
git log --pretty=format 常用的选项
附:
git log 的常用选项
git log的输出过滤
git log输出格式确定后,可以通过限制最近n次提交、时间段、提交者等信息进行输出限定。
例如类似 --since 和 --until 这种按照时间作限制的选项很有用,git log --since=2.weeks
表示最近两周的所有提交。该命令可用的格式十分丰富——可以是类似"2008-01-15"的具体的某一天,也可以是类似"2 years 1 day 3 minutes ago"的相对日期。
附:
撤销操作
对上次提交撤回 @ git commit --amend
使用git commit --amend
对本地仓库的上次提交重新修改。可以未改变内容,主要用于修改提交备注。
活着修改了文件活着向缓存区添加了新文件,用于修改仓库内容。
主要用于“啊,忘了添加一个文件”或 者 “小修补,修正笔误”这种提交信息弄乱你的仓库历史。注意
使用
git commit --amend
会直接对上次提交内容直接覆盖!远程如果上次提交后同步了远程仓库,则修改后重新撤回提交,会导致报错,可以使用
git push -f
强制推送。
git commit --amend 相当于 git reset HEAD~ ; git commit
从仓库取文件到缓存/工作区 @ git reset HEAD
从仓库取文件到缓存/工作区
已经修改了两个文件并且想要将它们作为两次独立的修改提交, 但是却意外地输入 git add *
。暂存区文件添加多了,想要还原上次提交时候暂存区中某文件状态(未修改状态的文件)。显然git rm --cached 不合适,可以使用git reset HEAD
来在缓存区重置上次提交时候文件状态。
git reset HEAD 其实是从仓库中逆向抽取文件到缓存区,如果加上--hard
则会从仓库中抽取文件覆盖到缓存区和工作区。(如果工作区有文件未保存会丢失)
参数
git reset HEAD 其实是调整指针用的,默认参数是--mixed
表示重置HEAD和缓存区(索引);--hard
则会重置 HEAD、缓存区和工作区;--soft
表示只重置 HEAD,不影响缓存区和工作区
附加内容 ps
git reset 其实是重置了指针,原理是:reset 命令会以特定的顺序重写这三棵树,在你指定以下选项时停止:
移动 HEAD 分支的指向 (若指定了 --soft,则到此停止)
使索引看起来像 HEAD (若未指定 --hard,则到此停止)
使工作目录看起来像索引
git reset 的方式:git reset file.txt
:其实是git reset --mixed HEAD file.txt
的简写形式
我们可以不让 Git 从 HEAD 拉取数据,而是通过具体指定一个提交来拉取该文件的对应版本。我们只需运行类似 于git reset eb43bf file.txt的命令即可
从缓存区取文件到工作区 @ git checkout
指定文件:从缓存区取文件到工作区
可以使用git checkout --
来从缓存区覆盖文件到工作区。还可以指定某个分支的文件git checkout --
,跨分支会使文件同时提取到工作区和缓存区。不指定文件:切换branch。
一般性探究:git checkout 只能改变HEAD指针不能改变分支。(应该git中当前目录下是谁的文件就是处于谁的分支,git checkout 应该主要内容是读取分支内容,然后改变当前目录)因此可以使用git checkout 来取用其他分支中的文件到工作区。方法
git checkout --
参数:
# 用法
git checkout [<选项>] <分支> #切换分支
git checkout [<选项>] [<分支>] -- <文件>... #取文件到工作区和缓存区(跨分支提取)
# 选项/参数
-b <branch> #创建并检出一个新的分支
-B <branch> #创建/重置并检出一个分支
--overlay #使用叠加模式(默认)
-d, --detach #HEAD 从指定的提交分离
-f, --force #强制检出(丢弃本地修改)
撤销操作总结
远程仓库的使用
公钥配置
在~/.ssh/id_rsa.pub
文件中复制公钥内容(如果未有公钥,使用ssh-keygen -t rsa
命令生成公钥),然后在git网站中配置自己的ssh,添加公钥内容,则此电脑便会被远端识别。
添加远程服务器
使用命令git remote add
来添加远程某个仓库。
git remote add <rem_repo_name> <user@server:path/to/repo.gi>
# 远程仓库名字一般设置为origin,设置名字是为了多个远程仓库区分
# 例子:
git remote add origin git@gitee.com:veryqun/have_atest.git
远程仓库管理
查看信息:
可以在本地仓库文件夹下,使用以下命令查看远程仓库信息
git remote #查看已添加的远程仓库
git remote -v #显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL
git remote show <remote> #查看某仓库详细信息
删除、修改信息
可以使用git remote remove
删除远程配置,但一旦你使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。
git remote rename <old_name> <new_name> #修改远程仓库地址的简写
git remote remove <remote> #删除远程仓库的地址
注意:
在添加了远程仓库后,就可以使用远程仓库名称代替仓库网址了。
从远程取回
可以使用git fetch
或者git pull
来从远程抓取或拉取。
git fetchgit fetch
会访问远程仓库,从中拉取所有你还没有的数据。
git fetch 完成了仅有的但是很重要的两步:
从远程仓库下载本地仓库中缺失的提交记录
更新远程分支指针(如 o/master)
git fetch 实际上将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态。例如远程仓库在另一个终端提交了新文件,但是本地并没有远程仓库的改变,此时应该使用git fetch
来更新最新状态。然后如果想要把远程更新同步到本地可以使用git merge remote/branch branch
。
git pull
其实git fetch + git merge 相当于git pull
此操作会将远程的branch分枝同步到本地,然后和当前分支合并
打标签 @ tag
添加标签
标签分两种
轻量标签
轻量标签使用git tag
就可以直接对上次提交进行打标签注释标签
在添加标签时候为标签添加注释,git tag -a -m ""
git tag <version> #对上次提交添加标签
git tag -a <version> -m "" #对上次提交添加注释标签
列出标签
# 用法
git tag #列出所有存在的标签
git tag -l "v1.8*" #使用通配符列出标签
git show <tag> #显示提交内容和标签注释
# 例子
git show v1.4-lw
补充标签
如果是已经提交过之前的历史提交进行打标签需要git tag
例如git tag -a v1.2 9fceb02
共享标签
默认情况下,git push 命令并不会传送标签到远程仓库服务器上。可以在推送的时候通过 git push origin
来进行推送标签。
如果想要一次性推送很多标签,也可以使用带有 --tags
选项的 git push 命令。这将会把所有不在远程仓库 服务器上的标签全部传送到那里。
# 用法
git push <remote> <tag> #向远程推送标签,必须是本读存在的标签
git push <remote> --tags #远程仓库不存在的tag会一并从本地推送到远程仓库
# 例子
git push gitee t1.0
git push gitee --tags
删除标签
删除本地标签
使用git tag -d
来删除本地标签删除远程标签
使用git push :refs/tags/
来更新远程仓库的tag。这句话的意思是将冒号前面的空值推送到远程标签名,从而高效地删除它
# 用法
git tag -d <tag> #删除本地标签,但是远程标签不会随着新提交而消失
git push <remote> :refs/tags/<tag> #同步远程标签
git push <remote> --delete <tagname> #删除远程标签
# 例子
git tag -d t1.0
git push gitee :refs/tags/t1.0
git push gitee --delete t1.0
标签的检出
可以使用git checkout
来分离头指针,在分离HEAD指针状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任 何分支,并且将无法访问,除非通过确切的提交哈希才能访问。
直接在本地通过checkout哈希值或者远端分支也有类似的效果
可以通过git checkout -b version2 v2.0.0
命令来在tag v2.0.0所指的提交上新建一个名为version2的分支并检出该分支。