Git help 官方命令详解

开源 0

1)git --help翻译文档

1.help文档

win+R输入cmd打开命令行界面

git -h 显示帮助信息

usage: git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>]

           [--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]

           [-p | --paginate | -P | --no-pager] [--no-replace-objects] [--bare]

           [--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]

           [--super-prefix=<path>] [--config-env=<name>=<envvar>]

           <command> [<args>]

These are common Git commands used in various situations:

start a working area (see also: git help tutorial)

   clone     Clone a repository into a new directory

   init      Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)

   add       Add file contents to the index

   mv        Move or rename a file, a directory, or a symlink

   restore   Restore working tree files

   rm        Remove files from the working tree and from the index

examine the history and state (see also: git help revisions)

   bisect    Use binary search to find the commit that introduced a bug

   diff      Show changes between commits, commit and working tree, etc

   grep      Print lines matching a pattern

   log       Show commit logs

   show      Show various types of objects

   status    Show the working tree status

grow, mark and tweak your common history

   branch    List, create, or delete branches

   commit    Record changes to the repository

   merge     Join two or more development histories together

   rebase    Reapply commits on top of another base tip

   reset     Reset current HEAD to the specified state

   switch    Switch branches

   tag       Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)

   fetch     Download objects and refs from another repository

   pull      Fetch from and integrate with another repository or a local branch

   push      Update remote refs along with associated objects

'git help -a' and 'git help -g' list available subcommands and some

concept guides. See 'git help <command>' or 'git help <concept>'

to read about a specific subcommand or concept.

See 'git help git' for an overview of the system.

空文件夹

在 Git 中,空文件夹通常不会被版本控制系统跟踪,因为 Git 只跟踪文件内容的变化。但r是,如果你需要在 Git 仓库中保留一个空文件夹,有几种方法可以实现:

添加占位文件:

在空文件夹中添加一个占位文件,例如一个空的 README.md 文件,这样 Git 就会跟踪这个文件夹。

使用cd /d <path> 切换目录到指定路径

使用 mkdir 命令创建新文件夹。例如,要创建一个名为 new_folder 的文件夹,可以运行以下命令:

mkdir new_folder

dir列出当前目录下的文件和文件夹

使用 .gitkeep 文件:

在空文件夹中创建一个名为 .gitkeep 的文件。这个文件可以是空的,但是它的存在会告诉 Git 跟踪这个文件夹。

创建新文件并写入内容:

echo "Hello, World!" > newfile.txt

echo. > .gitkeep

使用 .gitignore 文件:

在空文件夹中创建一个 .gitignore 文件,并在其中添加一些规则来忽略文件夹中的其他文件,同时保留 .gitignore 文件本身。例如:

# Ignore everything in this directory

*

# Except this file

!.gitkeep

这样配置后,Git 会忽略空文件夹中的所有内容,除了 .gitkeep 文件。

如果你已经跟踪了一些文件,并且现在想要通过 .gitignore 来忽略它们,你需要使用以下命令从 Git 仓库中移除它们:

git rm --cached <file-or-directory>

提交 .gitignore 文件:

在项目的根目录或空文件夹中添加一个 .gitignore 文件,并确保它包含必要的规则来避免跟踪不需要的文件,同时保留空文件夹。

2.基本用法

-v 或 --version:显示 git 的版本信息。

-h 或 --help:显示帮助信息,解释如何使用 git 命令和它的各个子命令。

-C <path>:运行命令时,使用指定的 <path> 作为 Git 仓库的目录。在你需要操作一个不在当前工作目录中的 Git 仓库时非常有用。

-c <name>=<value>:设置 Git 配置项 <name> 的值为 <value>。

--exec-path[=<path>]:显示 Git 的可执行文件路径。如果指定了 <path>,则 Git 会尝试从该路径中查找其可执行文件。通常,--exec-path 后面不会直接跟路径 <path> 作为参数,因为 Git 不支持直接通过命令行选项来设置执行路径。

--html-path、--man-path、--info-path:分别显示 Git 的 HTML 文档、man 页面和 info 页面的路径。

-p 或 --paginate:分页显示输出。当使用 --paginate 选项时,你可以使用键盘上的按键来导航分页输出。常见的按键包括:

空格键:向前翻页     b:向后翻页       q:退出分页模式

-P 或 --no-pager:不使用分页器显示输出。Git 命令的输出将直接显示在终端上,而不会通过分页器。这对于查看较长的输出或在脚本中使用 Git 命令时非常有用。

--no-replace-objects:禁用替换引用的使用。替换引用是一种 Git 功能,它允许你将一个提交指向另一个不同的提交,通常是用于修补错误或者合并冲突后的提交。

查看未被替换的提交信息:

如果一个提交 foo 被另一个提交 bar 替换了,使用 git cat-file commit foo 会显示 bar 的信息。要查看原始的 foo 提交信息,可以使用:

git --no-replace-objects cat-file commit foo

这里 <foo> 是被替换的提交的哈希值,而 <bar> 是新提交的哈希值。

--bare:如果与 git init 或 git clone 一起使用,则创建一个裸仓库。裸仓库是一个不包含工作目录(working directory)的 Git 仓库,它只包含 .git 目录,里面保存了所有的版本历史和引用信息,但没有项目文件的实际内容。这种类型的仓库通常用在服务器上,作为多个开发者共享的中央仓库。

创建裸仓库:

使用 git init --bare 命令可以在指定路径创建一个新的裸仓库

用途:

裸仓库通常用于服务器端,作为远程仓库供多个开发者推送(push)和拉取(pull)代码。它们不用于日常开发工作,因为它们没有工作目录。

克隆裸仓库:

你可以使用 git clone --bare 命令来克隆一个裸仓库,这将创建一个包含所有分支和标签的裸仓库副本:

