-
每日一图
版权声明:本文为 stone 原创文章,可以随意转载,但必须在明确位置注明出处!!!
点击查看 Git 官方文档介绍
1.前话
网上关于 Git 安装使用的文章已经数不胜数,但是却鲜有将常用的 Git 指令放入实际项目中具体分析介绍。官方对指令的介绍相信没人会看不懂(就算英文不太好,Google 翻译后还是能看懂的😆),更多的是缺少在实际项目中的使用经验,我发现我周围的一些朋友对 Git 的操作都是处在有点迷茫的状态,所以决定用我拙劣的文笔写这篇文章献给我亲爱的朋友们,希望对他们能有点帮助,另外自己也能查缺补漏。
2.笔者的一点点建议
其实关于 Git 有很多图形化的软件可以操作,但是我强烈建议大家从命令行开始学习理解,我知道没接触过命令行的人可能会很抵触,但是我的亲身实践证明,只有一开始学习命令行,之后你对 Git 的每一步操作才能理解其意义,而等你熟练之后你想用任何的图形化的软件去操作完全没问题。
在上个公司,CTO 教我们全是基于命令行的,事后证明我们现在已经深深爱上命令行无法自拔,我们很理解 Git 每一步操作的具体含义,以致于在实际项目很少犯错,所以我这里也是基于命令行去介绍使用。
本文暂不打算介绍 Git 的安装使用,需要请自行 Google。
3.Git 具体命令
下面一步步开始介绍 Git 的常用命令使用。
我们随便输入一个命令 git status,得到如下结果:
意思就是当前目录还不是一个 Git 仓库
一、初始化和提交
$ git init
这时候我们使用到了第一个命令,代表初始化 git 仓库。输入 git init 后会有如下提示:
$ git status 【常用】
可以用来查看仓库的状态,这是一个很有用的命令,以后的开发中,使用最多的可能就是这个命令了,建议开发过程中没事就 git status 一下。
表示 readme.md 文件还没被跟踪,意思就是还没添加到 Git 仓库中。
$ git add xxx
xxx 代表文件名,表示将该文件添加到暂存区。在上一步中,就提示我们文件还没有被提交到仓库里。输入 git add readme.md,然后 git status 一下。
可以看到,文件颜色改变(我这里将 terminal 的默认样式改变了,颜色有变化就行),并且提示文字已经改变,大概是文件需要 commit ,从缓存区提交到仓库中(add 只是将文件改变保存到暂存区,所以系统提示可以使用 git rm --cached xxx 将文件从暂存区移除)。
$ git add . 【常用】
git add xxx 只是提交某个文件,而 git add . 则是把所有已更改(或新建)文件添加到缓存区。平时大可用 git add . 一次性添加所有已更改文件到缓存区。
$ git commit -m "xxx" 【常用】
commit 是提交的意思(add 只是将文件改变保存到暂存区,commit 将暂存区中文件提交到本地仓库),-m 代表是提交信息,"xxx" 表示提交的内容说明,一般不能为空,最好是写详细一点,说明你本次提交主要做了哪些修改(方便你的伙伴和你自己更好的追溯版本)。
$ git commit -am "xxx" 【常用】
其实是将上面两个步骤 add 和 commit 合二为一。
可以看到打印台提示:没有什么可以提交,工作目录很干净,意思就是没有任何修改。
二、日志的显示
$ git log 【比较常用】
查看提交日志,我们输入后看看结果:(按 ctrl + z 退出)
三、创建和切换分支
$ git branch xxx (创建一个新的分支)【常用】
创建一个新的分支(比如在 master 分支 git branch test,test 新分支的代码是和 master 一致的),输入 git branch test:
我们可以使用 git branch 来查看本地的当前分支情况,可以看到 test 分支创建成功。
$ git checkout xxx【常用】
切换到 xxx 分支,输入git checkout test:
已经切换到 test 分支。
$ git checkout -b xxx 【比较常用】
相当于一次性执行了 git branch xxx 和 git checkout xxx 两条指令,创建一个分支并且切换过去。喜欢直接的朋友可以常使用。
四、查看分支
$ git branch (查看本地分支)【常用】
查看本地分支
$ git branch -a (查看本地和远程分支)【比较常用】
不仅能看到本地分支,还能看到远程的分支分布,远程分支前面带有 remotes/origin/
到目前为止都是本地仓库的操作,实际开发中都是需要将代码提交更新到远程仓库的,别急,接下来看看怎么提交到远程,并且开辟新分支等操作。
五、将代码提交到远程和下拉到本地
$ git push origin xxx 【常用】
将本地代码提交到远程,xxx 代表对应的版本号,比如想 push 到 master 分支,git push origin master,控制台输入看看效果:
...提示没有链接到远程仓库,具体的操作步骤可以看看这篇文章【关于项目托管上传到 github 你需要知道的知识】,将代码部署到 github,其他代码管理平台也是类似的。链接成功后如下,成功提交到远程仓库:
如果其他协同合作的小伙伴将代码提交到远程了,那远程代码就发生变化了,此时想 push 是 push 不上去的,我们必须先将远程代码拉下来更新到本地。
$ git fetch origin xxx【比较常用】
xxx 需要和当前所在分支对应,比如你现在在 master 分支,则使用 git fetch origin master 将远程代码下拉到本地,此时本地的代码不会发生变化,只是相当于存储到了一个暂存区。
可以去看看,此时本地的代码并没有发生变化。
$ git merge FETCH_HEAD【比较常用】
FETCH_HEAD 表示某个 branch 在服务器上的最新状态。git merge FETCH_HEAD 用于将刚刚 fetch 下来的代码合并到本地。
此时本地代码已经合并了远程代码。
但下面这个指令在平时项目开发中用的更多。
$ git pull origin xxx【常用】
将远程代码下拉到本地并进行合并,等价于 fetch 和 merge 两步一起执行。
六、合并分支
$ git merge
很多时候,我们需要从主分支开辟一个新分支去完成某些功能,比如我们新建了一个 module 分支
在 moudule 分支上一顿操作后功能完成了,很开心,倍儿爽,这时候我们要把新功能合并回主分支,我们可以这么做:
- 切换回 master 分支
- merge module 分支
- 我这里 module 分支的代码没有做任何改变,所以提示 Already up-to-date.
$ git merge --no-ff -m "merge width no-ff" dev
--no-ff 参数 表示禁用 Fast forward,本次合并要创建一个新的commit,这样也算是一次提交
然后我们可以使用 git log --graph --pretty=oneline --abbrev-commit 来查看此时的日志,如果直接使用 git merge,log 日志中是看不到 merge 信息的。
七、删除分支
$ git branch -D xxx 【比较常用】
删除本地分支, 比如我们删除 test 分支,输入 git branch -D test。
- 需要一提的是,比如你当前处于 test 分支, 然后你在 test 分支执行删除 test 分支操作,是会报错的:
- 我们需要先切换到非需删除分支,比如先切换到 master 主分支,然后再执行删除操作
$ git push origin --delete xxx【比较常用】
删除远程分支
- 温馨提示:谨慎使用
- git branch -a 可以查看远程分支分布
- 我们先将本地 module 分支提交到远程
八、版本回滚
$ git reset --hard xxx 【不太常用】
有的时候当前代码发生了不可解决的错误等一些意外情况,在没有办法的情况下,我们可以考虑回滚到最近提交的上一次状态(可以指定回滚到某个提交的版本,通过)。
- git log 查看 commit id (ctrl + z 退出)
- 从上图中可以看到有两次提交,我们回滚到第一次提交的状态
- 此时 git log,只剩一条记录
万一我又后悔了,想回到第二次提交的版本,怎么办,难道没有办法回去了吗?
git 提供了一个命令 git reflog,它会记录所有HEAD的历史,也就是说当你做 reset,checkout 等操作的时候,这些操作会被记录在 reflog 中。
我们 git reset --hard 6d8949a 就可以回到第二次提交时的状态
具体可以查看自己代码的变化来确认一下。
九、拉取并切换到远程指定分支
有时候可能有这种情况,你接触的项目已经有很多个分支了,你在第一次 clone 时,默认会是 master 主分支,但是远程最新的代码可能在 module 分支,你需要切换过去可以使用(注明:这种方式是在合并当前分支的基础上,拉取并切换到远程新分支的)
-
① git checkout -b module + git pull origin module
-
② git checkout -b module origin/module (创建、切换、拉取、合并一步到胃😤)
也有另外一种情况,比如当前分支有问题了,例如 master 本地分支有问题了,远程 master 分支也有 bug,此时 我们想拉取远程 module 分支代码并切换过去,但是显然我们不想要合并 master 分支,因为 master 分支是有问题的,我们可以这样:
- 先 git fetch origin module 将代码拉取到本地,但是记住此时是没有 merge 的
- 然后 git checkout -t origin/module,此时本地 module 分支的代码和远程一致,并且不会合并本地 master 分支的代码。
十、查看变化
$ git diff
查看文件具体更改
后话:
- 在每次 push 和 pull 之前,我们最好是 git branch 一下,查看我们当前处于哪一个分支,这样可以避免不必要的提交出错
- 多使用 git status 命令
- 文笔拙劣,理解有限,难免存在不足,望指出和理解
贴上一份 git 命令大全:
git init # 初始化本地git仓库(创建新仓库)
git config --global user.name "xxx" # 配置用户名
git config --global user.email "xxx@xxx.com" # 配置邮件
git config --global color.ui true # git status等命令自动着色
git config --global color.status auto
git config --global color.diff auto
git config --global color.branch auto
git config --global color.interactive auto
git config --global --unset http.proxy # remove proxy configuration on git
git clone git+ssh://git@192.168.53.168/VT.git # clone远程仓库
git status # 查看当前版本状态(是否修改)
git add xyz # 添加xyz文件至index
git add . # 增加当前子目录下所有更改过的文件至index
git commit -m 'xxx' # 提交
git commit --amend -m 'xxx' # 合并上一次提交(用于反复修改)
git commit -am 'xxx' # 将add和commit合为一步
git rm xxx # 删除index中的文件
git rm -r * # 递归删除
git log # 显示提交日志
git log -1 # 显示1行日志 -n为n行
git log -5
git log --stat # 显示提交日志及相关变动文件
git log -p -m
git show dfb02e6e4f2f7b573337763e5c0013802e392818 # 显示某个提交的详细内容
git show dfb02 # 可只用commitid的前几位
git show HEAD # 显示HEAD提交日志
git show HEAD^ # 显示HEAD的父(上一个版本)的提交日志 ^^为上两个版本 ^5为上5个版本
git tag # 显示已存在的tag
git tag -a v2.0 -m 'xxx' # 增加v2.0的tag
git show v2.0 # 显示v2.0的日志及详细内容
git log v2.0 # 显示v2.0的日志
git diff # 显示所有未添加至index的变更
git diff --cached # 显示所有已添加index但还未commit的变更
git diff HEAD^ # 比较与上一个版本的差异
git diff HEAD -- ./lib # 比较与HEAD版本lib目录的差异
git diff origin/master..master # 比较远程分支master上有本地分支master上没有的
git diff origin/master..master --stat # 只显示差异的文件,不显示具体内容
git remote add origin git+ssh://git@192.168.53.168/VT.git # 增加远程定义(用于push/pull/fetch)
git branch # 显示本地分支
git branch --contains 50089 # 显示包含提交50089的分支
git branch -a # 显示所有分支
git branch -r # 显示所有原创分支
git branch --merged # 显示所有已合并到当前分支的分支
git branch --no-merged # 显示所有未合并到当前分支的分支
git branch -m master master_copy # 本地分支改名
git checkout -b master_copy # 从当前分支创建新分支master_copy并检出
git checkout -b master master_copy # 上面的完整版
git checkout features/performance # 检出已存在的features/performance分支
git checkout --track hotfixes/BJVEP933 # 检出远程分支hotfixes/BJVEP933并创建本地跟踪分支
git checkout v2.0 # 检出版本v2.0
git checkout -b devel origin/develop # 从远程分支develop创建新本地分支devel并检出
git checkout -- README # 检出head版本的README文件(可用于修改错误回退)
git merge origin/master # 合并远程master分支至当前分支
git cherry-pick ff44785404a8e # 合并提交ff44785404a8e的修改
git push origin master # 将当前分支push到远程master分支
git push origin :hotfixes/BJVEP933 # 删除远程仓库的hotfixes/BJVEP933分支
git push --tags # 把所有tag推送到远程仓库
git fetch # 获取所有远程分支(不更新本地分支,另需merge)
git fetch --prune # 获取所有原创分支并清除服务器上已删掉的分支
git pull origin master # 获取远程分支master并merge到当前分支
git mv README README2 # 重命名文件README为README2
git reset --hard HEAD # 将当前版本重置为HEAD(通常用于merge失败回退)
git rebase
git branch -d hotfixes/BJVEP933 # 删除分支hotfixes/BJVEP933(本分支修改已合并到其他分支)
git branch -D hotfixes/BJVEP933 # 强制删除分支hotfixes/BJVEP933
git ls-files # 列出git index包含的文件
git show-branch # 图示当前分支历史
git show-branch --all # 图示所有分支历史
git whatchanged # 显示提交历史对应的文件修改
git revert dfb02e6e4f2f7b573337763e5c0013802e392818 # 撤销提交dfb02e6e4f2f7b573337763e5c0013802e392818
git ls-tree HEAD # 内部命令:显示某个git对象
git rev-parse v2.0 # 内部命令:显示某个ref对于的SHA1 HASH
git reflog # 显示所有提交,包括孤立节点
git show HEAD@{5}
git show master@{yesterday} # 显示master分支昨天的状态
git log --pretty=format:'%h %s' --graph # 图示提交日志
git show HEAD~3
git show -s --pretty=raw 2be7fcb476
git stash # 暂存当前修改,将所有至为HEAD状态
git stash list # 查看所有暂存
git stash show -p stash@{0} # 参考第一次暂存
git stash apply stash@{0} # 应用第一次暂存
git grep "delete from" # 文件中搜索文本“delete from”
git grep -e '#define' --and -e SORT_DIRENT
git gc
git fsck
码字不易,觉得写得不错的动动小手点个赞🌹。