A!die Software Studio Welcome to A!Die Software Studio

GIT 命令参考

by adie
Jun 20,2016

对象表示语法

REFNAME 引用名, 保存在 .git/refs/ 目录下的文件, 内容为其指向对象的 SHA1 散列值或是指向其他的引用
COMOBJ 假设 COMOBJ 为一个提交对象. 对象本身可以用引用或其部分 SHA1 散列值表示
TAGOBJ 假设 TAGOBJ 为一个带注释的标签对象. 标签名就是其引用名, 也可以直接用散列值来表示
TREEOBJ 假设 TREEOBJ 为树对象, 类似于文件系统中的文件夹, 包含了文件和子目录的权限, 散列值ID, 名字等
FILEOBJ 假设 FILEOBJ 为一个 blob 对象, 通常存储的是文件内容
COMOBJ^ COMOBJ 的父提交
COMOBJ^^ COMOBJ 父提交的父提交
COMOBJ^2 COMOBJ 的多个父提交中的二个
COMOBJ~2 COMOBJ 的父提交的父提交, 等价于 COMOBJ^^
COMOBJ^{tree} 提交对应的树对象
COMOBJ:FilePath 提交对应的文件对象
:FilePath 暂存区中的文件对象
REFNAME@{n} 引用前 n 次修改之前所指向的对象, 通过 reflog 中的记录获取
TAGOBJ^{commit} 标签对象指向的提交对象
TAGOBJ^{} 同上
TAGOBJ^0 同上
TAGOBJ~0 同上

提交范围表示法

CRANGE 假设 CRANGE 表示提交范围
COMOBJ 从开始到 COMOBJ 之间的所有提交
CRAGE1 CRAGE2 两个范围取并集
^COMOBJ 排除这个版本及其历史版本, 即这个版本之后的版本
COMOBJ1..COMOBJ2 等价于 ^COMOBJ1 COMOBJ2, 即提交1到提交2之间的提交, 包含 COMOBJ2, 不包含 COMOBJ1
COMOBJ.. 等价于 COMOBJ..HEAD
..COMOBJ 等价于 HEAD..COMOBJ
CRAGE1...CRAGE2 对称差, 即并集减交集, 排除两个提交范围中共同的提交
COMOBJ^@ 除自身之外的所有提交
COMOBJ^! 提交本身, 不包含其历史

杂项

git --exec-path 查看 git 子命令程序所在目录
GIT_TRACE=1 git 命令 跟踪命令的执行过程

配置

