Git:常用命令

本文详细介绍了Git的各种命令,包括配置、创建项目、快照管理、分支与合并、分享与更新、检查与比较、调试以及仓库管理。内容涵盖了从设置别名、克隆与初始化仓库,到提交、暂存、分支、合并、拉取、推送等核心操作,再到高级的调试工具如gitbisect、gitblame和gitgrep。此外,还讨论了仓库维护命令如gitgc和gitfilter-branch,帮助用户更好地管理和优化Git工作流程。
摘要由CSDN通过智能技术生成

1. 设置与配置

git config

  • 创建别名,以便你不用每次都输入它们:
git config --global alias.last 'log -1 HEAD' // 最后一次提交
git config --global alias.unstage 'reset HEAD --' // 取消暂存文件
  • 为你的 HTTP 密码设置一个默认的存储区域。
  • --rebase作为 git pull 命令的默认选项。

git config --global pull.rebase true

  • 设置默认编辑器
git config --global core.editor "/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl --new-window --wait"  //Sublime Text (macOS)

git help

git help命令用来显示任何命令的 Git 自带文档。 对于每一个命令的完整的可选项及标志列表,可以随时运行git help <command>命令来了解。

2. 获取与创建项目

有几种方式获取一个 Git 仓库。 一种是从网络上或者其他地方拷贝一个现有的仓库,另一种就是在一个目录中创建一个新的仓库。

git init

将一个目录转变成一个 Git 仓库,这样你就可以开始对它进行版本管理了。

当在一个新目录或已有目录执行git init时,Git 会创建一个.git目录。 这个目录包含了几乎所有 Git 存储和操作的东西。 如若想备份或复制一个版本库,只需把这个目录拷贝至另一处即可。

底层原理一文中有详细的目录结构。

git clone

git clone实际上是一个封装了其他几个命令的命令。

它创建了一个新目录,切换到新的目录,然后git init来初始化一个空的 Git 仓库, 然后为你指定的 URL 添加一个(默认名称为origin的)远程仓库(git remote add),再针对远程仓库执行git fetch,最后通过git checkout将远程仓库的最新提交检出到本地的工作目录。

3. 快照基础

对于基本的暂存内容及提交到你的历史记录中的工作流,只有少数基本的命令。

git add

git add命令将内容从工作目录添加到暂存区(或称为索引(index)区),以备下次提交。 当git commit命令执行时,默认情况下它只会检查暂存区域,因此git add是用来确定下一次提交时快照的样子的。

  • 解决合并冲突时,使用该命令来将其标记为冲突已解决;
  • 交互式的暂存一个已修改文件的特定部分;
  • 底层原理一文中在底层模拟了它的用法;

git status

git status命令会显示工作区及暂存区域中不同状态的文件。 其中包含了已修改但未暂存,或已经暂存但没有提交的文件。 在一般的显示形式中,它会给你一些如何在这些暂存区之间移动文件的提示。加入-s参数展示简介模式。

git diff

当需要查看任意两棵树的差异时,可以使用git diff命令。 此命令可以查看你工作环境与你的暂存区的差异(git diff默认的做法),你暂存区域与你最后提交之间的差异(git diff --staged),或者比较两个提交记录的差异(git diff master branchB)。

  • 使用--check选项来检查可能存在的空白字符问题。
  • 使用git diff A...B语法来更有效地比较不同分支之间的差异。
  • 使用-b选项来过滤掉空白字符的差异,及通过--theirs--ours--base选项来比较不同暂存区冲突文件的差异。
  • 使用--submodule选项来有效地比较子模块的变化。

git commit

git commit命令将所有通过git add暂存的文件内容在数据库中创建一个持久的快照,然后将当前分支上的分支指针移到其之上。

  • 使用-a标志来跳过git add这一步,及如何使用-m标志通过命令行而不启动一个编辑器来传递提交信息。
  • 撤销操作,使用--amend选项来重做最后的提交;
  • 使用-S标志来为提交签名加密。
  • 底层原理中了解了git commit在背后做了什么,及它是如何实现的。

git reset

git reset命令主要用来根据你传递给动作的参数来执行撤销操作。 它可以移动HEAD指针并且可选的改变暂存区及工作区。

  • --soft不改变暂存区(仅移动 HEAD 分支的指向);
  • 无参数 改变暂存区(使暂存区与 HEAD 的指向一样);
  • --hard改变工作区,可能导致工作丢失 (使工作区与 HEAD 的指向一样)。
  • git reset HEAD <file>可以取消暂存区的文件,用来对执行过git add命令的文件取消暂存;
  • 使用git reset --hard来取消一个合并,可能会丢失工作,也可以使用了git merge --abort命令,它是git reset的一个简单的封装。

