初始化配置
// 配置用户名
git config --global user.name "kang"
// 配置邮箱
git config --global user.email "1115610574@qq.com"
// 生成 SSH 密钥
ssh-keygen -t rsa -b 4096 -C "1115610574@qq.com"
// 彩色的 git 输出
git config --global color.ui true
// 设置默认编辑器为 vim
git config --global core.editor vim
// 模糊匹配你输错的命令,你将有 1.1 秒的时间改变注意
git config --global help.autocorrect 11
// 配置签署密钥
git config user.signingkey [your_singing_key]
代理
# HTTP/HTTPS 代理
git config --global http.proxy http://127.0.0.1:1080
git config --global https.proxy http://127.0.0.1:1080
git config --global http.proxy socks5://127.0.0.1:1079
git config --global https.proxy socks5://127.0.0.1:1079
# 取消
git config --global --unset http.proxy
git config --global --unset https.proxy
# SSH 代理: vim ~/.ssh/config
# in Windows
Host github.com # or gist.github.com
HostName github.com
User git
ProxyCommand connect -S 127.0.0.1:1079 %h %p # HTTP -> -H, Socks -> -S
# Unix like
Host github.com
HostName github.com
User git
# http 代理方法
# ProxyCommand socat - PROXY:127.0.0.1:%h:%p,proxyport=6667
# socks5 代理方法
ProxyCommand nc -v -x 127.0.0.1:1079 %h %p
# configure config file
$ chmod 600 ~/.ssh/config
$ chown $USER ~/.ssh/config
git指令
git config
: 配置 git--local
: 配置本地仓库,对应的文件为:.git/config
--global
: 配置用户仓库,对应的文件为:~/.gitconfig
或~/.config/git/config
--system
: 配置系统仓库,对应的文件为:/etc/gitconfig
--list
: 显示当前的 git 配置credential.helper [cache --timeout <seconds> | store --file <path>]
: 将凭证存在在缓存或磁盘中,如果是store
会默认放在~/.git-credentials
中,可以指定path
core.editor [vim | emacs]
: 配置默认编辑器commit.template [file]
: 配置默认提交模板core.pager [less | more | '']
: 配置log
或diff
等命令的分页器user.signingkey [gpg-key-id]
: 配置 GPG 密钥,配置好后,使用git tag
会直接签署标签core.excludesfile [~/.gitignore_global]
: 配置指定的忽略文件。使用该命令,可以全局忽略某类文件help.autocorrect [11]
: 模糊匹配你输错的命令,你将有 1.1 秒的时间改变注意color.ui [false | auto | always]
: 设置颜色输出。也可以指定:color.branch
,color.diff
,color.interactive
,color.status
[merge.tool | diff.tool] [kdiff3 | vimdiff]
: 设置合并或比较的工具core.autocrlf [true | input | false]
: 解决换行符问题,true
在提交时把 CRLF 换成 LF ,检出时换成 CRLF ;input
在提交时把 CRLF 换成 LF ,检出时还是 LF ;false
不会更改换行符core.whitespace
: 探测和修正多余空白字符。blank-at-eol
,查找行尾的空格;blank-at-eof
,盯住文件底部的空行;space-before-tab
,警惕行头 tab 前面的空格;indent-with-non-tab
,揪出以空格而非 tab 开头的行(你可以用tabwidth
选项控制它);tab-in-indent
,监视在行头表示缩进的 tab;cr-at-eol
,告诉 Git 忽略行尾的回车。trailing-space
涵盖了blank-at-eol
和blank-at-eof
receive.fackObjects true
: 确认每个对象的有效性以及 SHA-1 检验和是否保持一致。在每次推送生效前检查库的完整性,确保没有被有问题的客户端引入破坏性数据。注意,该操作很小号时间receive.denyNonFastForwards true
: 禁止非快速合并推送到远程仓库,-f
也不行receive.denyDeletes true
: 禁止删除分支和标签
git init
: 创建版本库(最好在空目录下创建版本库)
git clone [url | path]
: 克隆远程版本库--depth <n>
: 指定克隆最新的n
此深度
git add
: 该命令使用 文件 或 目录 的路径作为参数;如果参数是目录的路径,该命令会递归地跟踪该目录下的所有文件.
: 将所有修改和新建的文件添加到暂存区中去-u
: 添加 追踪 的文件到暂存库。意思是未追踪的文件不会更新。[-i | --interactive]
: 交互式暂存[-p | --patch]
: 进入交互式暂存中的暂存补丁。当然,可以使用git reset --patch
命令的补丁模式来部分重置文件, 通过git checkout --patch
命令来部分检出文件与git stash save --patch
命令来部分暂存文件
git rm [file]
: 从版本库中删除文件.和先手动删除文件,然后使用git rm [file]
和git add [file]
效果是一样的。-r [file]
: 可以删除文件夹--cached [file]
: 删除 暂存区 里的文件,该文件还在当前工作目录中
git commit
: 将暂存区的所有内容提交到当前分支.-m [message]
: 添加提交信息-am [message]
: 跳过暂存区,直接提交--amend
: 重新提交,会修改最后一次提交的 SHA-1 值。所以如果该提交已经推送到远程,要考虑重新提交的后果--amend --no-edit
: 重新提交,但该命令可以不会修改提交信息,直接更改--allow-empty
: 允许提交一个空 commit-S
: 签署提交,前提是有 GPG 密钥
git status
: 查看当前暂存区中的状态[-s | –-short]
: 将得到一种格式更为紧凑的输出。左栏表示暂存区状态,右栏表示工作区状态。 未跟踪文件为??
-sb
: 以简略信息查看分支状态
git diff
: 查看工作区与暂存区的差异[file]
: 查看版本和版本,以及版本和工作区的区别,这个版本可能在缓存区,也可能在仓库的当前分支。HEAD -- [file]
: 查看file
文件在工作区和版本库里面最新版本的区别git diff
: 如果对应的文件已经改动放入暂存区中,就是未暂存与暂存区文件之间的差异,反之,是未暂存与最后一次提交文件的差异--[staged | cached]
: 查看 以暂存 文件与最后一次提交文件的差异git difftool --tool=gvimdiff --staged
: 使用 gvim 工具来查看差异--check
: 将暂存区文件中的空白错误(结尾空白和文件尾部空行)全部显示出来[branch1]...[branch2]
: 比较branch1
和branch2
的共同祖先和branch2
的差异,该命令可以让你查看branch2
基于branch1
做了写什么,直接使用diff branch1
可能会造成混乱--word-diff
: 以单词为单位来进行差异比较[-b | --ignore-space-change]
: 忽略行尾的空白,并将一个和多个空白视为等效。简单来说就是去除空格差异[-1 | --base]
: 在差异合并中,比较工作树与祖先分支上的内容[-2 | --ours]
: 在差异合并中,比较工作树与你的分支上的内容[-3 | --theirs]
: 在差异合并中,比较工作树与合并分支上的内容--submodule
: 查看子模块的差异中的新添加的提交列表
git log [file]
: 按照时间顺序列出所有提交file
: 只显示对应文件的日志git reflog
: 查看引用日志,该日志记录了最近 HEAD 和分支引用所指向的提交-g [branch]
: 使用git log
输出格式查看引用日志--oneline
: 将输出信息简洁成一行--graph
: 查看分支合并图--all
: 查看全部分支信息[ -p | --patch]
: 会显示每次提交文件的差异-n
: 如 -2 ,只显示最近两次提交日志–-stat
: 查看每次提交的简略信息--pertty
: 使用不同的格式展示提交记录,具体方式用git log --help
看文档-S [string]
: 显示添加或删除内容匹配string
的提交。-–grep
: 显示提交说明中包含指定字符串的提交--no-merges
: 显示不是合并的提交。与之对应的是--merges
[refA]..[refB]
^[refA] [refB]
[refB] --not [refA]
三条命令等价,后两条命令在于支持多点,它们的作用是:查看在refB
中而不再refA
中的提交。注:不包含refA
--show-signature
: 将在输出中查看签名-S [string]
: 查找string
是什么时候引入的-G [regular]
: 匹配正则表达式regular
是什么时候引入的--left-right
: 标记提交属于那一侧,通常为 三点提交区间 常用命令,左侧为<
,右侧为>
--merge
: 与--merges
不同,它是合并冲突后,只显示合并冲突文件的提交--cc
: 查看 组合式差异 ,第一列显示ours
分支与工作目录的区别,第二列显示theirs
分支与工作目录区别。这里 区别 要提一点,增加,删除会用+
-
来表示,没有改动也就没有来表示
git reset
: 与checkout
不同的是,它会的移动分支的指向。更详细的内容请看 这里--soft [hash | file]
: 移动 HEAD 指针,不会改变暂存区和工作目录[--mixed] [hash | file]
(默认选项) : 移动 HEAD 指针,并将暂存区同步到对应hash
上。不会改变工作目录--hard [hash | file]
: 移动 HEAD 指针,并将暂存区、工作目录同步到对应hash
上。并不会将未追踪文件移除[file]
: 是git reset --mixed HEAD [file]
的简写,将暂存区文件与 HEAD 同步,看起来就像是取消暂存文件[hash] [file]
: 将指定hash
提交中的file
文件,放到索引中(暂存区)
git revert [hash]
: 还原提交,它将会撤销一个已存在提交的所有修改,并生成一个提交,与reset
不同的是,它不会修改提交历史-m [1 | 2]
: 选择要保留下来的父节点。1
是与ours
分支的父节点完全一样,2
是与theirs
分支的父节点完全一样
git checkout
-
: 切换至上一个分支-- [file]
: 把file
文件在工作区的修改全部撤销(对未追踪文件无效),这里有两种情况:- 一是
file
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态; - 一是
file
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
[hash] [file]
: 可以看成git reset --hard [hash] [file]
,会将索引和工作区的指定文件替换。此唯一的区别是加上了hash
值[branch | tag_name]
: 切换分支为branch
或检出到tag_name
对应的commit
,如果是hash
值,就是我们通常说的分离头指针。如果工作区有修改的文件,该命令会提示处理该文件,而git reset --hard [hash]
不会检查,直接替换-b [branch] [commit | tag_name | remote/branch]
: 创建branch
分支,然后切换到branch
分支,相当于git branch branch
和git checkout [branch]
两条命令。后面可以指定提交和标签--track [remote/branch]
: 是-b [branch] [remote/branch]
的缩写,会创建branch
分支--conflict=[merge | diff3] [file]
: 重新检出文件并合并冲突标记,merge
是比较ours
和theirs
版本,diff3
加上了base
版本。可以设置(config)merge.conflictstyle
来确定那个做为合并冲突的默认选项--ours [file]
: 解决冲突,只要ours
部分--theirs [file]
: 解决冲突,只要theirs
部分
git branch
: 查看当前分支-v
: 相对于git branch
,这会将展示 hash,ahead or behind,提交信息-vv
: 相对于-v
,这将会展示跟踪的上游分支[name]
: 创建分支-d [branch]
: 删除branch
分支-D [branch]
: 强制删除branch
分支[-u | --set-upstream-to=] [origin/dev] [dev]
: 将远程origin/dev
与本地dev
链接起来-f [master] [hash]
: 将 master 分支移动到哈希值为 hash 的 commit 上--merged [branch]
: 查看哪些分支已经合并到当前分支,包括当前分支。当然也可以指定分支--no-merged [branch]
: 查看哪些分支没有合并到当前分支。当然也可以指定分支
git switch
(new) :-c [dev]
: 创建并切换到新的dev
分支master
: 切换分支为master
git merge [branch | hash]
: 把bramcj
分支或哈希值为hash
的工作成果合并到 当前 分支上。如果合并冲突,会产生一个MERGE_HEAD
指针,指向合并分支--no-ff -m [message] [branch]
: 禁用Fast forward
的合并分支方法--allow-unrelated-histories
: 允许合并的两个提交来自不同的树,或者说允许合并无关的历史记录。[@{u} | @{upstream}
: 用法与git merge origin/master
一样,只不过这里@{u}
对应当前分支的 上游分支--squash [branch]
: 接受被合并的分支上的所有工作,并将其压缩至一个变更集,然后提交到目前所在分支上--verify-signatures
: 在合并时,检查并拒绝没有携带可行 GPG 签名的提交[-X | --strategy-option=](下同) ignore-all-space
: 在合并时,完全忽略空白修改-X ignore-space-change
: 在合并时,将一个空白符与多个连续的空白字符视作等价-X ours
: 在合并时,如果发生冲突的话,选择ours
分支上的内容-X theirs
: 在合并时,如果发生冲突的话,选择theirs
分支上的内容-X patience
: 可以很好的解决 括号丢失或符号不匹配的问题- 更多
-X
选项,请看 这里
[-s | --strategy=] [ours]
: 使用ours
合并策略,与默认的recursive
不同,只同步ours
分支的修改。更多策略请看 文档
git merge-file <current-file> <base-file> <other-file>
: 将三个文件合并,可以看成三方合并-p
: 将结果发送到标准输出(可以用>
来接受),而不是覆盖current-file
--ours
: 发生冲突选择current-file
上的内容--theirs
: 发生冲突选择other-file
上的内容
git push [remote_name] [local_branch | local_branch:remote_branch]
: 推送[origin] --all
: 将所有分支推送到 origin 远程库上。[origin] [tagname]
: 将某个标签推送到远程[origin] --tags
: 将全部标签推送到远程[origin] :refs/tags/[tagname]
: 删除一个远程标签。[origin] --delete [branch | tag]
删除远程仓库的分支、标签[-u | --set-upstream] {do something}
: 推送代码,并追加跟踪分支-f
: 强制推送
git pull [remote_name] [remote_branch]:[local_branch]
: 按照git branch
设置的默认跟踪的服务器和分支来拉取。git pull
=git fetch + git merge
git pull --rebase
:git fetch + git rebase
git fetch [remote_name]
: 从远程仓库中获取信息,并会将拉取该远程仓库的所有分支。[remote_name] [remtoe_branch]:[local_branch]
: 指定分支--all
: 同步所有远程仓库
git stash
: 将目前已修改的文件和暂存改动保存到一个栈上。(不会保存 未跟踪 文件,而且还原时会将 已暂存 转成 已修改)list
: 查看贮藏的工作现场的列表apply [id]
: 恢复贮藏名为id
的工作现场,对 stash 栈并无影响。drop [id]
: 删除贮藏名为id
的工作现场pop
: 恢复栈顶的工作现场,并删除 stash--index
: 使用该选项,可以重新应用 以暂存 的修改[-u | --include-untracked]
: 将 未跟踪 文件也保存到栈上[-a | --all]
: 将忽略文件也贮藏起来--keep-index
: 贮藏所有内容,并将他们保留在暂存区[-p | --patch]
: 交互式贮藏branch [branchname] [id]
: 在贮藏名为id
的提交上,创建名为branchname
的分支,并检出。注意,这条命令会丢弃贮藏
git cherry-pick [commit id]
: 将commit id
中的内容合并到当前分支上,应用时间和 SHA-1 值会改变
git remote
: 查看远程库-v
: 显示远程库的名称与其对应的 URLadd [name] [url]
: 添加一个新的远程仓库,并指定名称为name
show [remote_name]
: 查看该远程仓库更详细的信息rename [name_form] [name_to]
: 远程仓库重命名,同样也会修改你所有远程跟踪的分支名字。 那些过去引用name_form/master
的现在会引用name_to/master
。[remove | rm] [name]
: 移除一个远程仓库,会将所有和这个远程仓库相关的远程跟踪分支以及配置信息一并删除prune [origin]
:origin/dev
本地存在,但远程仓库中已经不存在了,可以使用这个命令删除origin/dev
git rebase
: 变基,把本地未push的分叉提交提示整理成直线[branch | hash]
: 如果是 FF 将目前分支指向对应的 commit;如果不是 FF 将目前指针变基到branch
上。branch
不动。-i [hash | branch]
: 交互式变基,更方便的调整提交记录。修改 hash 的子节点至 HEAD 的提交记录。这是一个变基命令,所以 SHA-1 值会被重写。详细内容[basebranch] [topicbranch]
: 将主题分支变基到目标分支(basebranch)上,basebranch 不动--onto master server client
: 取出client
分支,找出它从server
分支分歧之后的补丁, 然后把这些补丁在master
分支上重放一遍,让client
看起来像直接基于master
修改一样--onto [newparent] [oldparent] [until]
:newparent
不动,将oldpaprent
的 子提交 至until
,放到newparent
之后,其中until
不是必须,没有until
选项就会一直更新到oldparent
的最新提交。更详细的内容,可以看 这里
git tag
: 查看所有标签[tag_name]
: 创建一个轻量标签(lightweight),给当前commit
打上标签名为tag_name
的标签[tag_name] [commit_id]
: 给指定的commit id
打上标签-a [tag_name] -m [message] [commit_id]
: 创建一个附注标签(annotated)-a
指定标签名,-m
指定说明文字-d [tag_name]
: 删除标签,注:该命令并不会删除远程仓库的标签git push origin :refs/tags/v1.0
: 删除远程仓库对应的标签git push origin --delete [tag_name]
: 删除远程仓库对应的标签
[-l | --list]
: 可以使用通配符查找标签,如:git tag -l "v.1.8.5*"
[-s | -sign]
: 使用默认的电子邮箱来制作一个 GPG 签名。首先的保证你有 GPG 钥匙- 共享标签
git push origin [tag_name]
: 将tag_name
推送到远程仓库git push origin --tags
: 把所有不再远程仓库上的标签全部传送到远程仓库上
git show
: 查看当前节点的提交情况[hash | branch | tagname]
: 查看当前对应 commit 的信息object
: 显示对象中的内容,包括 tree ,blob 都可以显示:1:[file]
: 在合并冲突的情况下,获取 stage 1 版本的file
文件。该命令其实就是查找该 blob 的值hash^@
: 展示该提交的所有父提交
git clean
: 从工作目录中移除 未追踪 的文件[-f | --force]
: 强制移除文件-d
: 递归移除未跟踪的目录-n | --dry-run
: 使用该命令会查看会删除那些文件,在使用-f
删除-x
: 将忽略文件也一并删除[-i | --interactive]
: 交互式删除
git restore
: 将以修改文件变成未修改--staged [file]
: 取消文件的暂存
git describe
: 生成一个构建号:,由最近的标签名、自该标签之后的提交数目和你所描述的提交的部分 SHA-1 值(前缀的g
表示 Git)构成。只能匹配附注标签--tags
: 加上之后能够匹配轻量标签
git grep [string] [*.c | v1.8]
: 在工作目录下查找string
字符串[-n | --line-number]
: 在查找的结果中显示行号[-c | --count]
: 显示每个文件中包含了多少匹配[-p | --show-function]
: 显示每一个匹配的字符串所在的方法或函数
gitk
: 使用 Git 内置图形化工具–all
: 显示所有分支
gitignore
: 指定不需要 Git 管理的文件
格式规范:所有 空行 或者以
#
开头的行都会被 Git 忽略。- 可以使用标准的 glob 模式(简化的正则表达式)匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(
/
)开头 防止递归。 - 匹配模式可以以(
/
)结尾 指定目录。 - 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(
!
)取反。
具体例子:
.c
: 以.c
结尾的文件,也就是后缀为 c 的文件。/TODO
: 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODObulid/
: 忽略任何目录下名为 build 的文件夹doc/*.txt
: 忽略 doc/notes.txt,但不忽略 doc/server/arch.txtdoc/**/*.pdf
: 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
git rerere
: 直接使用,会将本地以重写的文件,按照上次来重写该功能是一个隐藏功能,全称为:重用记录的解决方案(reuse recorded resolution)。能让 Git 记住解决一个块冲突的方法, 在下一次看到相同冲突时,Git 可以自动地解决它。。更多内容看 这里)
- 使用时输入
git config rerere.enabled true
开启,或创建.git/rr-cache
目录来开启它 status
: 合并前的状态diff
: 显示解决方案的当前状态,并会记住输出的内容,以便下次合并时自动解决
注:这里既可以是 合并 ,也可以是 变基
git merge-base [branch1] [branch2]
: 输出branch1
和branch2
的公共祖先
git shortlog
: 查看项目简短信息
git archive master
: 发布文件git archive master | gzip > v1.0.tar.gz
: 创建一个压缩包,内容基于master
分支,名称为 v1.0.tar.gz
`` git archive master --prefix='project/' --format=zip >
git describe master`.zip
用 zip 来打包文件
-
`--prefix='project/'` : 将项目重命名为 `project` ,注意后面的斜杠
-
`git blame [file]` : 文件标注,查看每一行来自最后的提交和提交者,如果该行自第一次提交后从未修改,会在提交前加上 `^`
- `-L <start>:<end> [file]` : 限制输出文件的第 start 行到 end 行
- `-C [<num>]` : 找出文件中从别处复制过来的代码片段的原始出处
- `-M [<num>]` :检测文件中移动或复制的行
-
`git bisect` : 二分查找那个提交错误,可以使用工具来让查找自动化
- `start [old] [new]` : 开始查找,不指定提交,就是全部提交
- `good [hash]` : 该提交正常
- `bad [hash]` : 该提交错误
- `reset` : 手动退出二分查找模式
-
`git submodule` : 子模块,会将一个 Git 仓库作为另一个 Git 仓库的子目录。能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。
- `add [url] [path]` : 添加子模块,可以通过指定 `path` 放到不同路径去
- `init` : 初始化本地子模块配置文件(克隆一个新项目时)
- `update [--init [--recursive]]` : 更新子模块数据,`--init` 可以更新子模块,`--recursive` 可以更新嵌套的子模块。在子模块中检出 以拉取 的远程分支,也可以用该命令
- `git clone --recurse-submodules [url]` : 克隆仓库,并初始化并更新子模块,包括嵌套的子模块
- `update --remote [submodule] [--merge | --rebase]` : 将 `submodule` 更新到最新提交,不加 `submodule` 就是更新所有子模块。可以指定 `merge` 或 `rebase` 来让更新自动合并
- `sync [--recursive]` : 更新子模块中的 `url`,加上 `–recursive` 可以嵌套到子模块中
- `foreach 'command'` : 在所有子模块中运行 `command` 命令
> `git pull` 会递归地拉取子模块的更改,当不会更新子模块
-
`git bundle` : 将 `git push` 所传输的内容打包成一个二进制文件
- `creat [file] [git-rev-list args]` : 创建一个名为 `file` 的捆绑包,需要一个 [提交区间](https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E9%80%89%E6%8B%A9%E4%BF%AE%E8%AE%A2%E7%89%88%E6%9C%AC#_commit_ranges) 来定义捆绑的内容。如 `master~10..master` 或 `^master~10 master` 。如果只写一个分支,就会将该分支的所有提交捆绑成一个文件。
- `verify [file]` : 验证 `file` 是否是一个合法的 Git 包
- `list-heads [file]` : 列出 `file` 中定义的引用,常用来查看包里有哪些分支
- 如果打包文件是一个完整的项目,可以使用 `git clone [file] [-b branch]` 来克隆出该项目,如果是增补提交,可以使用 `fetch` 或 `pull` 来从文件中导入提交
-
`git replace [object] [replacement]` : 将当前分支的 `object` 提交替换成 `replacement`。这种替换不是真正的替换,只是一种假象,但在实际使用的过程中没有问题,在底层中可以查看
-
`git credential` : Git 凭证辅助工具。注意:凭证系统调用的程序和 Git 本身相互分开的
- `fill` : 查看对应 协议和主机名 的凭证
- `git credential-[cache | store]` : 与 `git credential` 不同的是,该命令指定了存储类型
- `get` : 请求输入一对用户名和密码,输出对应的凭证
- `store` : 请求保存一个凭证到辅助工具的内存
- `erase` : 将给定的证书从辅助工具内存中清除
-
`git fsck --full` : 检查数据库中的数据,有哪些是与当前所有的分支无关联的。这是没有 `reflog` 日志后的最后一根稻草
-
`git prune --expire now` : 移除未加入版本控制的文件
## 底层命令
-
`git ls-remote [remote]` : 查看服务器 `remote` 上所有分支,标签和其他引用
-
`git rev-parse [branch | tag]` : 查看某个分支或标签的 SHA-1 值
-
`git cat-file` : 查看哈希值的属性
- `-t [hash]` : 查看 hash 的类型(`commit` `tree` `blob` `tag`)
- `-p [hash | master^{tree}]` : 查看 hash 中的内容,或者查看 `master` 分支上最新的提交所指向的树对象
- `-s [hash]` : 查看该对象有多大,通常以字节为单位
-
`git ls-tree` : 列出树对象的内容
- `-r` : 递归直树,将子树中的内容也显示出来
-
`git ls-files` : 显示索引和工作树中的文件信息
- `-s` : 显示索引中的内容(相当于显示暂存区,也相当于查看 `.git/index` 内容)
- `[-u | --unmerged]` : 只显示未合并的文件(可以看出三方合并)。stage 1 是祖先版本,stage 2 是你的版本,stage 3 来自 MERGE_HEAD
-
`git read-tree [tree-hash]` : 将树对象读入索引(暂存区)
- `--prefix=[rack/] -u [rack_branch]` : 将 `rack_back` 分支内容拉取到当前分支中的 `rack` 子目录。只会拉取文件内容,不会拉取 `.git` 中的内容
- `--prefix=[dir]` : 将树对象读入 `dir` 目录中
-
`git commit-tree [tree-hash]` : 基于数对象,创建基础提交,该提交是一个全新的、无父节点的提交
- `-p [commit-hash]` : 指定父提交
-
`git for-each-ref` : 输出每个引用信息
-
`git rev-list` : 以相反的时间顺序列出提交对象
- `--objects` : 列出所有提交的 SHA-1 、数据对象的 SHA-1 和与他们相关联的文件路径
- `--all` : 展示所有的 commit-hash
-
`git show-ref` : 会列出当前分支的 `hash` 值,包括远程分支
-
`git hash-object [file]` : 将数据保存到 `.git/objects` 中
- `-w` : 将输出的对象写入数据库(`.git/objects`)中
- `--stdin` : 从标准输入读取内容,如果不指定此项,则要在命令 尾部给出待存储文件的路径
-
`git update-index [文件模式(100644)] [blob-hash] [file]` : 把文件加入到暂存区中
- `--add` : 对于一个未追踪文件,要加该选项
- `--cacheinfo` : 对于添加的文件在 Git 数据库中,要加该选项
-
`git write-tree` : 将暂存区内容写入一个树对象
-
`git update-ref ref/[heads]/[master] [hash]` : 指定 `hash` 加入到 `ref/heads/master` 引用中去,也可以是未创建的新引用
-
`git symbolic-ref [HEAD]` : 查看 HEAD 的符号引用
- `git symbolic-ref [HEAD] refs/heads/test` : 将 HEAD 的符号引用设置为对 `refs/heads/test` ,如果没有该符号引用,该命令会报错
-
`git gc` : 将所有的松散对象打包至包文件中,将多个包文件合并为一个大的包文件,移除与任何提交都不相关的陈旧对象,并将引用打包到一个单独的文件 `.git/packed-refs`。一般情况,需要 7000 个以上的松散对象和超过 50 个包文件,才能让 Git 启动一次真正的 gc 命令。
-
`git verify-pack` : 查看打包的内容
-
`git count-objects -v` : 查看 Git 仓库占用空间大小
## 远程仓库
#### 把本地仓库的内容推送到GitHub上
`git remote add [origin] [SSh或HTTP地址]` : `origin`是远程库的名称,可以自己修改,但`origin`是Git的默认叫法<br />`git push -u [origin] master` : 将本地库的内容推送到远程上(通常是第一次将本地仓库推送到远程仓库).由于远程库是空的,我们第一次推送`master`分支时,加上了`-u`参数,Git不但会把本地的`master`分支内容推送的远程新的`master`分支,还会把本地的`master`分支和远程的`master`分支**关联起来**,在以后的推送或者拉取时就可以简化命令。不用每次指令分支<br />以后在本地做了提交就可以通过命令`git push origin master`把本地`master`分支的最新修改推送至GitHub
#### 从远程库克隆
`git clone [SSH or HTTP address]` : 将远程仓库克隆到本地<br />`git clone` 有 **哑协议** 和 **智能协议** 之分。
## 别名
git config —global alias.co checkout git config —global alias.br branch git config —global alias.ci commit git config —global alias.st status
git config —global alias.gl git log —graph —pretty=’%C(yellow)%h%Creset -%C(auto)%d%Creset %s %Cgreen(%cr)<%an>%Creset’ —all
## 小技巧
`git config --global push.default simple` : 设置 Git 命令 push 的默认模式为 `simple`,当我们执行 `git push` 没有指定分支时,自动使用当前分支,而不是报错。(慎用)<br />`git config --glocal pull.rebase true` : 设置 `git pull` 使用 `rebase` 而不是 `merge`<br />`git shortlog -sn` : 列出代码仓库的提交者统计<br />`git branch master [commit] -f` : 强制将 master 指针指向 commit 提交记录<br />`git config --global credential.helper cache` : 使用 HTTPS 推送时,将用户名和密码保存在内存中 15 分钟时间。(还有一个 `store --file <path>` 参数,可以看 [文档](https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E5%87%AD%E8%AF%81%E5%AD%98%E5%82%A8#_credential_caching) )<br />`git config --local remote.pushDefault [origin]` : 将默认推送仓库设置为 origin<br />`rm -rf .git` : 删除本地仓库
## 命令输出
git push origin master … To git@github:simplegit.git 1edee6b..fbff5bc master -> master
``
上述提交完成后的消息格式为:
。
oldref是**推送前本地远程分支**所指向的引用,
newref是**推送后本地远程分支**所指向的引用,
fromref是将要被推送**本地**引用的名字,
toref` 是将要被更新的远程引用的名字
补丁操作
git format-patch
: 生成补丁,可以邮寄给对方来合并提交。该补丁的文件类型为mbox
git format-patch [branch]
: 当前HEAD
基于分支branch
作比较,相比有几次提交就生成几个补丁文件。-M
: 告诉 Git 查找重命名
git apply [*.patch]
: 将补丁中的修改引用到工作目录,但是需要手动暂存并提交。该命令可以使用diff
生成的补丁,而am
不行--check
: 检查补丁是否可以顺利引用--whitespace=[warn | fix]
: 空白字符问题。warn
是警告;fix
是自动修复
git am [*.patch]
: 引用git format-patch
生成补丁文件,并会自动提交名字
am
表示它”应用(Apply)一系列来自邮箱(Mailbox)的补丁-3
: 使用三方合并可以更智能的解决冲突。前提是补丁基于某个公共提交,才能使用三方合并-i
: 交互模式curl https://github.com/tonychacon/fade/pull/1.patch | git am
: 通过远程补丁文件来提交请求
文件模式
Git 的文件模式参考了常见的 UNIX 文件模式
100644
: 普通文件100755
: 可执行文件120000
: 符号链接Git 常用分支详解
长期分支
master
稳定分支next
相对于 master 的缓冲分支develop
开发和测试proposed
pu(proposed updates), 不成熟的内容主题(topic)分支
iss53
修复 issue 的第 53 个问题iss53v2
iss53 的另一个实现hotfix
补丁分支命令行更新 git-for-windows
Three cases:
- If your git version is
2.14.1
or earlier(更早):
Uninstall the git, download the latest git, and install it again.
- And versions between
2.14.2
and2.16.1
:
Use commandgit update
- If the version is equal to or greater(大于) than Git
2.16.1(2)
:
Use commandgit update-git-for-windows