git config --list 查看所有配置
git config -e [--global/system] 编辑配置文件
git config [--global/system] key 查看配置项内容
git config [--global/system] key value 设置配置项
git config --unset [--global/system] key 删除配置项
GIT_CONFIG=<文件名> git config key value 读写指定文件中的配置项
git config --global core.quotepath false 中文文件名不使用编码字符串
git config --global core.fileMode false 取消对文件权限位的跟踪
git config --global user.name <用户名> 当前用户的用户名
git config --global user.email <邮箱> 当前用户的邮箱
git config core.autocrlf true 签出是把 LF 转换成 CRLF, 签入时把 CRLF 转换为 LF
git config core.autocrlf input 签出时不变, 签入时把 CRLF 转换为 LF
... --global alias.<缩写> <命令> 为命令设置别名
... --global color.ui true 开启颜色显示
... --global core.excludesfile 指定全局的忽略文件
... core.logallrefupdates true 创建引用更新日志, 默认带工作区的库为 true, 裸版本为 false
... remote.<远程库名>.skipDefaultUpdate true 在执行 git remote update 时跳过指定远程库的更新
... branch.<分支名>.rebase true 执行 git pull 操作时默认使用变基方式进行合并
... branch.autosetuprebase true 在对远程分支建立追踪时, 自动为本地分支设置 branch.分支名.rebase true
... remote.origin.fetch refs/notes/*:refs/notes/* 执行 git fetch 时自动获取远程引用的评注
... receive.denyNonFastForwards true 版本库中设置禁止非快进的提交
... receive.denyDeletes true 禁止删除分支
... --global merge.conflictstyle merge|diff3 冲突文件标记风格, 默认为 merge
... --global core.editor emacs 需要输入文本时使用的文本编辑器
... --global merge.tool <工具名> 设置合并冲突使用的工具
... --global merge.<工具名>.cmd 命令行 自定义工具的命令行, 其中可以使用环境变量如: $MERGED $BASE $LOCAL $REMOTE $MERGED(Base) $MERGED(Local) $MERGED(Remote) 等
... --global merge.<tool>.path 路径 合并工具的安装目录
... --global merge.log false 是否在合并提交的提交说明中包含合并概要
... --global web.browser chrome 设置 git web--browse 命令使用的浏览器. 注意, 查看帮助时使用的浏览器和这个设置无关, 查看帮助时使用的浏览器为双击 html 文件时打开文件的浏览器.
... --global browser.chrome.path 'path' 设置浏览器的安装目录
... --global browser.chrome.cmd 'cmd' 设置启动浏览器的命令行
... --global rerere.enable true 启用录制解决冲突的步骤后自动应用功能. (reuse record resolution)

GIT SVN

git svn --version 确认 git-svn 安装是否正确

msysGIT 如果提示错误 1 [main] perl 14168 child_info_fork::abort: unable to remap msys-aprutil-1-0.dll to same address as parent (0x350000) - try running rebaseall, 可以这样解决:

  1. ln -s /usr/bin/dash /usr/bin/ash
  2. 关闭 bash, 进入 /usr/bin/ 启动 dash, 运行
  3. /usr/bin/rebaseall

git svn clone <SVN 地址> <本地目录> 从 svn 库导入 git 库, 等价于 git svn init + git svn fetch
--stdlayout|-s SVN 库使用标准的目录结构 (trunk, branch, tag)
-r <版本>:HEAD 只获取部分版本更新
--authors-file=user.txt svn 帐号对应的 git 用户名, 内容格式:svn账号=git账号 <git 邮箱>
--no-metadata 不导入 svn 元数据(包 svn 提交 id 等). 做迁移时可以加上.
-s|--stdlayout 标准布局, 等价于 -T trunk -b branchs -t tags
-T|--trunk <主干目录> 指明主干目录
-t|--tags <标签目录> 指明标签目录
-b|--branchs <分支目录> 指明分支目录
git svn init <SVN 地址> <本地目录> 初始话版本库和 svn 配置.
--username <用户名> SVN 的用户名
--stdlayout|-s SVN 库使用标准的目录结构 (trunk, branch, tag)
-s|--stdlayout 标准布局, 等价于 -T trunk -b branchs -t tags
-T|--trunk <主干目录> 指明主干目录
-t|--tags <标签目录> 指明标签目录
-b|--branchs <分支目录> 指明分支目录
git svn fetch 从 svn 服务器获取更新
-r <版本>:HEAD 只获取部分版本更新
git svn rebase 将本地的提交变基到服务器上的新提交之后.
svn dcommit 将 git 中的提交上传到 SVN 服务器.
cp -Rf .git/refs/remotes/tags/* .git/refs/tags/ 把 SVN 的标签变成 GIT 的轻量级标签
rm -Rf .git/refs/remotes/tags
cp -Rf .git/refs/remotes/* .git/refs/heads/ 把 SVN 的分支变为 GIT 的分支
rm -Rf .git/refs/remotes/
rm -rf .git/svn/
rm .git/refs/remotes/git-svn 清除 svn 中间文件, 迁移到 git 后不再使用 svn 时使用.
git svn create-ignore 根据 SVN 的 svn:ignore 属性来生成 .gitignore 文件
git svn show-ignore 查看整个项目中的 svn:ignore 属性

库管理

git clone <源> <目标> 克隆版本库
--bare 克隆的版本不包含工作区, 称为裸版本库
--mirror 同上, 但是注册了上游版本库, 可以用 git fetch 命令进行同步
--origin <名称> 指明上游版本库的名称, 默认为 origin
--depth <深度> 只克隆指定数量的提交作为新版本的历史提交.

浅克隆的版本不能被克隆, 不能作为其它版本 fetch/push 的目标库.

git init [目录] 创建版本库, 省略目录时在当前目录创建
--bare 创建裸版本库(不含工作区)
git count-objects 显示松散对象的个数和占用的空间
git pack-objects 从标准输入读入对象ID, 打包到文件
git pack-redundant 查找多余的 pack 文件
git pack-refs --all 将应用文件打包, 放到一个 pack 文件中
git unpack-objects 从打包文件释放对象
git verify-pack 校验打包文件
git relink 为版本库中相同的对象建立硬链接
git show-index < file.idex 查看打包的索引文件中包含的对象
git fsck 查看没有被引用的松散对象(未被打包的对象)
--no-reflogs 排除 reflogs 中的引用
--full 查看所有未被引用的对象
git prune 清除没有被引用的松散对象
git prune-packed 清除没有引用的已打包对象
git reflog expire --expire=now --all 强制让所有的 reflog 文件过期
git gc 自动对版本库进行优化, 会自动执行, 行为包括:

git pack-refs --all --prune: 打包引用

git reflog expire --all: 清空 reflog 中 90 天前的记录

git repack: 对有引用的对象打包

git prune --expire : 清理 2 周以前未被关联的对象

git rerere gc: 对合并冲突的历史记录进行过期操作

...

git gc --prune=now 直接清理未引用的对象, 不再是 2 周以前的

工作区操作

工作区->暂存区: git add

暂存区->版本库: git commit

工作区->暂存区->版本库: git commit -a

版本库->暂存区: git reset HEAD, git rm --cached

暂存区->工作区: git checkout

版本库->暂存区->工作区: git checkout HEAD

git status 显示工作区状态
-s 精简方式
--ignored 将在 .gitignore 中忽略的文件也显示出来
git add <文件名> 将文件从工作区提交到暂存区
git add . 添加所有文件
git add * 由 shell 扩展所有的文件名
git add -u 将已追踪的文件的变化提交到暂存区
git add -A 将改动和新加的文件提交到暂存区
git add -i 交互式提交文件到暂存区
git add -f <文件名> 强制添加被 .gitignore 忽略的文件
git add -p <文件名> 对文件的多个修改进行选择性的提交
git commit -m <提交说明> 从暂存区提交到本地版本库
--allow-empty 允许没有修改的空提交
--author='用户名<邮箱>' 指定作者
-C <COMOBJ> 使用指定提交的说明来作为说明
-s 添加签名
--dry-run 查看即将被提交的文件, 不执行实际的提交
--no-verify 跳过 pre-commit 钩子直接执行
git commit --amend 修改上一次的提交, 使用当前暂存区中的内容重新提交
--reset-author 同步修改作者为提交者
git reset HEAD -- <file> 用版本库替换暂存区
git reset <COMOBJ> 重置HEAD所指向的分支引用到指定的提交上,命令中不带文件路径
--hard 重置引用, 暂存区, 工作区
--soft 只重置引用
--mixed(默认) 重置引用和暂存区
git rm <文件名> 删除文件, 同时删除工作区和暂存区
--cached 只从暂存区中删除, 工作区无影响
--ignore-unmatch 即使文件不存在, 命令也不返回失败
git mv <旧路径> <新路径> 在工作区和暂存区中移动/重命名文件
git checkout -- <file> 用暂存区文件替换工作区文件
git checkout . 用暂存区替换工作区的所有文件
git checkout HEAD <file> 用版本库替换暂存区和工作区文件
git checkout HEAD . 用版本库替换暂存区和工作区所有文件
git checkout --track <远程分支名> 追踪远程分支
git checkout <COMOBJ> 改变HEAD的指向, 会重置暂存区和工作区
git checkout - 切换回上一次的分支
git checkout :/"<keyword>" <file> 从包含关键字的最新提交中检出指定的文件
git checkout -b <branch> <COMOBJ> 创建分支并检出, 等价于 git branch + git checkout
--track 建立追踪关系, 如果 COMOBJ 为远程分支, 不使用此参数也会自动建立追踪关系
-f 强制检出, 工作区未提交的修改将会丢失
-m 将工作区的内容合并到检出的分支上
git push <远程> 引用名:远程引用名 将本地库指定的分支提交到远程库

如果省略本地引用则可实现删除远程引用的功能, 可以用于删除远程的分支或标签. 如果省略远程引用, 则使用和本地引用相同的名字

git push <远程> --delete <远程引用名> 删除远程分支, 等价于 git push <远程> :<引用名>
git push <远程> --all 推送所有引用到远程仓库
git push <远程> --tags 推送所有标签到远程仓库
git push <远程> --mirror 镜像所有分支到远程仓库
-f 强制推送, 会覆盖远程的更新
-u 推送的同时, 将本地分支设置为追踪对应的远程分支
git pull <远程> <引用> 从远程库更新版本到本地, 等价于 git fetch + git merge
--rebase 合并时使用变基方式进行合并
--squash 将多个提交作为一个提交进行合并
git fetch [远程] [引用] 获取远程分支的更新
-n|--no-tags 不获取远程的标签
git remote 显示已经注册的版本库
-v 详细信息, 显示对应的 URL 地址
git remote show <远程引用名> 显示远程名的详细信息
git remote add <远程引用名> <远程 URL> 添加远程仓库
--no-tags 不引入远程库的标签
-f 立即进行 fetch 操作
git remote set-url <远程引用名> <远程URL> 修改远程仓库的 URL
--push 为 push 操作设置单独的 URL
git remote rename <新引用名> <旧引用名> 为注册的远程库改名
git remote update 获取所有远程库的更新
git remote prune 删除本地版本库中相对于远程陈旧的分支
git remote rm <远程库名称> 删除远程库
git format-patch <提交范围> 将提交范围内的文件转换为补丁文件, 每一个提交对应一个文件
git format-patch -<n> 最近的 n 次提交
-s 在补丁文件中添加当前用户的签名
--root 对根提交也生成补丁
--stdout 把补丁内容输出到标准输出, 可直接重定向为 mbox 文件
-o <目录> 指定生成补丁的目录
git send-email *.patch 用邮件将补丁发送出去, 会进入交互界面
git am <mbox文件|邮件目录|补丁文件> 将邮件中的补丁应用到当前分支上, 会将补丁转换成提交
-3|--3way 使用三方合并
-i 应用完一个补丁就暂停询问一下再继续
cat *.patch | git am 将补丁文件应用到分支上
git am --resolved 当 git am 发生冲突后, 手动解决冲突, 然后使用此命令完成提交.
git am --skip 冲突时跳过当前补丁
git am --abort 终止应用补丁, 回到之前的状态
git apply <补丁文件1> <补丁文件2> ... 应用补丁文件, 支持 git 的包含二进制文件的补丁格式. 补丁应用在工作区, 不自动提交.
git apply <目录> <补丁文件> 对非 git 的目录应用 git 格式的补丁文件
-R 反向应用补丁
--check 检查补丁能否顺利应用到当前分支中
git diff 比较工作区和暂存区的差异
git diff <COMOBJ> 比较工作区和版本库的差异
git diff --cached/staged [COMOBJ] 比较暂存区和版本库的差异
git diff <提交1> <提交2> 比较 2 次提交间的差异
git diff <路径1> <路径2> 非 git 目录的比较
--word-diff 逐词比较, 默认为逐行
--binary 对二进制文件生成差异
--no-index
--no-prefix
--M 检测重命名并进行简单的输出, 而不是一个添加和一个删除
-w|--ignore-all-space 忽略空白字符
--stat 报告两颗树差异的统计数据
--color 不同的变化用不同的颜色显示
-- 路径或文件名 只对指定的路径或文件进行比较
-S"<keyworkd>" 搜索包含关键字的变化
--ours 合并冲突时使用, 等价于 git diff HEAD
--theirs 合并冲突时使用, 等价于 git diff MERGE_HEAD
--base 合并冲突时使用, 等价于 git diff $(git merge-base HEAD MERGE_HEAD)
git diff <分支1>...<分支2> 找到分支1和分支2的共同祖先提交, 然后比较这个提交和分支2的差异
git difftool 使用图形化工具来比较差异
git merge <COMOBJ> 将指定的提交的目录树和当前分支中的目录树进行合并

合并提交含有 2 个父提交. 合并如果发生冲突, 可以用 ":数字:文件路径" 的方式访问不同编号的暂存区里的文件内容.

:1:path 为冲突双方之前的版本

:2:path 当前版本中的文件

:3:path 待合并的版本中的文件

冲突解决后用 git add 来完成, 或者用 git reset 重置暂存区来放弃合并

--no-commit 合并后默认会进行提交, 使用此选项后合并后的内容在暂存区, 可以手动检查后再提交
-s <策略> 指明合并的策略, 可以是如下的值之一
resolve 用于两头合并, 最安全, 快速的合并
recursive 两头合并的默认策略, 可用 -X 传递参数
-X ours 如果发生冲突, 使用本地当前分支的版本, 忽略要合并的版本
-X theirs 如果发生冲突, 使用待合并的版本, 忽略本地版本
-X subtree[=path] 使用子树合并, 将远程分支合并到本地分支的 path 子目录下
octopus 可以进行多头合并, 但拒绝有冲突的复杂合并. 多头合并时的默认策略.
ours 合并任意数量, 结果总是当前内容, 丢弃其它分支.
subtree 子树合并, 自动猜测子目录的位置
--no-ff 在快进合并时也创建一个合并提交
--squash 将多个提交合并为一个提交
git mergetool 使用图形化工具来进行合并
git merge-base <原始分支> <新分支> 用算法确定分支的起点
git branch 显示本地分支列表
-r 查看远程分支
-a 查看所有分支
--merged 查看已被合并的分支
--no-merged 查看尚未被合并的分支
git branch 分支名 [COMOBJ] 创建分支, 省略提交则从 HEAD 创建
git branch -d 分支名 删除分支, 删除前会检查该分支是否已经合并到其他分支了
git branch -D 分支名 强制删除分支
git branch -m 旧名字 新名字 重命名分支, 如果新名字已经存在则失败
git branch -M 旧名字 新名字 强制重命名分支, 如果新名字已经存在着
.. --track local_branch remote_branch 检出最终远程分支的分支
git branch --set-upstream-to=<remote_branch> <local_branch> 让本地分支开始追踪远程分支
git blame <文件> 查看文件的变化是在哪一次提交引入的
-L n,m 只看指定的行
-C 如果文件被重命名过, 可以找出其原始出处
git cherry-pick <COMOBJ> 将指定的提交在当前 HEAD 上重放
git cherry-pick COMOBJ1..COMOBJ2 将指定范围的提交生成 patch 后应用到当前分支上
git describe 将最新的提交显示为一个易记的名称
--tags 使用轻量级的标签
git name-rev <COMOBJ> 类似 git describe, 优先使用分支名, 如果分支上没有引用, 会从最新提交往上回溯
--tags 优先使用标签
--stdin 读取标准输入, 可组合使用 git log --pretty=oneline | git name-rev --stdin
git reflog show <分支> 查看分支指向的提交变化日志
git cherry 查看分支中领先的提交, 默认查看本地相对于远程
git cherry <分支1> [分支2] 省略 分支2 则为 HEAD, 查看两个分支的差异
-v 显示提交对应的说明
git rebase <since> [till] 变基操作, 把 since..till 这段提交的父提交变为 newbase. 省略 till 时默认为 HEAD
-i 交互式变基, 通过编辑生产的文件来控制变基操作
--onto <newbase> 指定变基操作的基准提交, 省略时和 since 相同

变基操作过程:

(1) git checkout till 将 HEAD 指向 till

(2) 记录 (since, till] 范围

(3) git reset --hard newbase 将分支重置到 newbase

(4) 将记录范围内的提交重放, 如果提交已经存在则忽略, 如遇到冲突则暂停, 用户解决冲突后用 git rebase --continue 继续

--preserve-merges 保留合并的拓扑结构不被转化成线性
git rebase --continue 变基过程遇到冲突暂停后继续
git rebase --skip 变基过程遇到冲突暂停后用于跳过当前提交
git rebase --abort 变基过程遇到冲突暂停后用于终止变基操作, 恢复之前状态
git revert <COMOBJ> 对指定的提交做一次反向提交, 撤销其修改的内容
git grep <关键字> 在工作区搜索文件内容
-i 忽略大小写
-l 只列出匹配的文件名
-w 字匹配
-- <文件/路径> 限制搜索的路径
--untracked 包括未被追踪也未被忽略的文件
git clean -nd 列出工作区中未被跟踪的文件
git clean -fd 清除工作区中未被版本库跟踪的文件
-x 被 .gitignore 忽略的文件也删除
-X 只删除被 .gitignore 忽略的文件
--dry-run 测试命令的执行效果
git log [CRAGE] 查看提交日志
--pretty=fuller 同时显示作者和提交者
--pretty=oneline 精简输出
--pretty=raw 原始数据, 可以查看到父提交, 树ID等
--pretty=email 按邮件格式查看
--pretty=format:"<格式>" 定制输出的格式.

格式字符串包括:

%H  提交对象(commit)的完整哈希字串

%h  提交对象的简短哈希字串

%T  树对象(tree)的完整哈希字串

%t  树对象的简短哈希字串

%P  父对象(parent)的完整哈希字串

%p  父对象的简短哈希字串

%an 作者(author)的名字

%ae 作者的电子邮件地址

%ad 作者修订日期(可以用 -date= 选项定制格式)

%ar 作者修订日期,按多久以前的方式显示

%cn 提交者(committer)的名字

%ce 提交者的电子邮件地址

%cd 提交日期

%cr 提交日期,按多久以前的方式显示

%s  提交说明

--oneline 精简输出,更短的提交ID
--stat 变更统计
--shortstat 只显示行数变更统计
--name-only 只显示修改的文件清单
--name-status 显示新增, 修改, 删除的文件清单
--abbrev-commit 只显示 SHA 的前几个字符, 而不是全部的 40 个字符
--relative-date 使用相对时间显示
--graph 根据父提交画出提交关系图
--decorate 显示提交关联的分支或标签
--first-parent 只根据第一个父提交往上查找
-<数字 n> 显示最近的 n 条提交
-p 显示改动
-S<keyword> 搜索包含关键字的行被增加或删除的提交
--merge 只显示和产生冲突的文件相关的提交
--left-right 对合并的左边显示 <, 对合并的右边显示 >
--since|--after=时间 从指定的时间开始的, 比如 --since=2.weeks
--until|--before=时间 到指定的时间为止
--author 指定提交的作者
--committer 指定提交者相关的
--grep 搜索提交说明中的关键字
--all-match 同时满足所有搜索条件的
--not <分支> 屏蔽掉指定分支中的提交
-- 文件|路径 只看某些文件或路径的历史
--follow 如果文件被改名或移动, 可以进行跟踪
gitk 图形化显示提交日志, 可看到提交的 DAG 图
git shortlog 生成日志简报
git tag 显示标签
-n<数字> 最多 n 条
-l 通配符 只显示匹配通配符的
git tag <tagname> [COMOBJ] 创建轻量级标签, COMOBJ 默认为 HEAD, 轻量级标签只是一个指向提交的引用
git tag -a <tagname> [COMOBJ] 创建带说明的标签, 带说明的标签会在对象库中产生一个标签对象.
git tag -m <msg> <name> [COMOBJ] 创建带说明的标签, 命令行中直接给出说明
git tag -s <name> [COMOBJ] 创建带签名的标签, 签名需要安装 GnuPG, 然后用 gpg --gen-key 来生成密匙
git tag -u <key> <name> [COMOBJ] 创建带签名的标签, -u 参数指定私钥
-f 如果已有同名的标签, 强制覆盖
git tag -v <tagname> 可以验证签名的有效性
git tag -d <tagname> 删除标签
git stash 保存工作区当前进度到草稿区
git stash list 查看保存的进度
git stash pop 从最近保存的进度恢复
git stash pop --index 恢复进度的同时恢复暂存区
git stash pop <stash_id> 从指定的进度恢复
git stash save "message" 保存进度,并给出说明
--patch 显示工作区和 HEAD 的差异, 可选择要保存的内容
-k/--keep-index 保存后不会重置暂存区
git stash apply 等同于 pop, 但是不从保存的列表中删除进度
git stash drop <stash_id> 删除指定的进度, 省略 stash_id 则删除最前面的一个
git stash clear 删除所有进度
git stash branch <分支名> <stash_id> 基于进度创建分支
git notes 列出所有评注
git notes list 列出所有评注
git notes show COMOBJ 显示某个提交上的评注
git notes add [COMOBJ] 为对象添加评注, 省略对象则为 HEAD
-f 强制添加, 会覆盖已有评注
git notes append [COMOBJ] 为对象追加评注
(add 和 append 通用的选项)
-m <说明> 评注内容
-F <文件> 从文件中读取内容
-c|-C <对象> 使用指定提交对象中的内容
git notes copy <源对象> <目标对象> 将源对象的评注拷贝到目标对象上
git notes edit <对象> 编辑评注
git notes remove <对象> 删除评注
git notes prune 删除没有被对象引用的评注
git notes merge 合并评注中的冲突
git bisect start [坏版本] [好版本] 开始启用二分查找来寻找引入 BUG 的那一次提交
git bisect bad 标记当前有 BUG
git bisect good <提交> 标记指定的一次没有 BUG 的提交
git bisect good|bad 测试自动检出的代码是否有 BUG
git checkout bisect/bad 切换到查找出的有 BUG 的那次提交
git bisect reset 清除二分查找状态
git bisect log > logfile 保存二分查找状态
git bisect replay <logfile> 从日志文件恢复二分查找状态
git bisect run <脚本命令> 通过脚本返回值判断版本好坏. 0 好版本 1~127(除125外) 坏版本 125 跳过当前版本
git submodule add <URL> <目录路径> 添加子模组, 写入 .gitmodules 文件
git submodule status 查看子模组状态
git submodule init 注册子模组引用的外部库, 用 .gitmodules 来更新 .git/config 文件
git submodule update 克隆子模组引用的外部库
git submodule summary 显示子模块当前状态相对于提交状态变化的补丁
git submodule foreach <command> 对每一个子模块执行一条 shell 命令, 提供 $path, $sha1 等变量
--recurse 递归处理嵌套的子模块
git subtree add <COMOBJ> 将指定的合并到当前分支的子目录下
git subtree add <远程库URL> <引用> 将远程库中的分支合并到当前分支的子目录下
git subtree merge <COMOBJ> 将子树对应分支的更新重新合并过来, 等同于 git merge -X subtree=
git subtree pull <远程库> <引用> 先对子树对应的远程库执行 git fetch, 再执行 git subtree merge
git subtree push <远程库> <引用> 先对子树进行拆分, 然后将拆分的分支推送到远程服务器.
git subtree split <提交...> 对子树进行拆分, 拆分后形成一个独立的分支. 输出该分支的最后一个提交.
--branch <分支名> 拆分后创建一个分支
--onto <提交> 将拆分后的提交链接到已有的提交上
--ignore-joins 忽略对之前拆分历史的检查
--rejoin 将拆分的结果合并到当前分支上. 相当于把子目录合并到根目录中来.
(对所有 subtree 子命令都有效的选项)
--squash 将合并的多个提交压缩成一个提交
--prefix=子目录名|-P 子目录名 指定操作的子目录
git filter-branch [提交范围] 使用脚本迭代修改提交范围内的提交, 省略范围则为 HEAD 开始的历史提交.
--all 可以指代所有引用, 前面需要用 -- 分隔, 即用 ----all 来表示范围.
--env-filter <脚本命令> 环境变量过滤器, 改变特定的环境变量会改变提交
--tree-filter <脚本命令> 将提交检出到一个临时目录中, 对目录中文件的修改会改变提交.
--index-filter <脚本命令> 将提交检出到暂存区, 对暂存区的修改将会改变提交.
--parent-filter <脚本命令> 修改提交的父节点, 原始父节点通过 -p parent1 -p parent2 ... 形式的标准输入传入, 输出将成为新的父节点.
--msg-filter <脚本命令> 修改提交说明, 原始说明作为标准输入传入, 标准输出将作为新的说明.
--commit-filter <脚本命令> 修改每次提交的 git commit-tree 操作, 将 "树ID -p parent1 -p parent2 .. " 形式的参数从标准输入传递给脚本. 脚本内执行 git commit-tree 后将提交 ID 作为标准输出. 如果输出了多个 ID, 则这些 ID 作为下一个提交的多个父提交.
--tag-name-filter <脚本命令> 从标准输入传入原始标签名, 从标准输出传出修改的标签名. 如果修改的树上有标签, 会产生大量警告, 可以使用 --tag-name-filter 'cat' 和树过滤一起运行, 不改变标签名, 只是指向新的提交.
--subdirectory-filter <目录> 子目录过滤器可以将版本库的一个子目录提取成为一个新的版本库.
-d <目录> 指明检出的临时目录, 默认为 .git-rewrite
-f|--force 被命令改写的分支会在 refs/original 中做备份, 如果备份已存在则拒绝执行. 使用此选项可强制执行.

实例:

git filter-branch --tree-filter 'rm -f <文件名>' ----all 将版本库中的某个文件彻底删除

git filter-branch --index-filter 'git rm --cached --ignore-unmatch <文件名>' master 同上, 执行会更快

git filter-branch --commit-filter 'GIT_COMMITTER_NAME="用户名"; git commit-tree "$@"; ' HEAD

修改历史提交中提交者的姓名

git filter-branch --commit-filter 'git_commit_non_empty_tree "$@" ' 过滤掉空提交

git filter-branch --subdirectory-filter trunk HEAD 将版本库中的 trunk 目录提取出来作为新的版本库根目录

内部命令

git commit-tree <TREEOBJ> 直接从目录树创建提交, 这样的提交没有父提交. 结合变基命令可以丢弃历史提交
-p <COMOBJ> 指定父提交. 可以重复多次让提交有多个父提交, 模拟合并提交的效果.
git hash-object -- <文件名> 计算对象的 hash 值
-w 存储对象, 默认只返回 hash 值
--stdin 从标准输入读取文件内容
-t <type> 指明对象的类型
git show <OBJECT> 查看对象的详细信息
git show-branch --more=10 显示当前开发分支的简洁摘要
git show-ref 查看本地的引用
git ls-tree <COMOBJ> 查看版本库中的目录树
-l 显示文件大小
-r 递归显示子目录
-t 输出中间目录
git ls-files -s 查看暂存区中的目录树
git write-tree 将暂存区的目录树写入版本库
git read-tree --prefix=目录名 <TREEOBJ> 将树对象读取到暂存区中指定的目录
git ls-remote [远程URL] 查看远程引用, 省略则为 origin
--heads 查看分支
--tags 查看标签
git cat-file -t <OBJECT> 查看对象的类型
git cat-file -p <OBJECT> 查看对象的内容
git shell 受限制的 shell, 仅提供对 git 命令的 ssh 访问
git rev-parse <引用> 显示对象的散列值
git rev-parse --show-toplevel 显示工作区根目录
git rev-parse --show-prefix 显示当前目录到工作区目录的相对路径
git rev-parse --show-cdup 显示当前目录到工作区目录的回退层数
git rev-parse --symbolic --branches 显示分支
git rev-parse --symbolic --tags 显示标签
git rev-parse --symbolic --glob=refs/* 显示所有引用
git rev-list HEAD 显示列表中各条记录的ID
--oneline 同 git log 中的 --oneline
-n <数字> 只显示指定的条数
--before="<日期描述>" 指定最后的日期
-- <文件/路径> 包含指定文件/路径的提交
git check-ref-format 检查引用名称是否符合规范
git symbolic-ref HEAD 查看符号引用的内容,比如:HEAD,ORIG_HEAD,FETCH_HEAD,MERGE_HEAD
git symbolic-ref HEAD refs/... 更改符号引用的内容
git update-ref <引用文件> <引用对象> 创建或修改引用所指向的对象

命令组合

git archive -o <归档文件名, .zip, .tar> <提交ID> [归档目录1] [归档目录2...]
对提交中的文件进行打包
git archive master --format=tar --prefix=<目录前缀> | gzip > ·git describe master·.tar.gz
打包成 .tar.gz 格式
git log --follow --name-only <file>
跟踪移动的文件

SSH 证书认证配置

ssh-keygen -f ~/.ssh/<filename> 生成密匙
ssh-copy-id -i ~/.ssh/<filename>.pub <user@server> 上传密匙
~/.ssh/config 修改客户端配置文件, 内容格式如下:

host <ssh_name>

user <username>

hostname <server>

port 22

identityfile ~/.ssh/<filename>

客户端连接时如果出现这种错误:

 

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@ ARNING: POSSIBLE DNS SPOOFING DETECTED! @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

The RSA host key for xxxx has changed,

and the key for the corresponding IP address xxxx

is unknown. This could either mean that

DNS SPOOFING is happening or the IP address for the host

and its host key have changed at the same time.

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!

Someone could be eavesdropping on you right now (man-in-the-middle attack)!

It is also possible that a host key has just been changed.

The fingerprint for the RSA key sent by the remote host is

SHA256:xxxxxxxxxxxxxx.

Please contact your system administrator.

Add correct host key in .ssh/known_hosts to get rid of this message.

Offending RSA key in .ssh/known_hosts:1

Password authentication is disabled to avoid man-in-the-middle attacks.

Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.

Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).

 

可以使用命令 ssh-keygen -R server_name 来清空 known_hosts

▲评论

X 正在回复:
姓 名: 留下更多信息
性 别:
邮 件:
主 页:
Q Q:
来 自:
职 业:
评 论:
验 证:


Valid HTML 4.01 Strict Valid CSS!
Copyleft.A!die Software Studio.ADSS
Power by webmaster@adintr.com