获取当前git版本
git --version
使用 git 将 git 版本控制系统的源代码库克隆到本地
git clone git://git.kernel.org/pub/scm/git/git.git
//`git clone`: 这是 Git 命令,用于克隆一个远程仓库到本地。
//`git://git.kernel.org/pub/scm/git/git.git`: 这是远程仓库的 URL 地址。在这个例子中,它指向 Git 版本控制系统的官方源代码库。
git配置相关
//指定一个自定义的配置文件进行配置操作
git config -f <file>
//`git config`: 这是 Git 的配置命令,用于配置 Git 的各种选项。
//`-f <file>`: 这是 `git config` 命令的一个选项,用于指定一个自定义的配置文件进行配置操作。其中,`<file>` 是指定的配置文件路径。
//用于列出当前 Git 配置的所有信息,并显示每个配置项的来源(即配置项所在的文件路径)
git config --list --show-origin
// `--list`: 这是 `git config` 命令的一个选项,用于列出当前 Git 配置的所有信息。
// `--show-origin`: 这是 `git config` 命令的另一个选项,用于显示每个配置项的来源(即配置项所在的文件路径)。
//设置用户名和邮箱地址
git config --global user.name "John Doe"
git config --global user.email johndoe@example.com
//`--global`: 这是 `git config` 命令的一个选项,用于指定将配置应用到全局范围。这意味着配置将影响当前用户在系统中的所有 Git 仓库。
//将 Git 的全局配置中的默认编辑器设置为 Emacs
git config --global core.editor emacs
//配置 Git,使其使用一个密码缓存工具来存储已经验证过的用户凭据,以便在一段时间内免输入密码进行认证
git config --global credential.helper cache
//`--global`:这个参数告诉 Git 将配置应用于用户的全局配置文件中,而不是仅对当前仓库有效。
//`credential.helper`:这个配置选项指定 Git 使用的凭据帮助程序。在这种情况下,指定的是一个密码缓存工具。
//告诉 Git 在全局范围内(对所有仓库生效)使用一个特定的凭据帮助程序,并将凭据存储在指定的文件中
git config --global credential.helper 'store --file ~/.my-credentials'
//`store --file ~/.my-credentials`:这部分指定了凭据帮助程序的具体设置。它告诉 Git 将凭据存储在指定的文件 `~/.my-credentials` 中。
//凭证辅助工具系统,管理 Git 凭据
//`git credential` 并不是一个单独的 Git 命令,而是一个命令行工具,用于管理 Git 凭据。它通常由 Git 使用 `credential.helper` 配置项调用,用于获取、存储和删除凭据
//填充凭据信息
git credential fill
//配置 Git,使其在全局范围内(即所有用户的所有仓库)禁用输出分页功能
git config --global core.pager ''
//`git config`:设置 Git 配置选项的命令。
//`--global`:表示该配置是全局配置,影响当前用户的所有仓库。
//`core.pager`:特定的配置选项,用于控制分页器的使用。
//`''`:空字符串,表示禁用分页器。
//关闭Git命令行界面的颜色输出的
git config --global color.ui false
获取帮助
git help <verb> //等价于 git <verb> --help
//`<verb>`: 这是要查询帮助的 Git 命令。你需要用实际的 Git 命令代替 `<verb>`,比如 `git help commit`。
//不需要全面的手册,只需要可用选项的快速参考,可以直接添加-h
//例如查看add的可用选项
git add -h
初始化仓库
git init
添加到暂存区
git add *.c
//`git add`: 这是 Git 的命令,用于将文件添加到 Git 的暂存区。
//`*.c`: 这是一个通配符模式,用于匹配当前目录下所有扩展名为 `.c` 的文件。
//交互式暂存
git add -i
//进入一个交互式终端模式
//在 `What now>` 提示符后键入 `u` 或 `2`,需要暂存哪个文件就再输入该文件的序号
//使用 `r` 或 `3`(撤消)选项
//选择想要查看的暂存区别,可以使用 `d` 或 `6`(区别)命令
//交互地选择文件中哪些部分的更改要添加到暂存区
git add --patch
//或者
git add --p
//交互地选择文件中部分修改内容进行暂存
git stash push --patch -m "暂存信息"
//在交互过程中,Git 会提示你对每一个文件的更改进行选择:
//- `y` 暂存这个块(hunk)
//- `n` 不暂存这个块
//- `q` 退出,不暂存这个块及之后的块
//- `a` 暂存这个块及文件中所有后续的块
//- `d` 不暂存这个块及文件中所有后续的块
//- `s` 拆分这个块为更小的块
//- `e` 手动编辑当前块
//- `?` 显示帮助
//交互地选择哪些已暂存的更改要重置回未暂存状态
git reset --patch
//或者指定的文件
git reset --patch <filename>
提交到本地仓库
//将当前暂存区的所有更改提交到本地 Git 仓库,并且附带一条消息 '提交消息',用来描述这次提交的内容
git commit -m '提交消息'
//1.`commit`:这是 Git 的一个子命令,用于将当前工作目录中的已暂存更改记录到本地仓库中。每次提交都会创建一个新的提交对象,这个对象包含了提交的元数据(比如作者、时间)和快照(snapshot)——也就是所有被跟踪文件的当前状态。
//跳过使用暂存区域
git commit -a -m '提交消息'
//修改最近一次提交的提交信息
git commit --amend
//Git 会将当前暂存区(index)中的更改添加到上一次提交中,而不会改变提交消息
git commit --amend --no-edit
//`--no-edit` 选项用于保留现有的提交消息,而不是进入编辑器重新编辑提交消息
查看状态
git status
忽略文件
.gitignore 文件中
//相应的格式规范
- 所有空行或者以 `#` 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(`/`)开头防止递归。
- 匹配模式可以以(`/`)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(`!`)取反。
//示例
# 忽略所有的 .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
//查看已暂存的将要添加到下次提交里的内容
git diff --staged //等价于git diff --cached
删除文件
//从 Git 仓库中删除文件(即从暂存区域移除),但保留工作目录中的文件
git rm --cached README
//从工作目录和暂存区中删除文件
git rm README
重命名或移动文件
//将 `file_from` 重命名为 `file_to`
git mv file_from file_to
//`file_from`:这是原始文件的路径和名称。
//`file_to`:这是目标文件的路径和名称。
//等同于下面三个步骤
mv file_from file_to
git rm file_from
git add file_to
查看提交历史
git log
//按时间先后顺序列出所有的提交,最近的更新排在最上面
//拓展 显示最近的两次提交的详细信息
git log -p -2
//`-p`:这是一个选项,用于显示每个提交的差异(patch)。它会在日志输出中显示每个文件的更改内容,而不仅仅是提交信息。
//`-2`:这是一个选项,指定要显示的最近提交的数量。在这个例子中,表示显示最近的两次提交。
//每次提交的简略统计信息
git log --stat
//使用不同于默认格式的方式展示提交历史
git log --pretty=oneline
//`--pretty=oneline`:这是一个选项,用于指定输出的格式。`oneline` 格式会将每个提交的信息压缩成一行显示,包括提交的哈希值和提交消息。
//定制记录的显示格式
git log --prettyp=format:"%h - %an,%ar: %s"
//列出最近两周的所有提交
git log --since=2.weeks
//找出添加或删除了对某一个特定函数的引用的提交
git log -S function_name
//查看引用日志
git reflog
//区间选择的提交历史
git log master..experiment
//等价于
git log ^master experiment
git log experiment --not master
//在 experiment 分支中而不在 master 分支中的提交
//查看你即将推送到远端的内容
git log origin/master..HEAD
//选择出被两个引用之一包含但又不被两者同时包含的提交
git log master...experiment
//会显示在 `master` 中独有的提交和在 `experiment` 中独有的提交
git log --left-right master...experiment
//`--left-right`:为每个提交添加一个标志,指示它是在哪个分支上。`<` 表示左边的分支(在这里是 `master`),`>` 表示右边的分支(在这里是 `experiment`)。
//重写历史
//修改提交的内容、移动提交到不同的分支、删除文件或目录
git filter-branch
//修改提交内容
git filter-branch --commit-filter '修改提交内容的脚本' <commit-range>
//移动提交到不同分支
git filter-branch --commit-filter '修改提交的父节点' <commit-range>
//删除文件或目录
git filter-branch --tree-filter '删除文件或目录的脚本' <commit-range>
//修改提交作者信息
git filter-branch --env-filter 'export GIT_AUTHOR_NAME="New Author Name"; export GIT_AUTHOR_EMAIL="newemail@example.com";' HEAD
//重写提交历史,只保留仓库中某个子目录(例如 trunk 目录)的内容,并将其作为根目录进行提交
git filter-branch --subdirectory-filter trunk HEAD
//`--subdirectory-filter` 选项用于指定一个子目录,只保留该子目录下的文件和目录,并将其作为根目录。
//`trunk` 是你想要保留的子目录的名称。
//`HEAD` 表示从当前分支的 HEAD 开始进行重写。
//全局修改邮箱地址
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "schacon@localhost" ];
then
GIT_AUTHOR_NAME="Scott Chacon";
GIT_AUTHOR_EMAIL="schacon@example.com";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
//format接受的常用格式占位符的写法及其代表的意义
//log 常用选项
//限制git log 输出的选项
撤销操作
//修改上一次的提交
git commit --amend
//使用 `git commit --amend` 可以避免创建一个新的提交,而是直接在上一次提交的基础上进行修改。
//**修正提交消息**:如果你在上一次提交时写错了提交消息,可以使用 `git commit --amend` 来修改提交消息。
//**添加遗漏的更改**:如果你在上一次提交时忘记添加一些文件或更改,可以在进行更改后使用 `git commit --amend` 将这些遗漏的更改包括进上一次提交中。
//从缓存区移除单个文件
git reset HEAD <file>
//取消暂存file文件
//从缓存区移除多个文件
git reset HEAD <file1> <file2> <file3>
//撤销对file文件的任何修改,放弃未暂存的更改
git checkout -- <file>
远程仓库的使用
//看你已经配置的远程仓库服务器
git remote
//查看某个远程仓库
git remote show origin
//添加一个新的远程 Git 仓库
git remote add <shortname> <url>
//可以用简写代替整个Url,例如拉取远程仓库的时候但不知道URL
git fetch <shortname>
//等价于从远程仓库获取数据即
git fetch <remote>
//远程仓库的重命名
git remote rename <oldshortname> <newshortname>
//远程仓库的移除
git remote remove <shortname>
//抓取克隆(或上一次抓取)后新推送的所有工作
git fetch origin
//推送到远程仓库
git push <remote> <branch>
git push -u origin featureB:featureBee
//将本地分支 `featureB` 推送到远程仓库的 `featureBee` 分支,并设置上游分支
//生成一封包含拉取请求信息的邮件或信息
git request-pull <start> <url> <end>
//适用于当你没有直接推送权限,或者需要向项目维护者请求合并你的更改时
打标签
//列出已有的标签
git tag
//创建附注标签
git tag -a <tagname> -m "<message>"
//在当前提交上创建一个新的标签,并可以添加一段描述信息
//查看签信息和与之对应的提交信息
git show
//查看上一个提交
git show HEAD^等价于git show HEAD~
//在 Windows 的 `cmd.exe` 中,`^` 是一个特殊字符,因此需要区别对待,
git show HEAD^ # 在 Windows 上无法工作
git show HEAD^^ # 可以
git show "HEAD^" # 可以
//创建轻量标签
git tag v.1.4-1w
//只需要提供标签名字
//后期打标签
git tag -a v1.2 9fceb02
//在命令的末尾指定提交的校验和(或部分校验和)
//将特定的标签推送到远程仓库
git push origin <tagname>
//推送所有标签到远程
git push origin --tags
//删除本地标签
git tag -d v1.4
//该命令不会更新到远程,可以使用下列命令更新远程仓库
git push <remote> :refs/tags/v1.4
//或者
git push origin --delete <tagname>
//检出标签
git checkout v1.4
//基于某个标签创建并切换到新分支
git checkout -b <newbranch> <tagname>
创建git别名
git config --global alias.co checkout
//将git checkout更改别名成git co
git config --global alias.ci commit
//将git commit更改别名成git ci
//执行外部命令,在相应命令前加!
git config --global alias.visual '!gitk'
分支
//查看当前所有分支列表
git branch
//创建分支
git branch testing
//仅仅创建一个分支并不会切换到该分支上
//查看各个分支当前所指对象
git log --oneline --decorate
//分支切换
git checkout testing
//创建并切换分支
git checkout -b testing
//等价于
git branch testing
git checkout testing
//删除分支
git branch -d testing
//此处-d换成-D为强制删除
//合并分支
git checkout master
git merge testing
//将testing分支合并到master
//将指定分支(`featureB`)的所有更改合并到当前分支,但不会自动创建一个合并提交
git merge --square featureB
//合并 `whitespace` 分支到当前分支,并忽略空白字符的变化
git merge -Xignore-space-change whitespace
//`-Xignore-space-change`:在合并过程中忽略空白字符的变化。该选项会忽略空白字符的增加、删除或修改。
//`whitespace`:要合并的分支的名称。
//中断一次合并
git merge --abort
//撤销指定的提交,并将撤销操作作为一个新的提交应用到当前分支
git revert <commit>
//`<commit>` 是要撤销的提交的哈希值或引用
//合并 `mundo` 分支到当前分支,并在发生冲突时选择当前分支的版本
git merge -Xours mundo
//`-Xours`: 这是一个合并策略选项,告诉 Git 在合并过程中如果遇到冲突,优先选择当前分支的版本。
//`mundo`: 要合并的分支的名称。
//合并 `mundo` 分支到当前分支,并强制保留当前分支的所有内容,而完全忽略 `mundo` 分支的内容
git merge -s ours mundo
//`-s ours`: 指定合并策略为 `ours`。这种策略会保留当前分支的所有内容,即使 `mundo` 分支有不同的更改,合并后的内容也完全来自当前分支。
//子树合并
//将一个新的远程仓库添加到你的本地 Git 仓库中
git remote add rack_remote https://github.com/rack/rack
//`git remote add`: 添加一个新的远程仓库。
//`rack_remote`: 这是你为远程仓库起的名字,你可以根据自己的需要起任何名字。
//`https://github.com/rack/rack`: 这是远程仓库的 URL。
//生成一系列包含从指定基准分支(在此例中是 `origin/master`)到当前分支的差异的补丁文件
git format-patch -M origin/master
//读取一个分支的根目录树到当前的暂存区和工作目录里
git read-tree --prefix=rack/ -u rack_branch
//将某个分支的内容读入到一个指定的子目录中,并更新工作树
//`git read-tree`: 读入树对象到索引中。
// `--prefix=rack/`: 将读入的内容放入到指定的子目录 `rack/` 中。
//`-u`: 更新工作树,使其与新的索引状态保持一致。
//`rack_branch`: 你想要读入的分支。
//查看某个分支相对于其父分支的具体变更内容
git diff-tree -p rack_branch
//`git diff-tree`: 比较树对象的差异。
//`-p`: 生成补丁格式的输出。
//`rack_branch`: 要比较的分支。
//启动可视化合并工具
git mergetool
//查看每一个分支的最后一次提交
git branch -v
//查看哪些分支已经合并到当前分支
git branch --merged
//查看所有包含未合并工作的分支
git branch --no-merged
//未合并到 `master` 分支的有哪些
git branch --no-merged master
//查看项目分叉历史
git log --oneline --decorate --graph --all
//列出远程仓库的引用
git ls-remote <remote>
//获取远程分支的更多信息
git remote show <remote>
//与给定的远程仓库同步数据
git fetch <remote>
//添加一个新的远程仓库引用到当前的项目
git remote add
//推送分支
git push <remote> <branch>
//跟踪分支
git checkout -b <branch> <remote>/<branch>
//git checkout -b <新本地分支名> <远程名>/<远程分支名>
//基于远程分支创建一个新的本地分支,并切换到该分支
git checkout --track <远程名>/<远程分支名>
//创建一个新的本地分支,并将其设置为跟踪远程分支
git checkout --track origin/serverfix
//创建一个本地分支 `serverfix` 并让它跟踪 `origin/serverfix`
//捷径
git checkout serverfix
//当且仅当检出的分支 (a) 不存在且 (b) 刚好只有一个名字与之匹配的远程分支,git就会自动创建一个跟踪分支
git branch -u orgin/serverfix
//设置已有的本地分支跟踪一个刚刚拉取下来的远程分支
git branch -vv
//查看设置的所有跟踪分支
//从所有远程仓库获取最新的引用
git fetch --all
//删除远程分支
git push origin --delete serverfix
//变基
git checkout experiment
git rebase master
//检出 `experiment` 分支,然后将它变基到 `master` 分支,`experiment` 分支现在包含了 `master` 分支的最新提交历史
git rebase --onto master server client
//取出 `client` 分支,找出它从 `server` 分支分歧之后的补丁, 然后把这些补丁在 `master` 分支上重放一遍,让 `client` 看起来像直接基于 `master` 修改一样
git rebase <basebranch> <topicbranch>
//将主题分支 (即本例中的 `topicbranch`)变基到目标分支(即 `basebranch`)上
//打开一个文本编辑器,显示最后 3 个提交的列表
git rebase -i HEAD~3
//`git rebase -i` 是一个交互式变基的命令。它允许你对指定范围内的提交进行重写、编辑、合并、删除等操作。
//`HEAD~3` 表示从当前分支的 HEAD 向上追溯 3 个提交,即你要对最后 3 个提交进行交互式变基。
//在编辑器中,你可以对每一行前的命令进行修改
//`pick`:保留该提交(默认操作)。
//`reword`:保留该提交,但允许你修改提交消息。
//`edit`:停止变基过程以进行手动修改,然后继续变基。
//`squash`:将该提交与前一个提交合并,并允许你编辑合并后的提交消息。
//`fixup`:将该提交与前一个提交合并,但保留前一个提交的消息。
//`drop`:删除该提交。
//继续变基过程
git rebase --continue
//在应用某些提交时遇到冲突,Git 会暂停变基过程,并提示你解决冲突。解决冲突后,你需要使用 `git rebase --continue` 来继续变基过程。
//记录并重用冲突解决方案
git config --global rerere.enabled true
//在 Git 中启用 `rerere` 功能
//获取记录的合并前状态
git rerere status
//查看 rerere 将会记住的内容
git rerere diff
远程仓库名字 “origin” 与分支名字 “master” 一样,在 Git 中并没有任何特别的含义一样。 同时 “master” 是当你运行 git init 时默认的起始分支名字,原因仅仅是它的广泛使用, “origin” 是当你运行 git clone 时默认的远程仓库名字。 如果你运行 git clone -o booyah,那么你默认的远程分支名字将会是 booyah/master。
检查错误
//检查变更中的空白错误和其他常见问题
git diff --check
维护
//应用补丁文件中的更改到当前的工作目录
git apply /tmp/patch-ruby-client.patch
//检查补丁是否可以顺利应用
git apply --check 0001-seeing-if-this-helps-the-gem.patch
//用于应用包含提交元数据的补丁文件
git am /tmp/patch-ruby-client.patch
//`git am` 不仅会应用补丁中的更改,还会保留原始提交的元数据(例如作者信息和提交日期)
//继续应用下一个补丁
git am --resolved
//对该分支中所有 `master` 分支尚未包含的提交进行检查
git log contrib --not master
//显示当前分支与 `master` 分支之间的差异
git diff master
//找到两个分支的共同祖先提交(即最近的共同祖先)
git merge-base contrib master
//显示两个分支之间的差异
git diff master...contrib
//将一个单独的提交(在此例中是提交 `e43a6`)应用到当前分支上
git cherry-pick e43a6
//记录并重用解决合并冲突的方法,从而帮助减少重复解决相同冲突的工作量
git config --global rerere.enabled true
//生成一个描述性的标签,用来标识当前所在的提交相对于指定的参考点(通常是一个分支或提交)
git describe master
//创建一个压缩的归档文件
git archive master --prefix='project/' | gzip > `git describe master`.tar.gz
//**`git archive master`**: 这个命令用于创建一个归档文件,其中包含了 `master` 分支上的代码。`git archive` 命令将工作树中的文件直接打包到一个归档文件中,而不包括 `.git` 目录。
//**`--prefix='project/'`** : 这个选项指定了归档文件中的文件路径前缀。在这个例子中,所有文件将以 `project/` 开头,即在归档文件中的根目录下会有一个名为 `project/` 的文件夹。
//**` | gzip > `git describe master`.tar.gz`**: 这部分是一个管道命令,它将 `git archive` 命令的输出通过管道传递给 `gzip` 命令进行压缩,然后将压缩后的数据流重定向到一个以 `master` 分支的描述性标签命名的 `.tar.gz` 文件中。`git describe master` 用于生成描述性的标签名。
//快速生成一份包含从上次发布之后项目新增内容的修改日志(changelog)类文档
git shortlog --no-merges master --not v1.0.1
贮藏与清理
//临时保存工作目录中的未提交更改
git stash
//恢复暂存的更改
git stash pop
//**查看所有暂存的更改**:
git stash list
//**应用特定的 stash**:
git stash apply <stash@{n}>
//不指定一个贮藏,Git 认为指定的是最近的贮藏:
git stash apply
//用于恢复 `git stash` 暂存的更改的命令,并且尽量保留原来暂存区(staging area)的状态
git stash apply --index
//`<stash@{n}>` 是通过 `git stash list` 命令获取的条目索引号
//**删除特定的 stash**:
git stash drop <stash@{n}>
//**清空所有的 stash**:
git stash clear
//**保存未暂存的更改,并保持暂存区不变**:
git stash push -k -m "message"
//**保存所有本地更改,包括未跟踪的文件**:
git stash push -u -m "message"
//**交互式选择更改进行暂存**:
git stash push --patch
//创建一个新的分支并应用暂存的更改
git stash branch <branchname>
//将工作目录中的所有改动(包括未跟踪和忽略的文件)进行暂存
git stash --all
//列出工作目录中将被删除的未跟踪文件和目录,而不会实际删除它们
git clean -d -n
//确定要删除这些文件和目录
git clean -d -f
//`git clean` 命令只会移除没有忽略的未跟踪文件。 任何与 `.gitignore` 或其他忽略文件中的模式匹配的文件都不会被移除
//列出将在工作目录中删除的未跟踪文件和目录,包括那些被 `.gitignore` 忽略的文件和目录,但不会实际执行删除操作。
git clean -n -d -x
//确定要删除这些文件和目录
git clean -d -x -f
//**谨慎使用**:`git clean -d -x -f` 命令会永久删除未跟踪的文件和目录,包括那些被 `.gitignore` 忽略的文件和目录,无法通过 Git 恢复
//以交互模式进行未跟踪文件和目录的清理,并且同时会删除忽略的文件
git clean -x -i
//`-x`:表示同时删除忽略的文件。即使文件在 `.gitignore` 中被忽略,也会被列出和删除。
//`-i`:表示交互模式,会在执行操作前列出清理的文件和目录,并且提示用户选择是否删除。
git工具-搜索
//查找你工作目录的文件
git grep
//输出 Git 找到的匹配行的行号
git grep -n gmtime_r
//`-n` 选项用于显示匹配行所在的行号。`gmtime_r` 是你要搜索的关键词。
//输出概述信息
git grep --count gmtime_r
//`--count` 选项用于统计每个文件中匹配 `gmtime_r` 的行数。
//Git 会在当前仓库的所有 `.c` 文件中搜索 `gmtime_r` 这个关键词,并显示每个匹配结果所属的函数或者方法
git grep -p gmtime_r *.c
//`-p` 选项用于显示每个匹配结果所属的函数或者方法。`gmtime_r` 是你要搜索的关键词,`*.c` 限制搜索范围为所有 `.c` 文件。
git grep --break --heading gmtime_r
//`--break`:在不同文件的匹配结果之间插入一个空行。
//`--heading`:在每个文件的匹配结果前插入一个文件名标题。
//日志搜索
git log -S ZLIB_BUF_MAX --oneline
//Git 会在当前仓库的提交历史中搜索包含字符串 `ZLIB_BUF_MAX` 的提交,并以每个提交一行的形式显示结果
git工具-使用git调试
//显示文件中每一行的最后修改信息,包括谁在什么时候修改了什么
git blame
//查看 `Makefile` 文件中第 69 到 82 行的修改信息
git blame -L 69,82 Makefile
//查看 `GITPackUpload.m` 文件中第 141 到 153 行的修改信息,并跟踪这些行是否从其他地方复制或移动过
git blame -C -L 141,153 GITPackUpload.m
//二分查找法来定位引入 bug 的特定提交
//开始二分查找过程
git bisect start
//标记坏的提交
git bisect bad
//标记好的提交
git bisect good abc123
git工具-子模块
//将一个外部 Git 仓库添加为当前仓库的子模块
git submodule add https://github.com/chaconinc/DbConnector
//初始化和更新子模块
git submodule update --init
//自动初始化和更新子模块
git clone --recurse-submodules <repository_url>
//手动初始化和更新子模块
git submodule update --init --recursive
//更新所有子模块
git submodule update --remote
//同步子模块的远程 URL 配置
git submodule sync --recursive
//在推送包含子模块的仓库时,检查子模块的提交是否已经推送到远程仓库
git push --recurse-submodules=check
//在推送包含子模块的仓库时,只有当子模块中有新的提交需要推送时才会自动推送子模块
git push --recurse-submodules=on-demand
//在每一个子模块中执行 `git stash` 命令,将子模块中的未提交的更改暂存起来
git submodule foreach 'git stash'
//在每一个子模块中创建并切换到名为 `featureA` 的新分支
git submodule foreach 'git checkout -b featureA'
git工具-打包
//`git bundle create` 命令允许你创建一个包含指定提交范围的 Git 存储库的 bundle 文件,用于在没有网络连接的情况下分享代码
//创建一个包含指定提交范围的 Git 存储库的二进制文件
git bundle create <file> <git-rev-list-args>
//`<file>`:要创建的 bundle 文件的名称。
//`<git-rev-list-args>`:可选参数,用于指定要包含在 bundle 中的提交范围。可以使用 `git rev-list` 的语法来指定提交范围,例如分支名称、提交哈希等。
//示例
git bundle create repo.bundle HEAD master
//而后可以将这个 `repo.bundle` 文件通过邮件或者U盘传给别人
//或者从这个二进制文件中克隆出一个目录,就像从一个 URL 克隆一样
git clone repo.bundle repo
//打包指定的提交列表
git bundle create commits.bundle master ^9a466c5
//包含了从 `master` 分支的最新提交开始,但不包括提交 `9a466c5` 及其祖先提交的所有提交历史记录
//验证一个 bundle 文件的有效性
git bundle verify <file>
//检查 `file` 文件,并报告任何发现的问题,比如丢失的对象或损坏的对象。如果一切正常,它将不会输出任何内容
/列出 bundle 文件中包含的所有头引用(如分支和标签),以便了解 bundle 文件中包含的提交的引用情况
git bundle list-heads <file>
//输出的每一行格式为
//<引用名称> <提交哈希>
替换
//在提交历史中替换一个提交的内容,其中一个常见的用途是替换历史中的某个提交,以修复错误或重新编写提交历史
git replace <被替换的提交> <用于替换的新提交>
作为客户端的git
//从Subversion(SVN)仓库迁移项目到Git仓库的
git svn clone file:///tmp/test-svn -T trunk -b branches -t tags
//`git svn clone` 是Git中用来从一个现有的SVN仓库克隆项目到一个新的Git仓库的命令。它不仅会克隆代码,还能尽可能保留SVN仓库中的提交历史记录。
//`file:///tmp/test-svn` 指定了SVN仓库的位置
//`-T trunk` 指定了SVN仓库中代表“主干”或“主分支”的目录位置。
//`-b branches` 指定了SVN仓库中所有分支的存放位置
//`-t tags` 指定了SVN仓库中用来存放标记(或称“标签”)的位置。
//提交到远程的SVN仓库中
git svn dcommit
//在使用 Git-SVN(Subversion)的情况下,将本地的 Git 分支与 Subversion(SVN)仓库保持同步。
git svn rebase
//适用于在 Git 和 SVN 之间进行交互时,确保你的本地 Git 分支在 SVN 仓库的最新提交之上
//在 Subversion 中创建一个新分支
git svn branch opera
//查看Git仓库中的SVN日志
git svn log
//查看Git仓库中与Subversion(SVN)相关的信息
git svn info
//从其他版本控制系统或数据格式高效地导入数据到 Git 仓库中
`git fast-import`
维护与数据恢复
//手动执行自动垃圾回收
git gc --auto
//`git gc`:Git 垃圾回收命令,用于清理仓库中的无用对象。
//`--auto`:自动执行垃圾回收操作,Git 会根据仓库的状态自动选择最佳的回收策略。
//**查看最近的所有操作记录**
git reflog
//**查看特定分支的记录**
git reflog show <branch_name>
//**恢复到某个提交**
git checkout <commit_id>
//检查 Git 仓库的完整性,确保仓库中所有对象都完好无损,没有任何遗漏或损坏
git fsck --full
//统计 Git 仓库中各种对象数量
`git count-objects -v`
//**count:** 表示 Git 仓库中各种对象的总数。
//**blob:** 表示包含文件内容的 Blob 对象的个数。
//**commit:** 表示提交对象的个数。
//**tree:** 表示树对象的个数,树对象用来描述文件和文件夹的结构。
//**tag:** 表示标签对象的个数。
//删除仓库中不再被任何分支或标签引用的无用对象
git prune --expire now