git clone --mirror 会创建一个原始仓库的完全镜像副本,包括所有数据、引用和设置,而 git clone --bare 仅克隆版本历史,不包含分支、标签或其他引用。

裸仓库适用于创建一个干净的存储库,用于共享和备份目的,而不需要分支和标签的内容。

裸仓库可以用于服务器上作为中央仓库,供团队成员进行协作。

--git-dir=<path>:设置 Git 仓库的目录为 <path>。

克隆仓库到特定路径:

git clone --separate-git-dir=/path/to/custom/.git URL

这条命令会克隆远程仓库 URL 到当前目录,但是 .git 目录将被创建在 /path/to/custom/.git。

git clone --separate-git-dir=

D:/hehuiyuan/odoo16/custom/git_test/.git  https://gitee.com/image-star/test.git

初始化一个新的仓库并指定 .git 目录:

git init   --separate-git-dir=/path/to/custom/.git

这条命令会在指定路径初始化一个新的 Git 仓库。

在现有目录中使用不同的 .git 目录:

cd existing-directory

git --git-dir=../custom/.git status

如果你已经在一个项目目录中,但是想要使用一个不同的 .git 目录,你可以使用这个命令来检查仓库的状态。

--work-tree=<path>:设置 Git 仓库的工作目录为 <path>。

使用 --work-tree 指定工作目录:如果你想在特定的目录中工作(即,你想要做 Git 操作的目录),可以使用 --work-tree 选项。

git --work-tree=/path/to/your/workdir ...

结合使用 --git-dir 和 --work-tree:你可以在同一个命令中同时使用这两个选项,来指定 Git 应该使用哪个 .git 目录和工作目录。

git --git-dir=/path/to/your/.git --work-tree=/path/to/your/workdir status

--namespace=<name>:在显示引用名称时,添加指定的命名空间 <name>。

通常与 git remote add 命令一起使用,用于为远程仓库设置一个命名空间。这在管理多个远程仓库时非常有用,特别是当你需要区分具有相同仓库名称的多个远程仓库时。

--super-prefix=<path>:设置前缀,用于在显示或记录引用时扩展 SHAs。

这个选项设置了一个路径前缀,该前缀是从存储库的根目录到其上方的路径。

--config-env=<name>=<envvar>:从环境变量 <envvar> 中读取 Git 配置项 <name> 的值。

当使用 --config-env 选项时,Git 会读取指定的环境变量 envvar 的值,并将其用作配置项 name 的值。如果环境变量不存在,Git 将使用配置项的默认值。

3.常用命令

一、开始工作区

1.init: 初始化一个新的 Git 仓库或重新初始化一个已存在的仓库。

2.clone: 克隆一个远程仓库到本地。

二、对当前更改进行操作

1.add: 将文件内容添加到暂存区。
1.1添加单个文件:

git add <filename>

1.2添加多个文件:

git add <file1> <file2> ...

或者使用通配符来添加多个文件,例如:

git add *.txt

1.3添加所有更改:

使用以下命令可以添加所有更改(包括新文件和修改过的文件):

git add .

这里的点(.)代表当前目录及其子目录下的所有更改。

1.4交互式添加:

git add -i或者git add --interactive

这将允许你选择性地暂存或取消暂存特定的更改。

  1. status: 显示当前工作目录中已跟踪和未跟踪文件的状态

  1. update: 更新已存在的文件,将更改添加到索引中。直接回车或者*全选

  1. revert: 撤销暂存

  1. add: 将未跟踪的文件添加到索引中。

  1. patch: 允许你对单个文件进行更细粒度的控制,可以暂存部分更改。

y - stage this hunk:

选择 "y"(代表 "yes")将当前的代码块(hunk)暂存。如果你想保留这个代码块作为下次提交的一部分,就选择这个选项。

n - do not stage this hunk:

选择 "n"(代表 "no")表示不暂存当前的代码块。如果你想保留这个代码块但不将其作为下次提交的一部分,就选择这个选项。

q - quit:

选择 "q" 退出交互式暂存界面,并且不暂存当前代码块或之后的所有代码块。这通常在你决定不再进行任何暂存操作时使用。

a - stage this hunk and all later hunks in the file:

选择 "a"(代表 "all")将当前代码块以及同一文件中的所有后续代码块暂存。如果你认为从当前代码块到文件末尾的所有更改都应该包括在下次提交中,就选择这个选项。

d - do not stage this hunk or any of the later hunks in the file:

选择 "d" 表示不暂存当前代码块或同一文件中的任何后续代码块。这在你决定从当前点开始不暂存任何更改时使用。

e - manually edit the current hunk:

选择 "e" 手动编辑当前的代码块。这允许你查看和修改暂存界面中显示的更改,或者分割一个代码块为更小的部分,然后选择暂存或不暂存这些部分。

? - print help:

输入 "?" 将显示帮助信息,解释每个选项的用途。

  1. diff: 显示选中文件的更改。

  1. quit: 退出交互式添加模式。

  1. help

status:

使用 status 可以查看当前工作目录中所有更改的概览,包括新文件、修改过的文件和删除的文件,以及它们是否已经暂存。

update:

update 用于将工作目录中的更改添加到暂存区。如果你选择这个选项,Git 会要求你选择特定的文件或代码块(hunks)来暂存。

revert:

revert 用于撤销暂存区中的更改,将暂存区的更改回退到最后一次提交(HEAD)的状态。这不会改变工作目录中的文件。

patch:

patch 允许你对更改进行更细粒度的控制。你可以逐个代码块地选择是否暂存,这提供了一种选择性暂存更改的方法。

diff:

使用 diff 可以查看暂存区(index)与最后一次提交(HEAD)之间的差异。

add untracked:

