阿左的小站 2020-06-24
原文地址:https://www.cnblogs.com/spec-dog/p/11037743.html
对于软件开发人员来说,git几乎是每天都需要接触的工具。但对于相处如此亲密的工作伙伴,你对它的了解又有多少,是不是还在傻瓜式地打开一个GUI工具,点击提交按钮,然后“卧槽,又冲突了”,一脸懵逼到不知所措,责怪谁又在你前面提交了,谁又改了你的代码。
博主从一开始接触git,就没用过任何GUI工具,都是通过命令行进行操作,发现这种方式不仅对git的理解更深,效率也更高,遇到问题时一般都知道如何来处理,故做此分享。本文所有知识与操作只涉及日常使用场景,更多详细内容可自行查阅其它资料。本文Git版本为 windows-2.20.1版。
git的理论知识,对使用者来说只需要知道它是分布式版本控制系统,了解如下三个概念即可,
如下图,我们平时提交代码的过程基本都是从工作区add到暂存区,然后再commit到本地仓库,最后push到远程仓库。
对于日常工作,掌握如下几个基本命令一般就够了
对大部分日常工作来说, 上面几个命令基本就够用了。
项目开发的时候,有时候是先在本地建一个项目,再提交到远程仓库的。
这样在远程仓库目录,就能看到你提交上去的文件内容了。
更多的时候,是远程仓库已有项目了,需要下载到本地开发。
有时候改了文件,想反悔怎么办,git给你“后悔药”。
单个文件的还原:
git checkout file_name ,丢弃工作区的修改,还原到上次提交(commit)的版本,
git reset HEAD file_name ,把暂存区的修改撤销掉(unstage),重新放回工作区。即还原到上次添加到暂存区(add)的版本
这里涉及几个场景
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout file_name。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时(执行了add,但没执行commit),想丢弃修改,分两步,第一步用命令git reset HEAD file_name,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次的全部提交,参考下面的整个版本的还原,不过前提是没有推送到远程库。
整个版本的还原:
git reset --hard HEAD^^, 回退到上上个版本
git reset --hard 3628164, 回退到具体某个版本 3628164 是具体某个commit_id缩写
找不到commit_id? git reflog 可查看每一个命令的历史记录,获取对应操作的commit_id。git log [--pretty=oneline], 可查看commit记录
上一个版本就是HEAD,上上一个版本就是HEAD^,往上100个版本写成HEAD~100。3628164 是具体某个commit_id,不需要写全,只需要唯一确定就行,可往前进也可往后退。(git windows2.20.1版貌似不支持对HEAD^的操作)
平时开发时需要创建子分支来实现你的功能模块,然后再合并到主分支中。
git checkout -b dev = git branch dev + git checkout dev
Fast-forward合并,“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。存在冲突的不能fast forward。git merge --no-ff -m "merge with no-ff" dev Fast forward模式下,删除分支后,会丢掉分支信息。如果强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息
当发布版本时,一般需要对当前版本进行标签记录,以便后续进行版本查看或回退。
git tag tag_name , 对当前分支打标签
git tag , 查看所有标签
git tag v0.9 6224937 ,针对某个具体commit id打标签
git show tag_name , 查看标签信息
git tag -a v0.1 -m "version 0.1 released" 3628164 , 带有说明的标签
git tag -d v0.1 , 删除标签
git push origin tag_name , 推送标签到远程
git push origin --tags , 一次性推送所有标签
删除已经推送到远程的标签:
git tag -d v0.9 , 先本地删除
git push origin :refs/tags/v0.9 , 然后从远程删除
配置命令别名 git config --global alias.st status # 后面可以用git st 来代替git status了 git config --global alias.ck checkout # 后面可以用 git ck 来代替 git checkout了 git config --global alias.cm ‘commit -m‘ # 后面可以用git cm 来代替 git commit -m 了
git pull origin master 或 git push origin master, 可直接 git pull 或 git push, 如果出现“no tracking information”的提示,则说明本地分支和远程分支的链接关系没有创建,用命令 git branch --set-upstream-to=origin/master master 建立关联即可。
以上命令虽然看起来多,但平常用的最频繁的应该是“基本命令”与“分支管理”部分,只要多用几次,自然便能记住,应付日常工作完全没有问题,彻底脱离GUI操作,让工作更有效率。