From a3037ba5a006c9b55616857bb89144337a786dd3 Mon Sep 17 00:00:00 2001 From: 7Wate Date: Sun, 9 Oct 2022 14:37:50 +0800 Subject: [PATCH] =?UTF-8?q?Git=EF=BC=9A=E5=8F=82=E8=80=83=E6=89=8B?= =?UTF-8?q?=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- wiki/dev/Git/进阶/参考手册.md | 161 +++++++++++++++++++++++++++++----- 1 file changed, 139 insertions(+), 22 deletions(-) diff --git a/wiki/dev/Git/进阶/参考手册.md b/wiki/dev/Git/进阶/参考手册.md index 49b329ec..af1b7dd4 100644 --- a/wiki/dev/Git/进阶/参考手册.md +++ b/wiki/dev/Git/进阶/参考手册.md @@ -11,9 +11,9 @@ author: 7Wate date: 2022-09-13 --- -## 创建与克隆 +## 创建与克隆项目 -首先得有一个 Git 仓库才能用它进行操作,仓库是 Git 存放你要保存的快照的数据的地方。拥有一个 Git 仓库的途径有两种: +有两种方式获取一个 Git 仓库,仓库是 Git 存放你要保存的快照的数据的地方。 - 初始化一个新的 Git 仓库。 - 克隆一个存在的项目。 @@ -35,7 +35,11 @@ Initialized empty Git repository in /root/gitStudy/.git/ ### git clone -如果需要克隆一个存在的项目。 在命令行当前目录中执行 git clone [url],url 为项目地址,然后就可以了。 +如果需要克隆一个存在的项目。,在命令行当前目录中执行 git clone [url],url 为项目地址,然后就可以了。git clone 实际上是一个封装了其他几个命令的命令。 + +1. 它创建了一个新目录,切换到新的目录。 +2. 然后 git init 来初始化一个空的 Git 仓库, 然后为你指定的 URL 添加一个(默认名称为 origin 的)远程仓库。 +3. 再针对远程仓库执行 git fetch,最后通过 git checkout 将远程仓库的最新提交检出到本地的工作目录。 ```shell $ git clone git://github.com/schacon/simplegit.git @@ -50,7 +54,7 @@ $ ls README Rakefile lib ``` -## 基本的快照 +## 快照基础 Git 的工作就是创建和保存项目的快照,及与之后的快照进行对比。 @@ -110,6 +114,10 @@ M hello.rb $ git commit -m 'my hola mundo changes' [master 68aa034] my hola mundo changes 1 files changed, 2 insertions(+), 1 deletions(-) +# 使用 -S 标志提交签名加密 +$ git commit -S -m 'my hola mundo changes' +# 撤销上次提交 +$ git commit --amend ``` 如果执行 git commit 不适用 -m 选项,Git 则会尝试打开一个编辑器以填写提交信息。如果认为使用 git add 提交的流程太过繁琐,Git 允许使用 -a 选项跳过这一步。 @@ -144,6 +152,15 @@ git reset HEAD^ 通过执行 git rm 来删除 Git 追踪的文件,它还会删除你的工作目录中的相应文件。 +### git mv + +git mv 命令是一个便利命令,用于移到一个文件并且在新文件上执行 git add 命令及在老文件上执行 git +rm 命令。 + +### git clean + +git clean 是一个用来从工作区中移除不想要的文件的命令。 可以是编译的临时文件或者合并冲突的文件。 + ## 分支与合并 几乎每一种版本控制系统都以某种形式支持分支,一个分支代表一条独立的开发线。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。Git 的分支模型称为**必杀技特性**,而正是因为它,将 Git 从版本控制系统家族里区分出来。 @@ -199,6 +216,11 @@ $ ls README hello.rb ``` +### git stash + +git stash 命令用来临时地保存一些还没有提交的工作,以便在分支上不需要提交未完成工作就可以清理工作 +目录。 + ### git log 在使用 Git 提交了若干更新之后,又或者克隆了某个项目,想回顾下提交历史,我们可以使用 git log 命令查看。 @@ -238,7 +260,7 @@ $ git tag -a -m "runoob.com标签" $ git tag -s -m "runoob.com标签" ``` -## 共享与更新 +## 项目分享与更新 Git 并不像 Subversion 那样有个中心服务器。 目前为止所有的命令都是本地执行的,更新的知识本地的数据库。简而言之使用 git fetch 更新你的项目,使用 git push 分享你的改动。 你可以用 git remote 管理你的远程仓库。 @@ -265,7 +287,7 @@ git fetch ### git pull -在 Git 中 git pull 从远端仓库提取数据并**尝试合并到当前分支**。该命令就是在 git fetch 之后紧接着 git merge 远端分支到你所在的任意分支。 +在 Git 中 **git pull 从远端仓库提取数据并尝试合并到当前分支。**该命令就是在 git fetch 之后紧接着 git merge 远端分支到你所在的任意分支。 ```shell git fetch @@ -279,26 +301,121 @@ git fetch git push github master ``` +### git archive + +git archive 命令用来创建项目一个指定快照的归档文件。 + +### git submodule + +git submodule 命令用来管理一个仓库的其他外部仓库。 + ## 检查与比较 -### git log +### git show -在 Git 中执行 git log 找到你的项目历史中的特定提交 —— 按作者、日期、内容或者历史记录。 +git show 命令可以以一种简单的人类可读的方式来显示一个 Git 对象。 一般使用此命令来显示一个标签或一 +个提交的信息。 -```shell -# 特定作者 Linus 的提交 -$ git log --author=Linus -# 指定日期的提交 -$ git log --oneline --before={3.weeks.ago} --after={2010-04-18} --no-merges -# 根据提交注释过滤提交记录 -$ git log --grep=P4EDITOR --no-merges -``` +### git shortlog -### git diff +git shortlog 是一个用来归纳 git log 的输出的命令。 它可以接受很多与 git log 相同的选项,但是此命 +令并不会列出所有的提交,而是展示一个根据作者分组的提交记录的概括性信息 -在 Git 中执行 git diff 比较历史记录中的两个不同的点 —— 通常是为了看看两个分支有啥区别,或者从某个版本到另一个版本,你的软件都有啥变化。 +### git describe -```shell -# 查看 v0.9 标签后差异 -$ git diff v0.9 -``` +git describe 命令用来接受任何可以解析成一个提交的东西,然后生成一个人类可读的字符串且不可变。 + +## 调试 + +### git bisect + +git bisect 工具是一个非常有用的调试工具,它通过自动进行一个二分查找来找到哪一个特定的提交是导致 +bug 或者问题的第一个提交。 + +### git blame + +git blame 命令标注任何文件的行,指出文件的每一行的最后的变更的提交及谁是那一个提交的作者。 当你要 +找那个人去询问关于这块特殊代码的信息时这会很有用。 + +### git grep + +git grep 命令可以帮助在源代码中,甚至是你项目的老版本中的任意文件中查找任何字符串或者正则表达式。 + +## 补丁 + +### git cherry-pick + +git cherry-pick 命令用来获得在单个提交中引入的变更,然后尝试将作为一个新的提交引入到你当前分支 +上。 从一个分支单独一个或者两个提交而不是合并整个分支的所有变更是非常有用的。 + +### git rebase + +git rebase 命令基本是是一个自动化的 cherry-pick 命令。 它计算出一系列的提交,然后再以它们在其他 +地方以同样的顺序一个一个的 cherry-picks 出它们。 + +### git revert + +git revert 命令本质上就是一个逆向的 git cherry-pick 操作。 它将你提交中的变更的以完全相反的方式 +的应用到一个新创建的提交中,本质上就是撤销或者倒转。 + +## 邮件 + +### git apply + +git apply 命令应用一个通过 git diff 或者甚至使用 GNU diff 命令创建的补丁。 它跟补丁命令做了差不多 +的工作,但还是有一些小小的差别。 + +### git am + +git am 命令用来应用来自邮箱的补丁。特别是那些被 mbox 格式化过的。 这对于通过邮件接受补丁并将他们 +轻松地应用到你的项目中很有用。 + +### git format-patch + +git format-patch 命令用来以 mbox 的格式来生成一系列的补丁以便你可以发送到一个邮件列表中。 + +### git imap-send + +git imap-send 将一个由 git format-patch 生成的邮箱上传至 IMAP 草稿文件夹。 + +### git send-email + +git send-mail 命令用来通过邮件发送那些使用 git format-patch 生成的补丁。 + +### git request-pull + +git request-pull 命令只是简单的用来生成一个可通过邮件发送给某个人的示例信息体。 如果你在公共服务 +器上有一个分支,并且想让别人知道如何集成这些变更,而不用通过邮件发送补丁,你就可以执行此命令的输出 +发送给这个你想拉取变更的人。 + +## 外部系统 + +### git svn + +git svn 可以使 Git 作为一个客户端来与 Subversion 版本控制系统通信。 这意味着你可以使用 Git 来检出内 +容,或者提交到 Subversion 服务器。 + +### git fast-import + +对于其他版本控制系统或者从其他任何的格式导入,你可以使用 git fast-import 快速地将其他格式映射到 +Git 可以轻松记录的格式。 + +## 管理 + +### git gc + +git gc 命令在你的仓库中执行 “garbage collection”,删除数据库中不需要的文件和将其他文件打包成一种 +更有效的格式。 + +### git fsck + +git fsck 命令用来检查内部数据库的问题或者不一致性。 + +### git reflog + +git reflog 命令分析你所有分支的头指针的日志来查找出你在重写历史上可能丢失的提交。 + +### git filter-branch + +git filter-branch 命令用来根据某些规则来重写大量的提交记录,例如从任何地方删除文件,或者通过过 +滤一个仓库中的一个单独的子目录以提取出一个项目。