add untracked 用于将未跟踪的新文件添加到暂存区。这不会改变这些文件的跟踪状态,除非你执行 git commit。

1.5更新暂存区

将已跟踪文件的更改添加到暂存区(index),但不会影响未跟踪的新文件或已删除的文件。如果你之前已经使用 git rm --cached <file> 将文件从暂存区删除,使用 git add -u 会将这些文件重新添加到暂存区。

git add -u

1.6使用补丁

git add -p

这将允许你逐个审查和选择哪些更改将被暂存。

y: 选择 "y"(代表 "yes")将当前显示的补丁添加到暂存区。

n: 选择 "n"(代表 "no")跳过当前补丁,不将其添加到暂存区。

a: 选择 "a"(代表 "all")将当前补丁以及文件中剩余的所有补丁添加到暂存区。

q: 选择 "q"(代表 "quit")退出交互式添加模式,不将当前或任何剩余的补丁添加到暂存区。

d: 选择 "d" 跳过当前补丁,并且不添加文件中剩余的任何补丁到暂存区。

e: 选择 "e" 进入手动编辑模式,允许你对当前补丁进行编辑,分割或修改它。

s: 选择 "s" 将当前补丁分割成较小的补丁,然后可以选择将这些较小的补丁分别添加到暂存区。

?: 输入 "?" 显示交互式添加模式的帮助信息。

1.7添加所有更改,忽略已忽略的文件:

使用以下命令可以添加所有更改,但忽略那些在 .gitignore 中指定的文件:

git add -A

2.mv: 移动或重命名文件、目录或符号链接。
2.1重命名文件

git mv oldname newname

这个命令将 oldname 文件重命名为 newname,并自动记录这个更改。

2.2移动文件

git mv filename directory/

这个命令将 filename 移动到指定的 directory/ 目录中。

-v:显示详细的处理过程。

-f:强制执行,即使目标文件已经存在。

-n:模拟执行,不实际移动或重命名文件。

-k:如果目标文件存在,保留目标文件,不覆盖。

3.restore: 恢复工作树文件到暂存区或 HEAD 的状态(Git 2.23 版本后引入)。

git restore 命令不会影响未跟踪的文件(即从未被添加到 Git 仓库中的新文件)。如果你想要撤销对这些文件的更改,你需要使用 git restore <file> 并指定这些文件的名称。

撤销对暂存区的更改(即已经使用 git add 添加但尚未提交的更改),可以使用 git restore --staged <file> 或 git restore --staged . 来实现。这将从暂存区中移除更改,但不会影响工作目录中的文件状态。

3.1还原文件到最新提交的状态:

git restore <file>

这个命令可以将指定文件恢复到最新的提交状态,丢弃所有未提交的更改。

3.2还原文件到暂存区的状态:

git restore --staged <file>

如果已经使用 git add 将文件添加到暂存区,但希望撤销这些更改,可以使用这个命令。它将文件恢复到暂存区的状态,但不影响工作目录中的文件。

3.3还原全部更改:

git restore .

这个命令将还原所有未提交的更改,包括工作目录和暂存区的更改。使用这个命令要谨慎,因为它会清除所有未提交的修改。

3.4还原文件到指定提交的状态:

git restore --source=<commit> <file>

如果想将文件恢复到特定提交的状态,可以使用这个命令。将 <commit> 替换为要将文件恢复到的提交的哈希值。

获取提交的哈希值:

使用 git log 命令:q退出

git log 命令会列出所有提交的哈希值和相关信息。

使用 git rev-parse HEAD 命令:

这个命令将返回当前 HEAD 指针所指向的提交的哈希值,即当前分支的最新提交。

使用 git show 命令:

git show 命令显示当前提交的详细信息,包括哈希值。可以通过指定提交的哈希值来查看特定提交的详细信息。

使用 Git GUI 工具:

如果你更喜欢图形界面,可以使用 Git GUI 工具,如 SourceTree,通过搜索提交消息来获取提交哈希值。

通过哈希值查找提交:

一旦你获得了特定的哈希值,可以使用 git show <hash> 命令来查找该提交的详细信息,包括作者、时间、变更内容等。

4.rm: 从工作区和暂存区删除文件。

git rm 命令本身不是用来删除未跟踪文件的。这个命令用于从 Git 仓库中删除已经被跟踪的文件

4.1删除单个文件

git rm <file>

4.2删除多个文件

git rm <file1> <file2> ...

4.3删除目录

如果需要删除一个目录及其所有内容,可以使用:

git rm -r <directory>

-r 选项告诉 Git 递归地删除目录及其内容。

4.4强制删除

如果文件已经被添加到暂存区,直接删除文件可能不会反映到暂存区。使用 -f(force)选项可以强制从暂存区删除文件:

git rm -f <file>

4.5保留文件但删除其版本控制

使用 --cached 选项可以删除文件的版本控制,但保留文件在文件系统中:

git rm --cached <file>

这将从暂存区删除文件,但不会删除工作目录中的文件。可用git add -u 撤销

4.6使用通配符:

可以使用通配符删除多个匹配特定模式的文件:

git rm '*.log'

4.7安静模式:

使用 -q(quiet)选项可以减少命令的输出,使命令执行更加安静:

git rm -q <file>

4.8删除并记录删除原因:

使用 -m 选项可以为删除操作添加一个删除信息:

git rm -m "Remove old log file" <file>

4.9删除后自动提交:

使用 --commit 选项可以在删除文件后立即提交更改:

git rm --commit <file>

使用 git rm 命令可以有效地管理你的项目文件和版本历史,确保不需要的文件不会遗留在版本库中。记得在删除文件后执行 git commit 来提交这些更改。

三、检查历史和状态

1.bisect: 使用二分搜索来查找引入错误的提交。