git revert

生成一个新提交,该提交将会撤消一个已存在提交的所有修改。
git revert -m 1 HEAD

  • -m 1 标记指出 “mainline” 需要被保留下来的父结点。

git rm

git rm是 Git 用来从工作区,或者暂存区移除文件的命令。 在为下一次提交暂存一个移除操作上,它与git add有一点类似。

  • 使用--cached选项来只移除暂存区域的文件但是保留工作区的文件。

git mv

git mv命令是一个便利命令,用于移动一个文件并且在新文件上执行git add命令及在老文件上执行git rm命令。

git clean

git clean是一个用来从工作区中移除不想要的文件的命令。 可以是编译的临时文件或者合并冲突的文件。

需要谨慎地使用这个命令,因为它被设计为从工作目录中移除未被追踪的文件。更安全的选项是运行git stash --all来移除每一样东西并存放在栈中。

  • 使用--dry-run-n选项来看看它将要移除什么;
  • 使用-f -d选项来移除工作目录中所有未追踪的文件以及空的子目录;
  • 默认情况下,git clean命令只会移除没有忽略的未跟踪文件。 任何与.gitignore或其他忽略文件中的模式匹配的文件都不会被移除,使用-x选项移除被忽略的文件;

4. 分支与合并

git branch

git branch命令实际上是某种程度上的分支管理工具。 它可以列出你所有的分支、创建新分支、删除分支及重命名分支。

  • --merged--no-merged这两个有用的选项可以过滤这个列表中已经合并或尚未合并到当前分支的分支。 如果要查看哪些分支已经合并到当前分支,可以运行git branch --merged
  • -u设置一个跟踪分支。;
  • 底层原理讲到了它在背后做什么。

git checkout

git checkout命令用来切换分支,或者检出内容到工作目录。

  • 使用--track标志来开始跟踪分支。
  • 与 reset 的区别,仅移动 HEAD 指针,而不移动 HEAD 指向的引用的指向;
  • 底层原理介绍了实现细节;

git merge

git merge工具用来合并一个或者多个分支到你已经检出的分支中。 然后它将当前分支指针移动到合并结果上。

  • --abort来简单地退出合并。

git rebase

将提交到某一分支上的所有修改都移至另一分支上,与 git merge 的最终结果没有任何区别,但是变基使得提交历史更加整洁。

  • 变基是将一系列提交按照原有次序依次应用到另一分支上,而合并是把最终结果合在一起。
  • 如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。

git cherry-pick

类似于对特定的某次提交的变基。 它会提取该提交并尝试将其重新应用到当前分支上。 这种方式在只想引入主题分支中的某个提交,或者主题分支中只有一个提交,而不想运行变基时很有用。

git log

git log命令用来展示一个项目的可达历史记录,从最近的提交快照起。 默认情况下,它只显示你当前所在分支的历史记录,但是可以显示不同的甚至多个头记录或分支以供遍历。 此命令通常也用来在提交记录级别显示两个或多个分支之间的差异。

  • -p--stat选项来了解每一个提交引入的变更,及使用--pretty--onli``ne选项来查看简洁的历史记录。
  • 使用--decorate选项来简单的可视化我们分支的指针所在,使用--graph选项来查看分叉的历史记录是怎么样的。
  • branchA..branchB的语法来查看一个分支相对于另一个分支, 哪一些提交是唯一的。
  • 使用--merge选项来帮助合并冲突调试,同样也使用--cc选项来查看在你历史记录中的合并提交的冲突。

git stash

git stash命令用来临时地保存一些还没有提交的工作,以便在分支上不需要提交未完成工作就可以清理工作目录。

  • 查看贮藏的东西,可以使用git stash list
  • git stash apply将你刚刚贮藏的工作重新应用,可以指定更旧的贮藏;
  • 应用选项只会尝试应用贮藏的工作——在堆栈上还有它,运行git stash drop加上将要移除的贮藏的名字来移除它;
  • 也可以运行git stash pop来应用贮藏然后立即从栈上扔掉它。
  • --keep-index选项,不仅要贮藏所有已暂存的内容,同时还要将它们保留在索引中。
  • 指定--patch标记,Git 不会贮藏所有修改过的任何东西, 但是会交互式地提示哪些改动想要贮藏、哪些改动需要保存在工作目录中。
  • git stash branch <new branchname>以你指定的分支名创建一个新分支。

git tag

git tag命令用来为代码历史记录中的某一个点指定一个永久的书签。 一般来说它用于发布相关事项。

  • -a选项创建附注标签

5. 项目分享与更新

git fetch

