git深度学习(上)
文章目录
本教程主要介绍git本地操作,假定你已经理解git 工作区、缓存区(索引区)、HEAD之间的关系。
本git系列计划 分上 中 下三部分,
持续更新
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 <verb>
git <verb> --help
man git-<verb>
简明的帮助:
git <verb> -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 <选项> <file>
命令移除文件,但是如果文件已经提交,移除后还需要从缓存区删除 - 使用
git rm
进行移除缓存区的文件。- 如果工作区文件未删除,直接删除缓存区,会提示错误。应该先删除工作区文件,再删除缓存区文件。
- 如果本地文件和缓存区文件一致,使用
git rm --cached <file>
删除缓存区文件而保留工作区文件(适合删除不小心添加不必要的文件到缓存区但是还没提交)。 - 如果要删除缓存区和工作区有差异的文件,或强制删除工作区与暂存区的文件,则必须使用强制删除选项
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 <o_name> <n_name>
来实现工作区和缓存区的重命名。
# 例子
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"的相对日期。
附:
另外请允许鄙人推广一下,因为我的笔记分布CSDN、简书、知乎专栏等比较零散,管理起来比较麻烦,因此鄙人前几天终于思考再三申请了一个 微信公众号,会更加方便地发布更多有关生信息、统计方面内容,如果你觉得有需要欢迎关注。公众号如下:
我的微信公众号:进击的大肠杆菌
我想建立并管理一个高质量的生信&统计相关的微信讨论群,如果你想参与讨论,可以添加微信:veryqun 。我会拉你进群,当然有问题也可以微信咨询我。