开始二分查找:

使用 git bisect start 命令开始二分查找过程。

标记已知状态:

使用 git bisect bad 命令标记当前的提交(HEAD)为引入错误的提交。

使用 git bisect good <commit> 命令标记一个已知的正确状态的提交。这个提交作为二分查找的起点。

自动跳转到中间提交:

Git 会自动跳转到两个已知状态之间的中间提交。

测试当前提交:

检查当前跳转到的提交是否存在问题。

标记测试结果:

如果当前提交存在问题,使用 git bisect bad 命令告诉 Git。

如果当前提交没有问题,使用 git bisect good 命令告诉 Git。

重复测试和标记:

重复步骤 4 和 5,Git 会继续自动跳转到下一个中间提交,直到找到引入问题的最早提交。

结束二分查找:

使用 git bisect reset 命令结束二分查找过程,并返回到开始查找之前的状态。

查看结果:当二分查找完成后,Git 会告诉你引入问题的确切提交。

2.diff: 显示提交之间、提交和工作树之间的更改。
2.1查看工作目录与暂存区的差异

git diff

这个命令显示了工作目录中已修改但尚未暂存的文件差异,不包括未跟踪文件

2.2查看暂存区与最近一次提交的差异

git diff --cached使用 git diff --staged,这将显示已经暂存但尚未提交的更改。

2.3查看与上一次提交的差异

git diff HEAD

2.4查看所有文件的差异,包括未跟踪的文件

git diff --all 或者git diff -a

这个命令显示了所有更改的差异,包括新文件和删除的文件。

3.grep: 打印匹配模式的行。

允许你在 Git 仓库的历史记录中搜索文本模式。这个命令可以在整个项目的任何提交中搜索字符串、正则表达式等,非常适用于追踪代码中的特定用法或查找特定代码片段。

搜索整个仓库:

使用 git grep "pattern" 可以在整个仓库的所有文件中搜索包含 "pattern" 的行。

搜索特定文件:

你可以指定一个文件名来在该文件中搜索 "pattern":

git grep "pattern" <filename>

搜索特定目录:

使用 -- 来分隔目录路径和搜索模式,然后在指定目录下搜索 "pattern":

git grep "pattern" -- <directory>

搜索特定提交:

使用 git grep 加上提交的哈希值可以搜索特定提交中的 "pattern":

git grep "pattern" <commit-hash>

使用正则表达式:

git grep 支持正则表达式搜索,只需确保将正则表达式用引号括起来:

git grep 'regular expression'

忽略大小写:

使用 -i 选项可以进行不区分大小写的搜索:

git grep -i "pattern"

只显示行数:

使用 -n 选项可以显示匹配行的行号:

git grep -n "pattern"

只显示匹配的行:

使用 -o 选项可以仅显示匹配的部分,而不是整个文件的内容:

git grep -o "pattern"

扩展的正则表达式:

使用 -E 选项可以启用扩展的正则表达式(ERE):

git grep -E 'extended regular expression'

搜索文件名:

使用 --name-only 选项可以搜索包含特定模式的文件名:

git grep --name-only "pattern"

忽略二进制文件:

使用 --skip-binary 选项可以忽略二进制文件,防止在搜索时损坏输出:

git grep --skip-binary "pattern"

使用颜色:

使用 --color 选项可以高亮显示匹配的文本:

git grep --color "pattern"

4.log: 显示提交日志。

显示所有提交记录:

git log

限制显示的提交数量:

使用 -<n> 可以限制输出的提交数量。例如,显示最新的三个提交:

git log -3

搜索提交信息:

使用 --grep=<pattern> 可以搜索包含特定文本的提交信息:

git log --grep="fix bug"

显示简化的提交信息:

使用 --oneline 可以将每个提交压缩成单行显示:

git log --oneline

显示图形化的提交历史:

使用 --graph 可以显示 ASCII 图形化的提交历史:

git log --graph

显示某个文件或目录的提交历史:

使用 -- <path> 可以显示特定文件或目录的提交历史:

git log -- README.md

显示每个提交的 diffs:

使用 -p 可以显示每个提交的差异(diffs):

git log -p

显示某个作者的提交:

使用 --author=<name> 可以显示特定作者的提交:

git log --author="John Doe"

显示统计信息:

使用 --stat 可以显示每个提交的文件修改统计信息:

git log --stat

显示每个提交的提交者和日期:

使用 --decorate 可以显示每个提交的额外信息,如提交者和日期:

git log --decorate

显示相对日期:

使用 --relative-date 可以显示相对日期而不是完整日期:

git log --relative-date

显示所有引用(分支、标签)的引用日志:

使用 --all 可以显示所有引用的日志,不仅限于当前分支:

git log --all

5.show: 显示各种类型的对象(如提交、树、blob)。

包括提交(commit)、标签(tag)、分支(branch)或者 blob。它通常用来查看这些对象的详细内容。

显示特定提交的信息:

git show <commit>

这里的 <commit> 可以是提交的哈希值、引用日志或其他标识符。

显示提交的差异:

使用 -p 选项可以显示特定提交的补丁(即差异 diff):

git show -p <commit>

显示标签对象:

git show <tag>

这将显示与标签关联的提交信息。

显示分支的最后一次提交:

git show <branch>

这将显示该分支最后一次提交的详细信息。

显示差异的统计信息:

使用 --stat 选项可以显示差异统计,展示文件的增改情况:

git show --stat <commit>

显示单行提交信息:

使用 --oneline 可以将提交信息显示为单行:

git show --oneline <commit>

显示提交的摘要:

使用 --summary 可以显示每个文件的更改摘要:

git show --summary <commit>

显示特定行数的上下文:

使用 -U 可以指定显示差异时的上下文行数:

git show -U7 <commit>

显示提交的元数据:

使用 --pretty 可以指定输出格式,例如使用 oneline、short、medium、full、fuller 或 raw:

git show --pretty=fuller <commit>

显示 blob 的内容:

如果你有一个 blob 的哈希值,可以使用 git show 来显示它的内容:

git show <blob>

显示树的目录结构:

对于树对象,git show 可以列出树中所有文件的目录结构:

git show <tree>

显示特定文件在特定提交时的内容:

使用 git show 可以查看特定文件在某个提交时的样子:

git show <commit>:<file>

6.status: 显示工作树的状态。

显示了当前工作目录与暂存区(index)的状态。它会列出哪些文件被修改了、哪些文件已经暂存了、哪些文件还没有被跟踪(untracked),以及是否有文件被删除了。

查看所有更改:

执行 git status 将显示所有未暂存和已暂存的更改。

git status

查看简短的状态:

使用 -s 选项可以仅显示一个简短的状态摘要。

git status -s

查看未暂存的更改:

使用 -uno 选项可以查看未暂存的更改,包括新文件和修改过的文件。

git status -uno

查看已暂存的更改:

使用 --porcelain 选项可以以一种易于脚本解析的格式显示已暂存的更改。

git status --porcelain

查看忽略的文件:

使用 --ignore-submodules 选项可以显示子模块的更改状态。

git status --ignore-submodules

查看分支状态:

git status 还会显示当前所在的分支名称,以及与远程分支的差异(如果有的话)。

查看跟踪的删除文件:

使用 -v 或 --verbose 选项可以显示更详细的信息,包括已经被 Git 跟踪但在工作目录中已被删除的文件。

git status -v

检查未跟踪的文件:

git status 会列出所有未跟踪的新文件,你可以使用 git add 将它们暂存以包含在下次提交中。

检查冲突:

如果在合并过程中存在冲突,git status 会列出存在冲突的文件,并指示你需要手动解决这些冲突。

四、修改历史

1.branch: 列出、创建或删除分支。
1.01列出所有本地分支

执行 git branch 会显示仓库中所有的本地分支。当前分支前面会有一个星号(*)。

git branch

1.02创建新分支

使用 -b 选项可以创建一个新的分支。

1.03删除分支

使用 -d 选项可以删除一个已经合并到当前分支的分支。

1.04强制删除分支

如果分支上还有未合并的更改,可以使用 D 选项强制删除分支。

git branch -D branch-to-delete

1.05切换到分支

使用 git checkout 命令可以切换到指定的分支。

git checkout branch-name(git switch branch-name)

1.06查看远程分支

使用 -r 选项可以列出所有的远程分支。

git branch -r

1.07查看本地和远程分支

使用 -a 选项可以列出所有本地和远程分支。

git branch -a

1.08设置跟踪分支

当创建新分支时,可以使用 -u 或 --set-upstream-to 选项设置上游(tracking)分支。

git branch -u origin/branch-name new-branch

git branch --set-upstream-to=<remote-branch> <branch-name>

1.09查看分支的提交记录

使用 --merged 可以列出所有已经合并到当前分支的分支。

git branch --merged

1.10查看未合并的分支

使用 --no-merged 可以列出所有尚未合并到当前分支的分支。

git branch --no-merged

1.11排序分支

使用 --sort 选项可以根据不同的标准对分支进行排序,例如日期或提交者。

git branch --sort=-committerdate

1.12列出更多分支信息

使用 -vv 选项可以显示每个分支的上游分支和最后提交信息。

git branch -vv

2.commit: 记录对仓库的更改。

git commit 是版本控制工作流程中的一个基本环节,它帮助你记录代码的变更点,并为这些变更附上说明,以便于未来的代码审查和历史跟踪

feat: 新增功能

fix: 修复bug

refactor: 重构代码

pert: 性能优化

2.1提交暂存区的更改

使用 -m 选项后跟提交信息,可以提交暂存区的更改:

git commit -m "Your commit message"

2.2提交所有更改

使用 -a 选项可以自动暂存所有已跟踪的文件的更改,然后提交:

git commit -a -m "Commit message for all changes"

2.3修改最后一次提交

如果你想要修改最后一次提交,可以使用 --amend 选项:

git commit --amend -m "Updated commit message"

2.4使用编辑器写提交信息

如果你没有使用 -m 选项,Git 会打开默认的文本编辑器让你写提交信息。

git commit

2.5禁用钩子

使用 --no-verify 选项可以禁用所有提交前钩子(pre-commit hooks):

git commit --no-verify -m "Commit message"

2.6保留合并提交

使用 --no-edit 选项可以保留合并提交的原始提交信息:

git commit --no-edit

2.7使用签名的提交

使用 git commit 与 -s 选项可以创建一个 GPG 签名的提交:

git commit -s -m "Signed commit message"

3.merge: 将两个或多个开发历史合并在一起。
3.1合并指定分支

将指定分支的更改合并到当前分支:

git merge feature-branch

3.2合并远程分支

将远程分支的更改合并到当前分支:

git merge origin/feature-branch

3.3解决合并冲突

如果合并过程中出现冲突,Git 会停止合并并让你手动解决这些冲突。解决冲突后,你可以使用 git add 将解决后的文件暂存,然后提交合并:

git add <解决冲突后的文件>

git commit

3.4快进合并

如果没有冲突,Git 可能会执行一个快进合并,这意味着直接将当前分支的指针移动到合并分支的最新提交。

3.5合并提交

即使有多个提交,Git 也可能将它们合并为一个单一的提交,称为合并提交(merge commit)。你可以使用 --no-ff 选项来确保即使在快进情况下也创建一个合并提交:

git merge --no-ff feature-branch

3.6合并时的提交信息

