Git是一个分布式版本控制系统,用于跟踪文件和文件夹的变化。它最初由Linus Torvalds在2005年创建,用于管理Linux内核的开发。Git的设计目标是速度、数据完整性和支持分布式、非线性工作流程。
与集中式版本控制系统(如SVN)不同,Git将代码仓库完全复制到每个开发者的本地计算机上,每个开发者都具有完整的代码历史记录和版本信息。这种分布式的特性使得开发者可以在没有网络连接的情况下进行工作,并且可以更轻松地处理分支、合并和代码冲突等操作。
Git使用"提交"(commit)的机制来记录文件和文件夹的变化。每次提交都包含一个快照,记录了所有被修改的文件的状态。通过提交,开发者可以轻松地回溯代码的历史、比较不同版本之间的差异,并且可以在需要时恢复到特定的版本。

Git还提供了强大的分支功能,允许开发者创建和切换不同的分支来独立开发新功能或修复错误。分支可以合并回主线,以便将不同的工作合并到一起。
除了基本的版本控制功能外,Git还提供了许多其他功能,如标签(tagging)、快速前进/回滚、远程仓库同步等。它也有丰富的命令行工具和图形用户界面(GUI)工具来支持开发者的工作流程。

Git已经成为广泛使用的版本控制系统,不仅仅用于开源项目,许多企业和个人开发者也采用Git来管理和追踪他们的代码。它的灵活性、性能和强大的功能使得它成为现代软件开发中不可或缺的工具之一。
二、安装
访问官网:https://git-scm.com/downloads下载,根据提示安装即可
三、GIT选项及参数
git -v,git --version:显示版本信息git -h,git --help:显示git帮助信息git -C :指定Git操作的工作目录git -c =:设置临时的配置选项。git --exec-path[=]:显示或设置Git的可执行文件路径。git --html-path:显示Git的HTML文档路径。git --man-path:显示Git的man手册路径。git --info-path:显示Git的info文档路径。git [-p | --paginate | -P | --no-pager]:控制Git命令的分页显示方式。git --no-replace-objects:禁止自动替换Git对象。git --bare:指定Git仓库为裸仓库。git --git-dir=:指定Git仓库的路径。git --work-tree=:指定Git工作树的路径。git --namespace=:指定Git命名空间。git --config-env==:设置环境变量来覆盖Git配置。git :要执行的Git命令。四、git命令之 git ini,初始化指定目录git仓库
--template :指定一个目录作为模板目录,Git会从该目录中复制文件到新创建的仓库中。--bare:创建一个裸仓库,即没有工作树的仓库。裸仓库通常用于共享或作为远程仓库。--shared[=]:指定Git仓库作为共享仓库,允许多个用户访问。可选的参数可以设置共享仓库的权限。-q, --quiet:静默模式,不显示详细的输出信息。--separate-git-dir :将Git仓库的存储目录与工作树分开。存储目录可以位于工作树之外。-b, --initial-branch :指定初始分支的名称。--object-format :指定要使用的哈希算法格式。五、git命令之 git remote,管理 Git 的远程仓库
git remote:列出已配置的远程仓库的简短名称。git remote -v:列出已配置的远程仓库的详细信息,包括 URL。git remote add :添加一个新的远程仓库,指定仓库的简短名称和 URL。git remote rename :将现有的远程仓库简短名称更改为新名称。git remote remove :移除指定的远程仓库。git remote set-head :设置远程仓库的 HEAD 引用。git remote show :显示指定远程仓库的详细信息。git remote prune :删除不再存在于远程仓库的分支的引用。git remote update :更新指定远程仓库的分支引用。git remote set-branches ...:设置指定远程仓库要跟踪的分支。git remote get-url :获取指定远程仓库的 URL。git remote set-url :设置指定远程仓库的 URL。git remote set-url --add :添加一个额外的 URL 到指定远程仓库。git remote set-url --delete :从指定远程仓库中删除指定的 URL。六、git命令之git pull,从远程仓库获取最新的提交并合并到当前分支
-v, --verbose:显示更详细的信息。-q, --quiet:显示更少的信息。--progress:强制显示进度报告。--recurse-submodules[=]:控制是否递归获取子模块。-r, --rebase[=(false|true|merges|interactive)]:使用变基而不是合并来合并更改。-n:在合并结束时不显示 diffstat。--stat:在合并结束时显示 diffstat。--log[=]:将 shortlog 中的(最多 条)条目添加到合并提交消息中。--signoff[=...]:添加一个 Signed-off-by 尾注。--squash:创建一个单一的提交,而不进行合并。--commit:如果合并成功,则执行提交(默认行为)。--edit:在提交之前编辑提交消息。--cleanup :控制如何从消息中删除空格和 # 注释。--ff:允许快进合并。--ff-only:如果无法进行快进合并,则中止。--verify:控制使用 pre-merge-commit 和 commit-msg 钩子。--verify-signatures:验证指定提交是否具有有效的 GPG 签名。--autostash:在合并前后自动进行暂存和恢复暂存。-s, --strategy :要使用的合并策略。-X, --strategy-option :选定合并策略的选项。-S, --gpg-sign[=]:GPG 对提交进行签名。--allow-unrelated-histories:允许合并不相关的历史。--all:从所有远程仓库获取。-a, --append:追加到 .git/FETCH_HEAD 而不是覆盖。--upload-pack :远程端的 upload pack 路径。-f, --force:强制覆盖本地分支。-t, --tags:获取所有标签及其关联的对象。-p, --prune:删除不再存在于远程的跟踪分支。-j, --jobs[=]:并行获取的子模块数量。--dry-run:演示运行,不实际执行操作。-k, --keep:保留下载的 pack 文件。--depth :减少浅克隆的历史深度。--shallow-since :基于时间减少浅克隆的历史深度。--shallow-exclude :减少浅克隆的历史深度,排除指定的提交。--deepen :增加浅克隆的历史深度。--unshallow:转换为完整仓库。--update-shallow:接受更新 .git/shallow 的引用。--refmap :指定获取的引用映射。-o, --server-option :传递给服务器的选项。-4, --ipv4:仅使用 IPv4 地址。-6, --ipv6:仅使用 IPv6 地址。--negotiation-tip :报告我们只有从该对象可达的对象。--show-forced-updates:检查所有更新的分支是否有强制更新。--set-upstream:为 git pull/fetch 设置上游分支。七、git命令之git clone,克隆远程仓库到本地
-v, --verbose:显示更详细的输出信息。-q, --quiet:显示更少的输出信息。--progress:强制显示克隆进度报告。--reject-shallow:不克隆浅层仓库。-n, --no-checkout:不创建检出(不创建工作树)。--bare:创建一个裸仓库,即没有工作树的仓库。--mirror:创建一个镜像仓库,相当于--bare的别名。-l, --local:从本地仓库克隆。--no-hardlinks:不使用硬链接,始终复制文件。-s, --shared:设置为共享仓库。--recurse-submodules[=]:在克隆时初始化子模块。--recursive[=]:--recurse-submodules的别名。-j, --jobs :并行克隆的子模块数量。--template :指定一个目录作为模板目录,Git会从该目录中复制文件到新创建的仓库中。--reference :指定参考仓库。--reference-if-able :指定参考仓库。--dissociate:在克隆时仅使用--reference选项。-o, --origin :使用指定的名称来跟踪上游仓库,默认为origin。-b, --branch :检出指定的分支,默认为远程仓库的HEAD。-u, --upload-pack :指定远程的git-upload-pack路径。--depth :创建一个指定深度的浅层克隆。--shallow-since :从指定时间开始创建浅层克隆。--shallow-exclude :深化浅层克隆的历史,排除指定的修订版本。--single-branch:只克隆一个分支,可以是HEAD或指定的--branch。--no-tags:不克隆任何标签,并使后续的拉取操作不跟踪标签。--shallow-submodules:克隆的子模块也将是浅层克隆。--separate-git-dir :将Git仓库的存储目录与工作树分开。-c, --config :在新仓库中设置配置选项。--server-option :传递给服务器的选项。-4, --ipv4:仅使用IPv4地址。-6, --ipv6:仅使用IPv6地址。--filter :对象过滤。--also-filter-submodules:对子模块应用部分克隆过滤器。--remote-submodules:克隆的子模块将使用它们的远程跟踪分支。--sparse:初始化一个稀疏检出文件,仅包含根目录下的文件。--bundle-uri :在从源远程仓库获取之前,使用指定的URI下载捆绑文件。八、git命令之git branch,分支管理
git branch dev:创建分支-v, --verbose:显示哈希值和提交主题,使用两次显示上游分支。-q, --quiet:禁止显示信息性消息。-t, --track[=(direct|inherit)]:设置分支的跟踪配置。-u, --set-upstream-to <upstream>:更改上游信息。--unset-upstream:取消上游信息。--color[=<when>]:使用彩色输出。-r, --remotes:操作远程跟踪分支。--contains <commit>:仅显示包含指定提交的分支。--no-contains <commit>:仅显示不包含指定提交的分支。--abbrev[=<n>]:使用 <n> 个数字显示对象名称-a, --all:列出本地分支和远程跟踪分支。-d, --delete:删除已完全合并的分支。-D:删除分支,即使它未完全合并。-m, --move:移动/重命名分支及其引用日志。-M:即使目标分支存在,也移动/重命名分支。-c, --copy:复制分支及其引用日志。-C:即使目标分支存在,也复制分支。-l, --list:列出分支名称。--show-current:显示当前分支名称。--create-reflog:创建分支的引用日志。--edit-description:编辑分支的描述。-f, --force:强制创建、移动/重命名、删除分支。--merged <commit>:仅显示已合并的分支。--no-merged <commit>:仅显示未合并的分支。--column[=<style>]:以列的形式列出分支。--sort <key>:按指定字段进行排序。--points-at <object>:仅显示与指定对象相关的分支。-i, --ignore-case:排序和过滤不区分大小写。--recurse-submodules:递归处理子模块。--format <format>:指定输出的格式。九、git命令之git add,将文件或目录添加到Git的暂存区
-A, --all, . :添加所有已跟踪和未跟踪文件的更改。-n, --dry-run:演示运行,不实际执行添加操作,只显示将要被添加的文件。-v, --verbose:显示详细的输出信息。-i, --interactive:交互式选择要添加的文件。-p, --patch:交互式选择要添加的文件补丁(hunks)。-e, --edit:编辑当前的差异(diff)并进行添加。-f, --force:允许添加被忽略的文件。-u, --update:更新已跟踪的文件。--renormalize:重新规范化已跟踪文件的行尾(EOL),相当于-u的别名。-N, --intent-to-add:仅记录将来要添加的路径。--ignore-removal:忽略工作树中已删除的文件(与--no-all相同)。--refresh:仅刷新索引,不进行添加操作。--ignore-errors:跳过因错误而无法添加的文件。--ignore-missing:在演示运行中检查(即使缺失的)文件是否被忽略。--sparse:允许更新稀疏检出范围之外的条目。--chmod (+|-)x:覆盖指定文件的可执行位。--pathspec-from-file <file>:从文件中读取路径规范(pathspec)。--pathspec-file-nul:与--pathspec-from-file一起使用,路径规范元素以NUL字符分隔。十、git命令之git commit,将缓存区的内容保存到仓库
-q, --quiet:在成功提交后禁止显示摘要信息。-v, --verbose:在提交消息模板中显示差异。-F, --file <file>:从文件中读取提交消息。--author <author>:覆盖提交的作者信息。--date <date>:覆盖提交的日期。-m, --message <message>:提交消息。-c, --reedit-message <commit>:重用并编辑指定提交的消息。-C, --reuse-message <commit>:重用指定提交的消息。--fixup [(amend|reword):]<commit>:使用自动修复格式的消息来修复或修改指定的提交。--squash <commit>:使用自动压缩格式的消息来压缩指定的提交。--reset-author:将提交的作者更改为当前用户(与 -C/-c/--amend 一起使用)。--trailer <trailer>:添加自定义的 trailer。-s, --signoff:添加一个 Signed-off-by trailer。-t, --template <file>:使用指定的模板文件。-e, --edit:强制编辑提交。--cleanup <mode>:指定如何清除消息中的空格和 # 注释。--status:在提交消息模板中包含状态信息。-S, --gpg-sign[=<key-id>]:对提交进行 GPG 签名。-a, --all:提交所有已更改的文件。-i, --include:将指定的文件添加到索引以进行提交。--interactive:交互式地添加文件。-p, --patch:交互式地添加更改。-o, --only:仅提交指定的文件。-n, --no-verify:绕过 pre-commit 和 commit-msg 钩子。--dry-run:显示将要提交的内容。--short:简洁地显示状态。--branch:显示分支信息。--ahead-behind:计算完整的 ahead/behind 值。--porcelain:以机器可读的格式输出。--long:以详细格式显示状态(默认)。-z, --null:以 NUL 结束条目。--amend:修改上一次提交。--no-post-rewrite:绕过 post-rewrite 钩子。-u, --untracked-files[=<mode>]:显示未跟踪的文件,可选模式:all、normal、no(默认为 all)。--pathspec-from-file <file>:从文件中读取路径规范。--pathspec-file-nul:与 --pathspec-from-file 一起使用,路径规范元素使用 NUL 字符分隔。十一、git命令之git push,将保存好的内容提交到仓库
-v, --verbose:显示详细的输出信息。-q, --quiet:显示更少的输出信息。--repo <repository>:指定仓库。--all:推送所有引用(refs)。--mirror:镜像推送所有引用。-d, --delete:删除引用。--tags:推送标签(不能与 --all 或 --mirror 一起使用)。-n, --dry-run:执行干运行,不实际推送。--porcelain:以机器可读的格式输出。-f, --force:强制更新。--force-with-lease[=<refname>:<expect>]:要求引用的旧值与指定的值相同。--force-if-includes:要求远程更新在本地已集成。--recurse-submodules (check|on-demand|no):控制递归推送子模块。--thin:使用瘦包。--receive-pack <receive-pack>:指定接收包程序。--exec <receive-pack>:指定接收包程序。-u, --set-upstream:为 git pull 和 git status 设置上游。--progress:强制显示进度报告。--prune:修剪本地删除的引用。--no-verify:绕过预推钩子。--follow-tags:推送缺失但相关的标签。--signed[=(yes|no|if-asked)]:对推送进行 GPG 签名。--atomic:在远程端请求原子事务。-o, --push-option <server-specific>:传输选项。-4, --ipv4:仅使用 IPv4 地址。-6, --ipv6:仅使用 IPv6 地址。十二、git命令之git restore,还原文件的内容或属性
-s, --source <tree-ish>:指定要从中检出文件的树对象(tree-ish)。-S, --staged:还原暂存区中的文件。这会将文件的内容还原为最近一次提交时的状态。-W, --worktree:还原工作树中的文件。这会将文件的内容还原为最近一次提交时的状态。--ignore-unmerged:忽略未合并的条目。--overlay:使用叠加模式进行还原。-q, --quiet:不显示进度报告。--recurse-submodules[=<checkout>]:控制对子模块的递归更新。--progress:强制显示进度报告。-m, --merge:对于未合并的文件,执行三方合并。--conflict <style>:指定冲突的样式(merge、diff3 或 zdiff3)。-2, --ours:对于未合并的文件,检出我们的版本。-3, --theirs:对于未合并的文件,检出他们的版本。-p, --patch:以交互方式选择补丁。--ignore-skip-worktree-bits:不仅限于稀疏条目的路径规范。--pathspec-from-file <file>:从文件中读取路径规范。--pathspec-file-nul:与 --pathspec-from-file 一起使用,路径规范元素以 NUL 字符分隔十三、git命令之git checkout,切换分支或恢复文件,可使用git switch替代
-b <branch>:创建并切换到一个新分支。-B <branch>:创建或重置并切换到一个分支。-l:为新分支创建引用日志。--guess:对于不存在的分支,进行二次猜测(默认行为)。--overlay:使用覆盖模式(默认行为)。-q, --quiet:禁止显示进度报告。--recurse-submodules[=<checkout>]:控制递归更新子模块。--progress:强制显示进度报告。-m, --merge:执行与新分支的三方合并。--conflict <style>:冲突样式(merge、diff3或zdiff3)。-d, --detach:在指定的提交上分离HEAD。-t, --track[=(direct|inherit)]:设置分支跟踪配置。-f, --force:强制切换分支(放弃本地修改)。--orphan <new-branch>:创建一个无父分支。--overwrite-ignore:更新被忽略的文件(默认行为)。--ignore-other-worktrees:不检查其他工作树是否持有给定的引用。-2, --ours:对于未合并的文件,检出我们的版本。-3, --theirs:对于未合并的文件,检出他们的版本。-p, --patch:交互式选择补丁。--ignore-skip-worktree-bits:不仅限于稀疏条目的路径规范。--pathspec-from-file <file>:从文件中读取路径规范。--pathspec-file-nul:与 --pathspec-from-file 一起使用,路径规范元素使用NUL字符分隔十四、git命令之git switch,切换分支或恢复文件
-c, --create <branch>:创建并切换到一个新的分支。-C, --force-create <branch>:创建(或重置)并切换到一个分支。--guess:尝试猜测 git switch <no-such-branch> 的意图。--discard-changes:丢弃本地的修改。-q, --quiet:禁止显示进度报告。--recurse-submodules[=<checkout>]:控制子模块的递归更新。--progress:强制显示进度报告。-m, --merge:使用三方合并(3-way merge)模式切换到新的分支。--conflict <style>:指定冲突解决的风格(merge、diff3 或 zdiff3)。-d, --detach:在指定的提交上分离 HEAD。-t, --track[=(direct|inherit)]:设置分支的跟踪配置。-f, --force:强制切换分支(丢弃本地修改)。--orphan <new-branch>:创建一个新的无父分支。--overwrite-ignore:更新被忽略的文件(默认行为)。--ignore-other-worktrees:不检查其他工作树是否持有给定的引用。十五、git命令之git merge,将一个或多个提交合并到当前分支
-n:在合并结束时不显示diffstat。--stat:在合并结束时显示diffstat。--summary:--stat的同义词。--log[=<n>]:将短日志中的(最多<n>个)条目添加到合并提交消息中。--squash:创建一个单独的提交,而不是执行合并操作。--commit:如果合并成功,则执行提交(默认行为)。-e, --edit:在提交之前编辑消息。--cleanup <mode>:指定如何从消息中去除空格和#注释。--ff:允许快进合并(默认行为)。--ff-only:如果无法进行快进合并,则中止。--rerere-autoupdate:如果可能,使用重用的冲突解决更新索引。--verify-signatures:验证指定的提交是否具有有效的GPG签名。-s, --strategy <strategy>:指定要使用的合并策略。-X, --strategy-option <option=value>:为选择的合并策略指定选项。-m, --message <message>:合并提交的消息(用于非快进合并)。-F, --file <path>:从文件中读取合并提交的消息。--into-name <name>:使用<name>替代实际目标。-v, --verbose:显示更详细的输出。-q, --quiet:显示更少的输出。--abort:中止当前正在进行的合并操作。--quit:--abort的变体,但保留索引和工作树。--continue:继续当前正在进行的合并操作。--allow-unrelated-histories:允许合并不相关的历史记录。--progress:强制显示进度报告。-S, --gpg-sign[=<key-id>]:对提交进行GPG签名。--autostash:在合并之前和之后自动进行存储/恢复操作。--overwrite-ignore:更新被忽略的文件(默认行为)。--signoff:添加一个Signed-off-by签名行。--no-verify:绕过pre-merge-commit和commit-msg钩子。十六、git命令之git log,显示提交历史记录
-q, --quiet:抑制差异输出。--source:显示源信息。--use-mailmap:使用邮件映射文件。--mailmap:--use-mailmap的别名。--clear-decorations:清除先前定义的所有装饰过滤器。--decorate-refs <pattern>:只装饰与<pattern>匹配的引用。--decorate-refs-exclude <pattern>:不装饰与<pattern>匹配的引用。--decorate[=...]:装饰选项。-L range:file:跟踪指定文件中行范围<start>,<end>或函数:<funcname>的演变十七、git命令之git reset,将当前分支的指针重置到指定的提交
-q, --quiet:静默模式,只报告错误。--no-refresh:重置后跳过刷新索引。--mixed:重置HEAD和索引。--soft:仅重置HEAD。--hard:重置HEAD、索引和工作树。--merge:重置HEAD、索引和工作树。--keep:重置HEAD,但保留本地更改。--recurse-submodules[=<reset>]:控制递归更新子模块。-p, --patch:交互式选择差异块。-N, --intent-to-add:仅记录已删除的路径将来将被添加。--pathspec-from-file <file>:从文件中读取路径规范。--pathspec-file-nul:与--pathspec-from-file一起使用,路径规范元素使用NUL字符分隔。-z:已弃用(请改用--pathspec-file-nul),路径使用NUL字符分隔。--stdin:已弃用(请改用--pathspec-from-file=-),从标准输入中读取路径十八、git命令之git diff,比较文件、提交或分支之间的差异
-p, --patch:生成补丁。-s, --no-patch:禁止差异输出。-u:生成补丁。-U, --unified[=<n>]:生成带有 <n> 行上下文的差异。-W, --function-context:生成带有 <n> 行上下文的差异。--raw:以原始格式生成差异。--patch-with-raw:-p --raw 的同义词。--patch-with-stat:-p --stat 的同义词。--numstat:机器友好的 --stat。--shortstat:仅输出 --stat 的最后一行。-X, --dirstat[=<param1,param2>...]:输出每个子目录中更改量的分布情况。--cumulative:--dirstat=cumulative 的同义词。--dirstat-by-file[=<param1,param2>...]:--dirstat=files,param1,param2... 的同义词。--check:如果更改引入冲突标记或空白错误,则发出警告。--summary:压缩的摘要,例如创建、重命名和模式更改。--name-only:仅显示更改文件的名称。--name-status:仅显示更改文件的名称和状态。--stat[=<width>[,<name-width>[,<count>]]]:生成差异统计信息。--stat-width <width>:以给定宽度生成差异统计信息。--stat-name-width <width>:以给定名称宽度生成差异统计信息。--stat-graph-width <width>:以给定图形宽度生成差异统计信息。--stat-count <count>:生成有限行数的差异统计信息。--compact-summary:以差异统计信息的紧凑形式生成摘要。--binary:输出可应用的二进制差异。--full-index:在“index”行上显示完整的前图像和后图像对象名称。--color[=<when>]:显示带颜色的差异。--ws-error-highlight <kind>:在差异中的“context”、“old”或“new”行中突出显示空白错误。-z:在 --raw 或 --numstat 中不修改路径名,并使用 NUL 作为输出字段的终止符。--abbrev[=<n>]:使用 <n> 个数字显示对象名称。--src-prefix <prefix>:显示给定的源前缀,而不是 "a/"。--dst-prefix <prefix>:显示给定的目标前缀,而不是 "b/"。--line-prefix <prefix>:在每行输出前添加额外的前缀。--no-prefix:不显示任何源或目标前缀。--inter-hunk-context <n>:在差异块之间显示指定行数的上下文。--output-indicator-new <char>:指定用于表示新行的字符,而不是 "+"。--output-indicator-old <char>:指定用于表示旧行的字符,而不是 "-"。--output-indicator-context <char>:指定用于表示上下文的字符,而不是空格。-B, --break-rewrites[=<n>[/<m>]]:将完全重写的更改拆分为删除和创建。-M, --find-renames[=<n>]:检测重命名。-D, --irreversible-delete:省略删除的预映像。-C, --find-copies[=<n>]:检测复制。--find-copies-harder:使用未修改的文件作为复制的源。--no-renames:禁用重命名检测。--rename-empty:使用空的 blob 作为重命名源--follow:在重命名后继续列出文件的历史记录。-l <n>:如果重命名/复制目标的数量超过给定限制,则阻止重命名/复制检测。--minimal:生成最小可能的差异。-w, --ignore-all-space:在比较行时忽略空格。-b, --ignore-space-change:忽略空格数量的更改。--ignore-space-at-eol:忽略行尾的空格更改。--ignore-cr-at-eol:忽略行尾的回车符。--ignore-blank-lines:忽略所有行都为空白的更改。-I, --ignore-matching-lines <regex>:忽略所有行都匹配 <regex> 的更改。--indent-heuristic:启发式地移动差异块边界以便于阅读。--patience:使用 "patience diff" 算法生成差异。--histogram:使用 "histogram diff" 算法生成差异。--diff-algorithm <algorithm>:选择差异算法。--anchored <text>:使用 "anchored diff" 算法生成差异。--word-diff[=<mode>]:显示单词差异,使用 <mode> 来分隔更改的单词。--word-diff-regex <regex>:使用 <regex> 来定义单词。--color-words[=<regex>]:相当于 --word-diff=color --word-diff-regex=<regex>。--color-moved[=<mode>]:移动的代码行以不同的颜色显示。--color-moved-ws <mode>:在 --color-moved 中如何忽略空格--relative[=<prefix>]:在子目录中运行时,排除外部更改并显示相对路径。-a, --text:将所有文件视为文本。-R:交换两个输入,反转差异。--exit-code:如果存在差异,则以 1 退出,否则为 0。--quiet:禁用程序的所有输出。--ext-diff:允许执行外部差异辅助程序。--textconv:在比较二进制文件时运行外部文本转换过滤器。--ignore-submodules[=<when>]:在生成差异时忽略子模块的更改。--submodule[=<format>]:指定如何显示子模块的差异。--ita-invisible-in-index:从索引中隐藏 'git add -N' 条目。--ita-visible-in-index:将 'git add -N' 条目视为索引中的实际条目。-S <string>:查找更改指定字符串的出现次数。-G <regex>:查找更改指定正则表达式的出现次数。--pickaxe-all:显示使用 -S 或 -G 的更改集中的所有更改。--pickaxe-regex:将 -S 中的 <string> 视为扩展的 POSIX 正则表达式。-O <file>:控制输出中文件的顺序。--rotate-to <path>:首先显示指定路径的更改。--skip-to <path>:跳过输出直到指定路径。--find-object <object-id>:查找更改指定对象的出现次数。--diff-filter [(A|C|D|M|R|T|U|X|B)...[]]:按差异类型选择文件。--output <file>:输出到指定的文件。十九、git命令之git config,配置和管理 Git 环境
--global:使用全局配置文件。--system:使用系统配置文件。--local:使用仓库配置文件。--worktree:使用每个工作树的配置文件。-f, --file <file>:使用指定的配置文件。--blob <blob-id>:从给定的 blob 对象读取配置。--get:获取值:name [value-pattern]。--get-all:获取所有值:key [value-pattern]。--get-regexp:获取正则表达式匹配的值:name-regex [value-pattern]。--get-urlmatch:获取特定于 URL 的值:section[.var] URL。--replace-all:替换所有匹配的变量:name value [value-pattern]。--add:添加新变量:name value。--unset:移除变量:name [value-pattern]。--unset-all:移除所有匹配项:name [value-pattern]。--rename-section:重命名部分:old-name new-name。--remove-section:移除部分:name。-l, --list:列出所有配置。--fixed-value:在比较值与 'value-pattern' 时使用字符串相等性。-e, --edit:打开编辑器。--get-color:查找配置的颜色:slot [default]。--get-colorbool:查找颜色设置:slot [stdout-is-tty]。-t, --type <type>:给定值的类型。--bool:值为 "true" 或 "false"。--int:值为十进制数。--bool-or-int:值为 --bool 或 --int。--bool-or-str:值为 --bool 或字符串。--path:值为路径(文件或目录名)。--expiry-date:值为到期日期。-z, --null:以 NUL 字节终止值。--name-only:仅显示变量名称。--includes:在查找时考虑包含指令。--show-origin:显示配置的来源(文件、标准输入、blob、命令行)。--show-scope:显示配置的范围(工作树、本地、全局、系统、命令)。--default <value>:在使用 --get 时,当条目缺失时使用默认值。二十、git命令之git tag,管理和查询 Git 的标签
-a, --annotate:创建带注释的标签,需要提供消息。-m, --message <message>:设置标签消息。-F, --file <file>:从文件中读取消息。-e, --edit:强制编辑标签消息。-s, --sign:创建带注释和 GPG 签名的标签。--cleanup <mode>:设置如何清除消息中的空格和 # 注释。-u, --local-user <key-id>:使用另一个密钥进行签名。-f, --force:如果标签存在,则替换标签。--create-reflog:创建引用日志。-l, --list:列出标签名称。-n[<n>]:打印每个标签消息的 <n> 行。-d, --delete:删除标签。-v, --verify:验证标签。--column[=<style>]:以列的形式显示标签列表。--contains <commit>:仅打印包含指定提交的标签。--no-contains <commit>:仅打印不包含指定提交的标签。--merged <commit>:仅打印已合并的标签。--no-merged <commit>:仅打印未合并的标签。--sort <key>:按字段名排序。--points-at <object>:仅打印指向对象的标签。--format <format>:设置输出的格式。--color[=<when>]:使用格式颜色。-i, --ignore-case:排序和过滤时不区分大小写。二十一、git命令之git status,显示git仓库当前状态
-v, --verbose:提供详细的输出信息。-s, --short:以简洁方式显示状态信息。-b, --branch:显示分支信息。--show-stash:显示存储区(stash)的信息。--ahead-behind:计算完整的 ahead/behind 值。--porcelain[=<version>]:以机器可读的格式输出。--long:以详细格式显示状态信息(默认格式)。-z, --null:以 NUL 终止条目。-u, --untracked-files[=<mode>]:显示未跟踪文件,可选模式:all、normal、no(默认为 all)。--ignored[=<mode>]:显示被忽略的文件,可选模式:traditional、matching、no(默认为 traditional)。--ignore-submodules[=<when>]:忽略子模块的更改,可选 when:all、dirty、untracked(默认为 all)。--column[=<style>]:以列的形式列出未跟踪文件。--no-renames:不检测重命名操作。-M, --find-renames[=<n>]:检测重命名操作,可选设置相似度指数(similarity index)的阈值(默认为 50)。二十二、git命令之git fetch,从远程仓库获取更新
-v, --verbose:显示更详细的输出。-q, --quiet:显示更少的输出。--all:从所有远程仓库获取更新。--set-upstream:为后续的 git pull 或 git fetch 命令设置上游分支。-a, --append:将获取的引用追加到 .git/FETCH_HEAD 文件中,而不是覆盖。--atomic:使用原子事务来更新引用。--upload-pack <path>:指定远程端的上传包路径。-f, --force:强制覆盖本地引用。-m, --multiple:从多个远程仓库获取更新。-t, --tags:获取所有标签及其关联的对象。-n:不获取所有标签(--no-tags)。-j, --jobs <n>:并行获取子模块的数量。--prefetch:修改引用规范(refspec),将所有引用放置在 refs/prefetch/ 目录下。-p, --prune:删除不再存在于远程仓库的远程跟踪分支。-P, --prune-tags:删除不再存在于远程仓库的本地标签,并覆盖已更改的标签。--recurse-submodules[=<on-demand>]:控制子模块的递归获取。--dry-run:模拟运行,不实际获取更新。--write-fetch-head:将获取的引用写入 FETCH_HEAD 文件。-k, --keep:保留下载的包文件。-u, --update-head-ok:允许更新 HEAD 引用。--progress:强制显示进度报告。--depth <depth>:缩减浅克隆的历史记录深度。--shallow-since <time>:基于时间缩减浅克隆的历史记录。--shallow-exclude <revision>:缩减浅克隆的历史记录,排除指定的提交。--deepen <n>:增加浅克隆的历史记录深度。--unshallow:将浅克隆转换为完整的仓库。--refetch:重新获取更新,而不进行协商共同提交。--update-shallow:接受更新 .git/shallow 文件的引用。--refmap <refmap>:指定获取的引用映射。-o, --server-option <server-specific>:传递给服务器的选项。-4, --ipv4:仅使用 IPv4 地址。-6, --ipv6:仅使用 IPv6 地址。--negotiation-tip <revision>:报告我们只有从该对象可达的对象。--negotiate-only:不获取包文件,而是打印协商提示的祖先。--filter <args>:对象过滤。--auto-maintenance:获取更新后运行 maintenance --auto。--auto-gc:获取更新后运行 maintenance --auto。--show-forced-updates:检查所有更新的分支是否有强制更新。--write-commit-graph:获取更新后写入提交图。--stdin:从标准输入接受引用规范(refspec)。二十三、GI命令之git mv,移动或重命名文件或目录
-v, --verbose:显示详细的输出信息。-n, --dry-run:演示运行,不实际执行移动或重命名操作,只显示将要被移动或重命名的文件。-f, --force:即使目标文件已经存在,也强制进行移动或重命名操作。-k:跳过移动或重命名时的错误。--sparse:允许更新稀疏检出范围之外的条目。二十四、GI命令之git rm,删除文件或目录
-n, --dry-run:演示运行,不实际执行删除操作,只显示将要被删除的文件。-q, --quiet:不列出已删除的文件。--cached:只从索引中删除文件,不删除工作树中的文件。这将使文件不再被 Git 跟踪。-f, --force:即使文件被标记为最新版本,也强制删除文件。-r:允许递归删除,用于删除目录及其内容。--ignore-unmatch:即使没有匹配的文件,也以零状态退出。--sparse:允许更新稀疏检出范围之外的条目。--pathspec-from-file <file>:从文件中读取路径规范。--pathspec-file-nul:与 --pathspec-from-file 一起使用,路径规范元素以 NUL 字符分隔。二十五、.gitignore忽略提交文件
#表示此为注释,将被Git忽略node_modules忽略项目中所有目录名为node_modules 的文件夹,无论它们位于什么位置.a 表示忽略所有 .a 结尾的文件!lib.a 表示但lib.a除外/TODO 表示仅仅忽略项目根目录下的 TODO 文件,不包括subdir/TODObuild/表示忽略build/目录下的所有文件,过滤整个build文件夹;doc/.txt表示会忽略doc/notes.txt但不包括doc/server/arch.txtbin/: 表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件/bin: 表示忽略根目录下的bin文件/.c: 表示忽略cat.c,不忽略 build/cat.cdebug/.obj: 表示忽略debug/io.obj,不忽略debug/common/io.obj和tools/debug/io.obj/foo:表示忽略/foo,a/foo,a/b/foo等a//b:表示忽略a/b, a/x/b,a/x/y/b等!/bin/run.sh表示不忽略bin目录下的run.sh文件.log:表示忽略所有 .log 文件config.php: 表示忽略当前路径的config.php 文件 /mtk/ 表示过滤整个文件夹.zip 表示过滤所有.zip文件/mtk/do.c 表示过滤某个具体文件#被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。 #需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中,如下:!.zip!/mtk/one.txt#唯一的别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。为什么要有两种规则呢?#想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么.gitignore规则应写为::/mtk/!/mtk/one.txt#假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!
#注意上面的/mtk/不能写为/mtk/,否则父目录被前面的规则排除掉了,one.txt文件虽然加了!过滤规则,也不会生效 ----------------------------------------------------------------------------------还有一些规则如下:fd1/说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;/fd1/说明:忽略根目录下的 /fd1/ 目录的全部内容; /!.gitignore!/fw/ /fw/!/fw/bin/!/fw/sf/
二十六、GIT常见分支
master分支,即主分支(发布分支)。任何项目都必须有个这个分支。对项目进行tag或发布版本等操作,都必须在该分支上进行。develop分支,即开发分支,从master分支上检出。团队成员一般不会直接更改该分支,而是分别从该分支检出自己的feature分支,开发完成后将feature分支上的改动merge回develop分支。同时release分支由此分支检出。release分支,即测试分支,从develop分支上检出。该分支用作发版前的测试,可进行简单的bug修复。如果bug修复比较复杂,可merge回develop分支后由其他分支进行bug修复。此分支测试完成后,需要同时merge到master和develop分支上。feature分支,即功能分支,从develop分支上检出。团队成员中每个人都维护一个自己的feature分支,并进行开发工作,开发完成后将此分支merge回develop分支。此分支一般用来开发新功能或进行项目维护等。
二十七、创建演示库,以码云为例
在码云上创建yanshi库,克隆下载中可以找到https、ssh等链接在本地新建yanshi文件夹,打开cmd命令行工具,进入该文件夹运行git init 初始化仓库,会自动生成.git文件夹关联远程仓库,运行 git remote add origin 仓库地址拉取最新代码,git pull origin master二十八、创建忽略文件.gitignore
打开开发者工具,创建.gitignore文件,并忽略.idea文件运行git status,可以看出新增两个文件.gitignore、.idea运行git add . 把文件添加到缓存区,再运行git status 会发现文件已在缓存区运行git commit -m 第一次提交,说明此次提交是干嘛的git push origin master,提交到master分支,git push 之前需运行git pull获取下分支,避免冲突码云查看仓库,会发现idea并未提交二十九、解决冲突
在本地新建yanshi1库,根据之前操作关联远程仓库yashi在本地yanshi库,新建test.html,并提交到远程库在本地yanshi1库运行git pull maser获取远程库,并修改test.html,并提交到远程库在本地yanshi库,修改test.html标题,当git pull origin master时,会发现CONFLICT (content): Merge conflict in test.html,说明test.html有冲突,在test.html文件中会发现<<<<<<< HEAD是该库修改的部分,而>>>>>>> 28133df53ae47ecacb4ccec38435a58b683a329c是之前yanshi1提交的,后面一串数子是提交的id根据需要保留正确的代码,这里删除>>>>>>> 28133df53ae47ecacb4ccec38435a58b683a329c 代码,保留<<<<<<< HEAD代码,再运行git add . 、git commit、git push 等命令即可在本地yanshi1库运行git pull maser获取远程库,查看test.html,会发现标题已经改变三十、分支管理
在码云找到yanshi仓库,新建release、develop分支,release测试分支、develop开发分支运行git featch获取远程分支的最新信息,再运行git branch -r 会看到远程分支运行git checkout develop切换到开发分支运行git switch -c feature,在本地新建功能分支,并切换到该分支,切换到分支后修改test.html,并运行git add、git commit命令,在功能分支上不做push运行git checkout develop切换到开发分支,git merge feature合并分支,然后运行git push origin develop命令如果开发已经完成,准备测试,需要切换到git checkout release分支,并运行git merge develop,再运行git push origin release推送到远程release分支;测试通过之后,需要发布上线,需要切换到git checkout master分支,并运行git merge release,再运行git push origin master推送到master分支;如果发布成功后,没有其他bug,需要固定版本的时候,就需要打标签(建立标签分支),创建对应的版本,使用git tag命令的是如果直接在仓库上删除标签分支,在本地运行git tag还是可以看到该分支的,需要在本地运行git tag -d V0.0.0删除该分支,也可以运行git push origin :refs/tags/删除分支避免此问题三十一、解决分支冲突
在本地yanshi1库,运行git switch -c test 新建功能分支,并切换到test分支,并修改test.html运行git add、git commit将修改的内容保存到仓库运行git checkout develop切换到开发分支,git merge test合并分支,然后运行git push origin develop命令在本地yanshi库切换到功能分支feature,修改test.html,再运行git add、git commit将修改的内容保存到仓库运行git checkout develop切换到开发分支,git merge feature合并分支,然后运行git pull origin develop命令,会发现CONFLICT (content): Merge conflict in test.html,说明test.html冲突,按照之前的方法解决冲突,运行git push origin develop推送到develop即可三十二、总结
git命令虽然很多,但是常用的无非那几个,分支管理运行命令虽然比较复杂,但是会让你的项目管理起来更有条理。现在开发工具上基本都包含git的集成,只需要对响应的开发者工具配置即可,不过还是要理解下相关命令,要不然就算使用开发者工具里面集成的,看着菜单也会不知道哪个菜单是用来干嘛的,这是webstrom集成的git还是很好用的