Git 命令大全

283 阅读7分钟

熟练使用工具决定工作效率,Git 是工作中常见的分布式版本控制系统。本篇文章总结一些常用的命令以及原理。

Git 命令

配置

git config [<options> ] 

命令 描述
git config --global … 全局配置
git config --local … 本地项目
git config --global user.name/email … 配置全局名称和邮箱
git config --list 参看配置

日志

git log [<options> ] [ ] [[--]  …]git reflog 引用日志

命令 描述
git log --stat 简略的统计信息
git log -count 显示记录条数
git log --pretty= 可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)

远程

git remote [-v | --verbose]

命令 描述
git remote -v 查看远程仓库
git remote add  添加远程仓库
git remote rename  重命名远程仓库
git remote remove  移除远程仓库
git remote show  参看远程仓库

标签

git tag [-a | -s | -u  ] [-f] [-m  | -F  ]  []git tag -d  …git tag -l [-n[ ]] [--contains  ] [--no-contains  ] [--points-at ][--format= ] [--[no-]merged [ ]] [ …]git tag -v [--format= ]  …

命令 描述
git tag -l 查看 tag 列表
git tag  创建轻量级标签
git tag -a  -m  创建附注标签
git tag -a  9fceb02 后期给某一提交打标签
git show  查看 tag 信息
git push origin  推送到远程服务器
git push origin --tags 不在服务器的标签全部推送上去
git tag -d  删除标签
git push  :refs/tags/ 从任何远程仓库中移除这个标签

分支

git branch [<options> ] [-r | -a] [--merged | --no-merged]git branch [<options> ] [-l] [-f]  [ ]git branch [<options> ] [-r] (-d | -D)  …git branch [<options> ] (-m | -M) [ ]  git branch [<options> ] (-c | -C) [ ]  git branch [<options> ] [-r | -a] [--points-at]git branch [<options> ] [-r | -a] [--format]

命令 描述
git branch -a 远程和本地的分支列表
git branch -d 删除分支
git branch -D 删除分支,甚至没有合并
git branch -m 移动或者重命名分支
-vv 查看设置的所有跟踪分支
git push origin --delete  删除远程分支

检出

git checkout [<options> ]  git checkout [<options> ] [ ] --  …

命令 描述
git checkout -b  origin/ 创建并检出新分支
git checkout --  … 恢复文件在工作区的修改

合并

git merge [<options> ] [ …]git merge --abortgit merge --continue

命令 描述
git merge --abort 抛弃合并过程并且尝试重建合并前的状态
git merge --continue 合并冲突解决

推送

git push [<options> ] [  [ …]]

重置

git reset [--mixed | --soft | --hard | --merge | --keep] [-q] [ ]git reset [-q] [ ] [--]  …git reset --patch [ ] [--] [ …]

命令 描述
git reset --mixed 重置已提交和缓存区域
git reset --soft 仅仅重置已提交
git reset --hard 重置已提交、缓存区域和工作目录

三棵树

Git 的思维框架(将其作为内容管理器)管理三棵不同的树。“树” 在我们这里的实际意思是 “文件的集合”,而不是指特定的数据结构。(在某些情况下索引看起来并不像一棵树,不过我们现在的目的是用简单的方式思考它。)

Git 作为一个系统,是以它的一般操作来管理并操纵这三棵树的:

用途
HEAD 上一次提交的快照,下一次提交的父结点
Index 预期的下一次提交的快照
Working Directory 工作目录

HEAD

HEAD 是当前分支引用的指针,它总是指向该分支上的最后一次提交。这表示 HEAD 将是下一次提交的父结点。通常,理解 HEAD 的最简方式,就是将它看做 你的上一次提交 的快照。  参看快照命令:git cat-file -p HEAD 

注:cat-file 是底层命令,它们一般用于底层工作,在日常工作中并不使用。不过它们能帮助我们了解到底发生了什么。 

索引(Index)

索引是你的 预期的下一次提交。我们也会将这个概念引用为 Git 的“暂存区域”,这就是当你运行 git commit 时 Git 看起来的样子。 

Git 将上一次检出到工作目录中的所有文件填充到索引区,它们看起来就像最初被检出时的样子。之后你会将其中一些文件替换为新版本,接着通过 git commit 将它们转换为树来用作新的提交。 

工作目录(Working Directory)

最后,你就有了自己的工作目录。另外两棵树以一种高效但并不直观的方式,将它们的内容存储在 .git 文件夹中。工作目录会将它们解包为实际的文件以便编辑。你可以把工作目录当做 沙盒。在你将修改提交到暂存区并记录到历史之前,可以随意更改。

工作流程

Git 主要的目的是通过操纵这三棵树来以更加连续的状态记录项目的快照。

简单的总结如下:

  1. 在工作目录编辑文件;

  2. git add 后,Index 会保存并指向工作目录的修改;

  3. git commit 后,会提交新的修改,HEAD 指向改新的修改。

命令区别

fetch、pull

当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。它只会获取数据然后让你自己合并。 

然而,git pull 在大多数情况下它的含义是一个 git fetch 紧接着一个 git merge 命令。

reset、checkout

reset 命令会以特定的顺序重写这三棵树,在你指定以下选项时停止:

  • 移动 HEAD 分支的指向 (若指定了 --soft,则到此停止)

  • 使索引看起来像 HEAD (若未指定 --hard,则到此停止)

  • 使工作目录看起来像索引

运行 git checkout [branch] 与运行 git reset --hard [branch] 非常相似,它会更新所有三棵树使其看起来像 [branch],不过有两点重要的区别。

首先不同于 reset --hard,checkout 对工作目录是安全的,它会通过检查来确保不会将已更改的文件弄丢。其实它还更聪明一些。它会在工作目录中先试着简单合并一下,这样所有还未修改过的文件都会被更新。而 reset --hard 则会不做检查就全面地替换所有东西。

第二个重要的区别是如何更新 HEAD。reset 会移动 HEAD 分支的指向,而 checkout 只会移动 HEAD 自身来指向另一个分支。

命令快照

命令 描述
git config 设置与配置
git help 帮助
git init 初始化
git clone 克隆
git add 将内容从工作目录添加到暂存区
git status 为你展示工作区及暂存区域中不同状态的文件
git diff 查看任意两棵树的差异
git difftool 可视化工具
git commit 提交
git reset 重置
git rm 从工作区,或者暂存区移除文件
git mv 在暂存区移到文件
git clean 从工作区中移除不想要的文件的命令
git branch 分支管理
git checkout 检出
git merge 合并
git mergetool 合并工具
git log 历史记录
git stash 临时地保存一些还没有提交的工作
git tag 标签
git fetch 从远程仓库中拉取
git pull 从远程仓库中拉取并合并
git push 推送到远程仓库
git remote 远程仓库记录的管理工具
git archive 创建项目一个指定快照的归档文件
git submodule 子模块
git show 显示一个标签或一个提交的信息
git shortlog 归纳 git log 的输出
git describe 描述
git bisect 二分查找
git blame 文件最后的修改者
git grep 查找任何字符串
git cherry-pick 获得并引入单个提交中的变更
git rebase 顺序合并多个提交
git revert 撤销或者倒转
git reflog 引用日志