使用 -m 选项可以为合并提交指定一个特定的提交信息:

git merge -m "Merge feature-branch into main" feature-branch

3.7合并策略

使用 -s 选项可以指定不同的合并策略,例如 ours、theirs 或自定义策略:

git merge -s ours main

3.8查看合并的基础提交

使用 git merge-base 可以查看两个分支的共同祖先:

git merge-base main feature-branch

3.9撤销合并

如果你需要撤销一个合并操作,可以使用 git revert 命令。

撤销最后一次提交:

git revert HEAD

这会撤销最后一次提交所做的所有更改。

撤销特定提交:

git revert <commit>

将 <commit> 替换为你想要撤销的提交的哈希值。

撤销合并提交:

合并提交有两个父提交,使用 git revert 时,Git 会尝试选择主线并逆向合并。如果你想要逆向两个父提交中的特定一边,可以使用 -m 选项:

git revert -m <parent-number> <merge-commit>

4.rebase: 在另一个基础提交之上重新应用提交。

将一个分支的更改重新应用到另一个分支上,从而创建一个更干净、线性的提交历史。这通常用于将特性分支的更改整合到更新后的主分支上。

开始变基:

将当前分支的更改变基到指定分支上:

git rebase main

交互式变基:

使用 -i 选项可以以交互式模式进行变基,允许你编辑、重新排序、合并或删除提交:

git rebase -i main

继续变基:

如果在变基过程中遇到冲突,解决了冲突并暂存更改后,使用 git rebase --continue 继续变基:

git rebase --continue

变基时解决冲突:

如果变基过程中出现冲突,Git 会停止变基并让你手动解决这些冲突。解决冲突后,使用 git add 将解决后的文件暂存,然后执行 git rebase --continue。

取消变基:

如果在变基过程中遇到问题,可以使用 git rebase --abort 取消当前的变基操作,回到变基前的状态:

git rebase --abort

变基到特定提交:

使用 git rebase 可以指定一个特定的提交而不是分支,将当前分支从该提交开始的更改变基:

git rebase <commit-hash>

自动变基:

使用 --autosquash 选项可以在交互式变基时自动合并一系列小的提交:

git rebase -i --autosquash <commit-hash>

变基时保持提交者日期:

使用 --keep-empty 选项可以在变基时保留空提交,这可以保留提交者日期:

git rebase --keep-empty main

变基多个分支:

使用 git rebase 可以依次将多个分支变基到另一个分支:

git rebase main feature1 feature2

变基时的提交信息:

使用 -m 或 --rebase-merges 选项可以在变基合并提交时保留原始的合并提交信息:

git rebase -m main

5.reset: 重置当前 HEAD 到指定状态。

git reset 命令在 Git 中用于将当前分支的 HEAD 指针移动到指定的状态,但不会影响工作目录中的文件。这个命令常用于撤销提交、修改提交或重新整理提交历史。

5.1重置当前分支到特定提交

使用 <commit> 替换为你想重置到的提交的哈希值:

git reset <commit>

5.2混合重置(默认)

--mixed 是默认选项,它会重置 HEAD、索引区(暂存区)和工作目录:

git reset --mixed <commit>

5.3软重置:

使用 --soft 选项重置 HEAD 和索引区,但不更改工作目录中的文件:

git reset --soft <commit>

这将取消提交,但不更改工作目录,使得更改可以重新提交。

5.4硬重置

使用 --hard 选项重置 HEAD、索引区和工作目录,清除所有未提交的更改:

git reset --hard <commit>

这将撤销提交及其所有更改,使用时要小心,因为它会丢失所有未提交的更改。

5.5重置HEAD但保留索引区

使用 --keep 选项重置 HEAD 但不更改索引区:

git reset --keep <commit>

5.6移动HEAD但不更新索引区

使用 --no-commit 选项移动 HEAD 但不创建一个新的提交:

git reset --no-commit

5.7重置到上一个提交

使用 HEAD^ 表示当前 HEAD 的父提交:

git reset --mixed HEAD^

5.8重置到上上个提交

使用 HEAD~2 表示当前 HEAD 的两个父提交:

git reset --mixed HEAD~2

5.9重置文件:

如果你想重置特定的文件而不是整个仓库,可以在命令中指定文件:

git reset --mixed <commit> <file>

重置到远程分支

如果你想将本地分支重置到远程分支的状态:

git reset --hard origin/main

6.switch: 切换分支(checkout)。
6.1切换到现有分支

使用 git switch 命令可以直接切换到一个已存在的分支:

git switch branch-name

6.2创建并切换到新分支

使用 -c 选项可以创建一个新的分支并立即切换到该分支:

git switch -c new-branch

6.3切换到远程分支

创建并切换到远程分支的本地副本:

git checkout -b <local-branch-name> origin/<remote-branch-name>

6.4创建并切换到新分支,并设置上游分支

使用 --track 选项或 -u 可以创建一个新的分支并设置其跟踪远程分支:

git switch -c new-branch --track origin/branch-name

6.5切换到上一个分支

使用 - 可以快速切换回上一个分支:

git switch -

6.6查看所有分支

使用 git branch 命令可以查看所有分支的列表,包括本地和远程分支。

6.7删除分支

虽然 git switch 本身不用于删除分支,但你可以在使用 git switch 切换分支后,使用 git branch -d 删除当前不在的分支。

6.8重命名分支:

使用 git branch -m 可以重命名分支,然后使用 git switch 切换到重命名后的分支。

7.tag: 创建、列出、删除或验证 GPG 签名的标签对象。

列出所有标签:

不带任何参数执行 git tag 会列出仓库中所有的标签。

git tag

创建新标签:

使用 a 选项可以创建一个新的附注标签(annotated tag),并允许你编辑标签信息:

