Git是一个开源的版本控制系统。区别于其它版本控制系统例如SVN等,它是分布式的。
我们使用Git的一般工作流程如下:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
当然,相信很多人都对它的用法非常的熟悉,这不是这篇文章的重点。接下来我主要整理一下Git的一些常用命令,帮助大家在工作中更好地使用GIt。
一、基础命令
0.
(1) git init:初始化本地库
(2) git status:查看工作区、暂存区的状态
(3)git add <file name>:将工作区的“新建/修改”添加到暂存区
(4)git rm --cached <file name>:移除暂存区的修改
1. git commit (<file name>):将暂存区的内容提交到本地库
- –m “本次提交描述”:该命令会将git add .存入暂存区修改内容提交至本地仓库中
- –am “本次提交描述” 或 –a –m “本次提交描述”:会自动把修改的文件,先暂存,然后直接commit 。相当于git add . 与git commit –m “本次提交描述” 两句操作合并为一句进行使用
- -s:会弹出vim 文本编辑器,让你编写提交备注(-s命令可以自动加上Signed-off-by信息,并且可以其他参数一起使用)
- --amend:改变当前分支最近的一次提交,用新提交取代了原始提交
2. git branch <your-branch-name>:创建一个新分支
- -f <your-branch-name>:指向其他分支的一个提交,例如:git branch -f master HEAD~3
3. git checkout <your-branch-name>/<提交号>/相对引用:切换到某个分支或某次提交
- -b <your-branch-name>:创建一个新的分支同时切换到新创建的分支 (= git branch <your-branch-name> + git checkout <your-branch-name>)
- -t <remote-branch-name>:在本地新建同名的分支,并切换到该分支(=git checkout -b branch-name origin/branch-name)
4. git merge/rebase <target-branch-name>:合并分支
区别:
-Merge:把 bugFix 分支合并到 master 分支上。从 master 开始沿着箭头向上看,在到达起点的路上会经过所有的提交记录。
-Rebase:把 bugFix 分支里的工作直接移到 master 分支上。移动以后会使得两个分支的功能看起来像是按顺序开发,但实际上它们是并行开发的。
Rebase 的优势就是可以创造更线性的提交历史,取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。如果只允许使用 Rebase 的话,代码库的提交历史将会变得异常清晰。
进阶用法:
使用 -i 选项,即交互式(interactive)rebase命令,所谓交互式命令,Git会打开一个 UI 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。
5. git log:查看提交记录与对应的提交号(哈希值)
1)通过哈希值定位提交记录的方式为绝对引用。
2)定位提交记录也使用相对引用,其中相对引用的参照可以是HEAD,也可以是分支(代表该分支的当前节点)。
- 使用
^
向上移动 1 个提交记录 - 使用
~<num>
向上移动多个提交记录,如~3
查看当前HEAD的指向的两个命令:
- cat .git/HEAD
- git symbolic-ref HEAD
补充:空格向下翻页,b向上翻页,q退出
6. git reset/revert <提交号>:撤销提交
区别:
-Revert 是用一次新的commit来回滚之前的commit,此次提交之前的commit都会被保留;
-Reset 是回到某次提交,该提交及之前的commit都会被保留,但是此提交之后的commit都会被删除
- --soft xxx:用于将文件提交至本地仓库后撤回暂存区的操作
-
--hard xxx:会将工作区、暂存区、本地仓库的所有提交的文件全都撤销
7. git cherry-pick <提交号>...:将一些提交复制到当前所在的位置(HEAD
)下。
8. git clone <远程库地址>:克隆远程库
功能:①完整的克隆远程库为本地库,②为本地库新建origin别名,③初始化本地库
9. git fetch:将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态。
注意: git fetch
并不会改变你本地仓库的状态。它不会更新你的 master
分支,也不会修改你磁盘上的文件。可以将 git fetch
的理解为单纯的下载操作。
10. git pull:实际上相当于 git fetch 和 git merge 的缩写。
- --rebase:实际上相当于 git fetch 和 git rebase 的缩写
11. git push:负责将你的变更上传到指定的远程仓库,并在远程仓库上合并你的新提交记录。
二、高级命令
1. git tag:为某次提交打上标签。(通常在发布软件的时候打一个tag ,tag 会记录版本的提交号,方便后期回溯)
- -l "关键字":过滤tag
2. git describe:显示当前离当前提交最近的tag。如果符合条件的tag指向最新提交则只是显示tag的名字,否则会有相关的后缀来描述该tag之后有多少次提交。
3. git bisect:查找哪一次代码提交引入了错误
4. git stash:将当前的工作状态保存到git栈,并且将当前代码切换到 HEAD 上
- + pop:恢复git栈中的一个stash,默认恢复最新的stash
- + apply:恢复被隐藏的文件,但是git栈中的这个不删除
- + list:查看所有被隐藏的stash列表
- + show:显示stash的内容具体是什么,如 git stash show stash@{0}
- + drop:删除指定的一个stash,默认删除最新的stash
- + clear:删除所有存储的stash
5. git reflog:以简洁的一行显示,包含简洁哈希索引值,同时显示移动到某个历史版本所需的步数
6. git diff:查看所有被隐藏的文件列表
- --cached([file]):显示暂存区和上一次commit的差异