git fetch命令与一个远程的仓库交互,并且将远程仓库中有但是在当前仓库的没有的所有信息拉取下来然后存储在你本地数据库中。

git pull

git pull命令基本上就是git fetchgit merge命令的组合体,Git 从你指定的远程仓库中抓取内容,然后马上尝试将其合并进你所在的分支中。

git push

git push命令用来与另一个仓库通信,计算你本地数据库与远程仓库的差异,然后将差异推送到另一个仓库中。 它需要有另一个仓库的写权限,因此这通常是需要验证的。

  • 使用--delete标志和git push命令来在删除一个在服务器上的分支。
  • --tags选项来推送你打的标签。
  • --recurse-submodules选项来检查是否我们所有的子模块的工作都已经在推送子项目之前已经推送出去了。

git remote

git remote命令是一个是你远程仓库记录的管理工具。 它允许你将一个长的 URL 保存成一个简写的句柄,例如origin,这样你就可以不用每次都输入他们了。 你可以有多个这样的句柄,git remote可以用来添加,修改,及删除它们。

  • 一般是以git remote add <name> <url>这样的标准格式。

git archive

git archive命令用来创建项目一个指定快照的归档文件用于分享。

git submodule

git submodule命令用来管理一个仓库的其他外部仓库。 它可以被用在库或者其他类型的共享资源上。submodule命令有几个子命令, 如(addupdatesync等等)用来管理这些资源。

  • 添加子模块:git submodule add <url>
  • .gitmodules 文件中保存了项目 URL 与已经拉取的本地目录之间的映射;
  • 克隆含有子模块的项目:git clone --recurse-submodules <url>
  • 若在克隆时忘了加上参数,可在克隆项目后使用 git submodule update --init 初始化子模块;加上 --recursive 可以抓取并检出任何嵌套的子模块;
  • 抓取项目中子模块的更新:git submodule update --remote <optional libname>,Git 将会进入子模块然后抓取并更新 所有 子模块,也可以传递想要更新的子模块的名字。此命令默认会假定你想要更新并检出子模块仓库的 master 分支。可以在 .gitmodules 文件中设置为其他分支。
  • 修改子模块:进入子模块目录,检出一个分支,然后通过 git submodule update --remote --merge 合并新的改动,并在此分支上修改。
  • 推送主项目和子模块的修改:git push --recurse-submodules=check
  • 子模块遍历:能在每一个子模块中运行任意命令,如:git submodule foreach 'git stash'

6. 检查与比较

git show

git show命令可以以一种简单的人类可读的方式来显示一个 Git 对象。 一般使用此命令来显示一个标签或一个提交的信息。

git shortlog

git shortlog是一个用来归纳git log的输出的命令。 它可以接受很多与git log相同的选项,但是此命令并不会列出所有的提交,而是展示一个根据作者分组的提交记录的概括性信息

git describe

git describe命令用来接受任何可以解析成一个提交的东西,然后生成一个人类可读的字符串且不可变。 这是一种获得一个提交的描述的方式,它跟一个提交的 SHA-1 值一样是无歧义,但是更具可读性。

7. 调试

Git 有一些命令可以用来帮你调试你代码中的问题。 包括找出是什么时候,是谁引入的变更。

git bisect

git bisect工具是一个非常有用的调试工具,它通过自动进行一个二分查找来找到哪一个特定的提交是导致 bug 或者问题的第一个提交。

git blame

git blame命令标注任何文件的行,指出文件的每一行的最后的变更的提交及谁是那一个提交的作者。 当你要找那个人去询问关于这块特殊代码的信息时这会很有用。

git grep

git grep命令可以帮助在源代码中,甚至是你项目的老版本中的任意文件中查找任何字符串或者正则表达式。

8. 管理

如果你正在管理一个 Git 仓库,或者需要通过一个复杂的方法来修复某些东西,Git 提供了一些管理命令来帮助你。

git gc

git gc命令在你的仓库中执行 “garbage collection”,删除数据库中不需要的文件和将其他文件打包成一种更有效的格式。

git fsck

git fsck命令用来检查内部数据库的问题或者不一致性。

使用此命令来搜索所有的悬空对象(dangling object),可用于数据恢复。

git reflog

git reflog命令分析你所有分支的头指针的日志来查找出你在重写历史上可能丢失的提交。

  • 使用git log -g来通过git log的输出来查看同样的信息。

git filter-branch

git filter-branch命令用来根据某些规则来重写大量的提交记录,例如从任何地方删除文件,或者通过过滤一个仓库中的一个单独的子目录以提取出一个项目。

  • 可用的选项:--commit-filter--subdirectory-filter--tree-filter
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值