git tag -a v1.0.0

创建轻量级标签:

如果不使用 a 选项,Git 将创建一个轻量级标签,它没有额外的元数据:

git tag v1.0.0

查看标签信息:

使用 git show 可以查看标签的详细信息,包括标签消息和指向的提交:

git show v1.0.0

删除标签:

使用 d 选项可以删除一个标签:

git tag -d v1.0.0

推送标签到远程仓库:

使用 git push 可以推送本地标签到远程仓库:

git push origin v1.0.0

或者推送所有标签:

git push origin --tags

删除远程标签:

使用 git push 与 --delete 选项可以删除远程仓库中的标签:

git push origin --delete tag v1.0.0

检出标签对应的提交:

使用 git checkout 可以切换到标签对应的提交:

git checkout v1.0.0

搜索标签:

使用 -l 选项和搜索模式可以搜索匹配特定模式的标签:

git tag -l 'v1.0'

列出标签的详细信息:

使用 -n 选项和 --contains 可以列出所有包含特定提交的标签:

git tag --contains <commit-hash>

验证标签:

使用 git tag -v 可以验证标签的 GPG 签名:

git tag -v v1.0.0

五、协作

1.fetch: 从另一个仓库下载对象和引用。

获取远程仓库的最新状态:

执行 git fetch 可以获取远程仓库(通常是 origin)的最新状态,包括所有分支的最新提交。

git fetch

指定远程仓库:

使用 -u 或 --update 选项可以指定远程仓库,并更新本地的远程跟踪分支。

git fetch -u origin

获取特定分支:

可以指定一个特定的远程分支进行获取,例如:

git fetch origin main

所有远程仓库:

使用 --all 选项可以获取所有已知远程仓库的最新状态。

git fetch --all

强制更新远程跟踪分支:

使用 --force 或 -f 选项可以强制更新远程跟踪分支,即使有冲突。

git fetch --force

获取并合并:

使用 git pull 命令可以获取远程分支的更改并自动合并到当前分支。git fetch 命令本身不会合并更改,但可以与 git merge 配合使用来合并远程分支的更改。

git fetch

git merge origin/main

获取并重置当前分支:

使用 --reset 选项可以在获取远程分支后将当前分支重置为远程分支的状态。

git fetch --reset

获取并自动清理:

使用 --tags 选项可以在获取远程分支的同时也获取远程的标签。

git fetch --tags

深度获取:

使用 --depth 选项可以获取远程仓库的浅拷贝,只包含一定数量的提交。

git fetch --depth=1

获取特定提交:

如果只需要获取特定的提交而不是整个分支,可以使用 git fetch 与提交哈希值。

git fetch origin <commit-hash>

2.pull: 从另一个仓库或本地分支获取并集成更改。
2.1拉取远程分支的最新更改

默认情况下,git pull 会拉取远程仓库(通常是 origin)的 main 分支的最新更改,并尝试与当前分支合并。

git pull

2.2拉取特定远程分支

可以指定远程分支来拉取特定的更改:

git pull origin feature-branch

2.3拉取并创建本地分支

如果本地不存在对应的远程跟踪分支,git pull 会自动创建它。

git pull origin new-remote-branch

2.4拉取后保留本地提交

git pull 默认会执行快进合并,如果可能的话,这意味着它会更新本地分支指针到远程分支的最新提交。

git pull --ff-only

2.5拉取并创建合并提交

使用 --no-ff 选项可以确保即使在快进情况下也创建一个合并提交。

git pull --no-ff

2.7拉取并自动解决冲突

使用 --rebase 选项可以拉取远程更改并在本地更改之上重新应用它们,而不是创建一个合并提交。

git pull --rebase

2.8拉取特定标签

可以使用 git pull 拉取与特定标签关联的提交。

git pull origin tag-name

2.9拉取所有远程分支

使用 --all 或 -a 选项可以拉取所有远程分支的更新。

git pull --all

2.91拉取并更新本地分支和远程跟踪分支

使用 -u 选项可以更新本地分支和对应的远程跟踪分支。

git pull -u origin feature-branch

拉取并自动 stash:

使用 --stash 选项可以在拉取前自动 stash 未提交的更改,并在完成后再次应用这些 stash。

git pull --stash

3.push: 更新远程引用和相关的对象。
3.1推送到远程仓库

默认情况下,git push 会推送当前分支到远程仓库的对应跟踪分支。

git push

3.2指定远程仓库和分支

可以指定远程仓库和分支来推送特定的更改:

git push <remote-name> <branch-name>

3.3推送所有本地分支

使用 --all 选项可以推送所有本地分支的更改到远程仓库:

git push --all

3.4推送标签

使用 --tags 选项可以推送所有未推送的标签到远程仓库:

git push --tags

3.5强制推送

使用 --force 或 -f 选项可以强制推送本地更改,即使这会导致远程仓库的更改丢失:

git push --force

注意:强制推送可能会覆盖远程分支上的更改,应谨慎使用。

3.6删除远程分支

使用 --delete 选项可以删除远程仓库中的分支:

git push --delete <remote-name> <branch-name>

3.7设置上游分支

推送时使用 -u 或 --set-upstream 选项可以设置本地分支跟踪远程分支:

git push -u origin <本地分支名>

3.8推送特定提交

可以使用特定的提交哈希值来推送到远程分支:

git push <remote-name> <commit-hash>:<branch-name>

3.9推送并创建远程分支

如果远程仓库中不存在要推送的分支,git push origin 本地分支:远程分支

使用 SSH 推送:

如果远程仓库配置为使用 SSH 进行认证,git push 将使用 SSH 密钥进行认证。

推送时忽略远程拒绝:

使用 --quiet 选项可以静默推送,即使推送被远程拒绝。

