熟练使用工具决定工作效率,Git 是工作中常见的分布式版本控制系统。本篇文章总结一些常用的命令以及原理。
git config []
命令 | 描述 |
---|---|
git config –global … | 全局配置 |
git config –local … | 本地项目 |
git config –global user.name/email … | 配置全局名称和邮箱 |
git config –list | 参看配置 |
git log [] [] [[–] …] 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 [] [-r | -a] [–merged | –no-merged] git branch [] [-l] [-f] [] git branch [] [-r] (-d | -D) … git branch [] (-m | -M) [] git branch [] (-c | -C) [] git branch [] [-r | -a] [–points-at] git branch [] [-r | -a] [–format]
命令 | 描述 |
---|---|
git branch -a | 远程和本地的分支列表 |
git branch -d | 删除分支 |
git branch -D | 删除分支,甚至没有合并 |
git branch -m | 移动或者重命名分支 |
-vv | 查看设置的所有跟踪分支 |
git push origin –delete | 删除远程分支 |
git checkout [] git checkout [] [] – …
命令 | 描述 |
---|---|
git checkout -b origin/ | 创建并检出新分支 |
git checkout – … | 恢复文件在工作区的修改 |
git merge [] […] git merge –abort git merge –continue
命令 | 描述 |
---|---|
git merge –abort | 抛弃合并过程并且尝试重建合并前的状态 |
git merge –continue | 合并冲突解决 |
git push [] [ […]]
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 的最简方式,就是将它看做 你的上一次提交 的快照。 参看快照命令:git cat-file -p HEAD
注:cat-file 是底层命令,它们一般用于底层工作,在日常工作中并不使用。不过它们能帮助我们了解到底发生了什么。
索引是你的 预期的下一次提交。 我们也会将这个概念引用为 Git 的“暂存区域”,这就是当你运行 git commit 时 Git 看起来的样子。
Git 将上一次检出到工作目录中的所有文件填充到索引区,它们看起来就像最初被检出时的样子。 之后你会将其中一些文件替换为新版本,接着通过 git commit 将它们转换为树来用作新的提交。
最后,你就有了自己的工作目录。 另外两棵树以一种高效但并不直观的方式,将它们的内容存储在 .git 文件夹中。 工作目录会将它们解包为实际的文件以便编辑。 你可以把工作目录当做 沙盒。在你将修改提交到暂存区并记录到历史之前,可以随意更改。
Git 主要的目的是通过操纵这三棵树来以更加连续的状态记录项目的快照。
简单的总结如下:
当 git fetch 命令从服务器上抓取本地没有的数据时,它并不会修改工作目录中的内容。它只会获取数据然后让你自己合并。
然而,git pull 在大多数情况下它的含义是一个 git fetch 紧接着一个 git merge 命令。
reset 命令会以特定的顺序重写这三棵树,在你指定以下选项时停止:
运行 git checkout [branch] 与运行 git reset –hard [branch] 非常相似,它会更新所有三棵树使其看起来像 [branch],不过有两点重要的区别。
首先不同于 reset –hard,checkout 对工作目录是安全的,它会通过检查来确保不会将已更改的文件弄丢。 其实它还更聪明一些。它会在工作目录中先试着简单合并一下,这样所有还未修改过的文件都会被更新。 而 reset –hard 则会不做检查就全面地替换所有东西。
第二个重要的区别是如何更新 HEAD。 reset 会移动 HEAD 分支的指向,而 checkout 只会移动 HEAD 自身来指向另一个分支。
下面的速查表列出了命令对树的影响。
HEAD | Index | Workdir | WD Safe? | |
---|---|---|---|---|
Commit Level | ||||
reset –soft [commit] | REF | NO | NO | YES |
reset [commit] | REF | YES | NO | YES |
reset –hard [commit] | REF | YES | YES | NO |
checkout [commit] | HEAD | YES | YES | YES |
File Level | ||||
reset (commit) [file] | NO | YES | NO | YES |
checkout (commit) [file] | NO | YES | YES | NO |
命令 | 描述 |
---|---|
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 | 引用日志 |