推送前检查是否快进:

使用 --ff-only 选项可以确保推送的更改可以被快进合并,否则推送将被拒绝。

六、获取更多帮助

git help -a 和 git help -g: 列出所有可用的子命令和一些概念指南。

git help <command> 或 git help <concept>: 读取关于特定子命令或概念的帮助信息。

git help git: 获取 Git 系统的概述。

2)commit的自由切换。

1.切换分支

git checkout new-feature 或 git switch new-feature

2.显示历史,获取哈希值

git log

3.重置当前分支到特定提交

使用 <commit> 替换为你想重置到的提交的哈希值:

git reset <commit>

这将会进入“detached HEAD”状态。在这个状态下,你可以浏览、修改和提交代码,但这些提交不会与任何分支相关联。这意味着如果你切换回其他分支或拉取(pull)新代码,这些修改可能会丢失。

4.创建新分支以保留修改

如果你希望在“detached HEAD”状态下做的修改被保留,你应该在切换commit之前或之后创建一个新分支。

在切换commit之前:

git checkout -b <new-branch-name> <commit-hash>

在切换commit之后

git branch <new-branch-name>

3)pull request

Fork 仓库(如果需要):如果你是外部贡献者,你需要先 Fork 项目仓库到自己的账户下。

克隆仓库:将 Fork 后的仓库克隆到本地。

创建分支:在本地仓库中创建一个新的分支,用于开发你的功能或修复。

编写代码:在新分支上编写你的代码。

提交更改:将你的代码更改提交到本地分支。

git add .

git commit -m "提交信息"

推送分支:将你的分支推送到你的远程仓库(通常是你的 Fork)。

git push -u 远程仓库别名 本地分支:远程分支

发起 Pull Request:

访问远程仓库的网页界面。

找到 "Compare & pull request" 或 "New pull request" 的选项。

选择你的源分支(你的更改所在的分支)和目标分支(你想要合并到的分支,通常是主分支)。

描述 Pull Request:在 Pull Request 页面上,添加标题和描述,说明为什么你进行了这些更改,以及它们解决了什么问题。

提交 Pull Request:提交你的 Pull Request,请求项目维护者或团队成员审查你的代码。

代码审查:其他开发者将审查你的代码,可能会提出问题或建议修改。

讨论和修改:根据反馈,你可能需要对你的代码进行进一步的更改,并重新提交。

合并 Pull Request:一旦你的代码被接受,项目维护者或有权限的成员可以将其合并到目标分支中。

关闭 Pull Request:合并完成后,Pull Request 将自动关闭。

管理员

在 仓库管理 - 保护分支设置 ,新增了一个保护分支规则master,并且设置了它为评审模式以及禁止任何人推送,那么无论是谁(前提当然得是仓库成员啦)往master分支推送代码,都会自动创建一个 Pull Request:

在管理菜单下的保护分支设置界面中

点击新建规则

设置规则生效的分支

设置推送代码人员为禁止任何人推送

选择可合并分支的人员

点击保存

4)branch分支管理

1.查看分支

列出所有本地分支:git branch

列出所有本地和远程分支:git branch -a

列出已合并到当前分支的分支:git branch --merged

列出未合并到当前分支的分支:git branch --no-merged

2.创建分支

创建名为new-feature的新分支:git branch new-feature

从特定提交创建分支(例如,基于最近的第三次提交):git branch new-feature HEAD~3

3.切换分支

切换到已存在的分支new-feature:

git checkout new-feature 或 git switch new-feature(Git 2.23+)

4.删除分支

删除本地分支old-feature:git branch -d old-feature

如果分支未被合并,使用-D强制删除:git branch -D old-feature

5.重命名分支

git branch -m <旧分支名> <新分支名>

6.分支类型

主分支(Main Branch):

通常是 main 或 master,作为项目的根分支。

它应该是始终处于可部署状态的稳定版本。

开发分支(Development Branch):

例如 develop 或 dev 分支,用于日常开发工作。

所有新的功能和修复都在此分支上进行。

版本分支(Release Branch):

用于准备新版本的分支,如 release/1.0。

当开发分支上的代码准备发布时,会创建一个版本分支进行最后的测试和准备。

SaaS 分支:

如果项目是为软件即服务(SaaS)模型设计的,可能会有特定的分支来处理与服务相关的代码,如 saas 分支。

功能分支(Feature Branch):

每个新功能都在独立的功能分支上开发,如 feature/x。

完成后,功能分支可以合并回开发分支。

Bug 修复分支(Bugfix Branch):

用于修复生产环境中发现的问题,如 bugfix/x。

修复完成后,这些分支应该合并回主分支和开发分支。

实验分支(Experimental Branch):

用于实验性或高风险的更改,如 experiment/x。

这些分支可以自由地进行尝试,而不会影响主开发流程。

热修复分支(Hotfix Branch):

用于紧急修复生产环境中的问题,如 hotfix/x。

热修复分支通常直接从主分支拉出,并在修复后合并回主分支和开发分支。

个人分支(Personal Branch):

每个开发者可能有自己的个人分支,用于个人开发和测试。

分支管理的最佳实践:

保持主分支稳定:始终确保主分支是可部署的稳定版本。

小的频繁合并:避免长时间运行的功能分支,频繁地将更改合并回开发分支以减少合并冲突。

代码审查:在合并到主分支或开发分支之前,进行代码审查。

自动化测试:确保所有分支都有通过自动化测试,以验证代码更改不会引入错误。

清晰的命名规则:为分支命名制定清晰的规则,以便于识别分支的用途。

文档化流程:记录分支管理策略和工作流程,确保所有团队成员都理解并遵循。

添加远程仓库:

git remote add <remote-name> <url>

也许您对下面的内容还感兴趣: