笔记:git命令大汇总+关键命令理解
前言:
git是用起来很简单,有时候遇到特殊情况,忘记了哪个命令总不免查找一番,这里做一个统计,以便用时查看
首先前面我不会去按顺序介绍git,比如简介、安装等等.前面我会直接介绍创建版本、版本回退、删除等等操作,因为我相信大家都是熟悉git,如果兴趣的的可以看看博客后面的,简介、诞生、等等一些知识点,话不多说,马上开始
基本的linux命令学习
1. cd :改变目录
2. cd.. :回到上一个目录,直接cd进入默认的目录
3. pwd :显示当前所在的目录路径
4. ls : 查看当前目录中的所有文件
5. touch :新建一个文件如 touch index.js 就会在当前目录下新建一个index.js文件
6. rm :删除一个文件,比如rm index.js就会把index.js文件删除
7. mkdir :新建一个目录,就是新建一个目录文件夹
8. rm -r :删除一个文件夹,rm-r src就是删除src目录
9. mv :移动文件,mv index.js src , index.js就是我们要移动的文件,src是目标文件夹,当然这样写必须在同一个目录下
10. reset :重新初始化终端/清屏
11. clear :清屏
12. history :查看命令历史
13. help :帮助
14. exit :退出
15 # :表示注释
git config配置信息
1.git config --local -l :查看仓库的config配置信息
2.git config --global -l :查看全局级的config
3.git config --system -l :查看系统级的config
4.git config -l :查看当前生效的配置
5.git config -e :编辑仓库级文件
6.git config --global -e :编辑全局区文件
7.git config --system -e :编辑系统级文件
8.git config --global user.name "gd":配置用户名
9.git config --global user.email 1084493818@qq.com :配置邮箱
对于git来说,配置文件的权重是仓库>全局>系统
创建本地版本仓库
1.git init :创建一个本地空的仓库
2.git add test.txt :将test.txt文件添加到暂存区
3.git add . :将所有文件添加到暂存区
4.git commit -m "note" :note是备注说明,是将暂存区的文件提交到本地仓库
本地仓库版本回退
1.git log :查看版本的历史记录(也可以查看每个id,做版本回退)
2.git log --pretty=oneline :精简的查看版本的历史记录
3.git reset --hard HEAD^ :(HEAD^代表上一个版本,上上一个版本就是HEAD^^,往上50版本就是HEAD~50)表示回退上一个版本.
4.git reset --hard id :id代表是已经提交过的id(id位数较长,你也可以取前5位或者更多)回退到那个id版本
5.git reflog :查看你每一次提交的命令(比如你现在是回退的版本,你想再去最新版本就可以用这个查id,再回退)
6.git status :查看当前的文件的状态
7.git diff HEAD --test.txt :查看工作区和最新版本库里面的区别
8.git diff branch1 branch2:比较2个分支的差异性
9.git checkout -- test.txt :让test.txt回到最近一次git commit或git add时的状态。
10.git reset HEAD test.txt :把暂存区的修改撤销掉(unstage),就是把你的git add撤销掉 (git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。)
11.git rm test.txt :从版本库中删除文件
12.git restore --staged test.txt :从缓存区恢复到工作区
13.git commit -a -m ‘提交信息’:直接将工作区需要提交的代码直接全部提交到本地仓库
远程仓库管理
1.git remote add origin address:(把address替换你远程仓库地址)把本地仓库关联到远程仓库,并把内容推到远程仓库
2.git push -u origin master :把本地仓库内容推到远程仓库内容(-u是设置关联,以后再推送就可以简化,可以省略-u)
3.git remote -v :查看远程库的信息
4.git clone address :(把address替换你远程仓库地址)把远程仓库的内容克隆到自己本地仓库
5.git pull :合并远程最新的代码
6. git branch --set-upstream-to <branch-name> origin/<branch-name> :创建本地分支和远程分支的链接关系
7.git pull origin master --allow-unrelated-histories :合并远程最新的代码(允许合并无关的历史)
8.git fetch :是将远程主机的最新内容拉到本地仓库,用户在检查了以后决定是否合并到工作本机分支中
9.git pull = git fetch + git merge
10.git remote rm origin: 移除远程配置(当你远程地址想换,或者配置错了时使用)
11.git push --set-upstream origin dev (dev为创建分支的名字,建立本地到远端仓库的链接 --这样代码才能提交上去)
分支的创建与合并
1.git checkout -b dev :创建dev分支,并且切换到dev分支
2.git branch :查看当前分支
3.git checkout master :把分支切换到master
4.git merge dev :把dev分支合并到master分支
5.git branch -d dev :删除dev分支
6.git switch -c dev :创建并切换到新的dev分支(和1一样效果)
7.git switch master:把分支切换到master(和3效果差不多)
8.git log --graph :查看分支合并图
9.git merge --no-ff -m "merge with no-ff" dev :合并dev分支(--no-ff参数,表示禁用Fast forward)
10.git branch -D name :删除一个没有被合并的分支
11.git rebase :把分叉的提交历史“整理”成一条直线
12.git checkout -b dev origin/dev:本地创建分支dev,并拉取远程的dev内容到本地dev中,本地自动切换到该分支
13.git fetch origin master:dev:在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支
标签
1.git tag name :创建一个标签(name就是标签名字)
2.git tag :查看所有标签
3.git show tagname :查看某个标签的详细信息(tagname是标签名)
4.git tag -a v0.1-m"note"1094adb :给某个标签添加说明(v0.1 是标签名 note是说明)
5.git tag -d v0.1 :删除标签
6.git push origin tagname :把tagname标签推到远程
7.git push origin --tags :推送全部未推送过的本地标签
8.git push origin :refs/tags/tagname :删除一个远程标签(tagname是标签名字)
好上面基本上是覆盖了我们要用到的git命令,下面的内容是介绍一些概念、比如解决冲突,多人协作,rabase等等.
git诞生
(这个还是有必要了解一下,这样我们和别人吹水的时候,能够插上那么几句😄)
林纳斯·本纳第克特·托瓦兹对,这就是现在的林纳斯·本纳第克特·托瓦兹,他喜欢在演讲中骂脏话,还有竖拇指!大佬就是大佬,如此牛逼不说,发量还是如此之多!
很多人都知道,Linus在1991年创建了开源的Linux,从此,Linux系统不断发展,已经成为最大的服务器系统软件了。Linus虽然创建了Linux,但Linux的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为Linux编写代码,那Linux的代码是如何管理的呢?
事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!你也许会想,为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比CVS、SVN好用,但那是付费的,和Linux的开源精神不符。不过,到了2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是Linus选择了一个商业的版本控制系统BitKeeper,BitKeeper的东家BitMover公司出于人道主义精神,授权Linux社区免费使用这个版本控制系统。
安定团结的大好局面在2005年就被打破了,原因是Linux社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发Samba的Andrew试图破解BitKeeper的协议(这么干的其实也不只他一个),被BitMover公司发现了(监控工作做得不错!),于是BitMover公司怒了,要收回Linux社区的免费使用权。
Linus可以向BitMover公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。
Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
历史就是这么偶然,如果不是当年BitMover公司威胁Linux社区,可能现在我们就没有免费而超级好用的Git了。
工作区域:
Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。
Workspace:工作区,就是你平时存放项目代码的地方
Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote:远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
接下来我们看一下工作流程是怎么样的,我觉得下面这张图比较形象,如下
这样我们来验证一下每一个流程
git add -u <==> git add –update (提交所有被删除和修改的文件到数据暂存区),首先四个工作区域上面的流程即(git add 、git commit、git push、git commit -a、git pull)我相信大家都是用得非常熟悉,我们接下来说一下其他的
git fetch
为什么说即git pull 是 git fetch 和 git merge 的两步的和。首先要特别注意的一点是 fetch 抓取到新的远程跟踪分支时,本地的工作区(workspace)不会自动生成一份可编辑的副本,抓取结果是直接送到版本库(Repository)中
所以,如果我们git fetch之后发现我们确实是落后了版本,这时候我们就可以创建一个新的$ git checkout -b test origin/master(假设是test分支),这个时候我们切换到test分支就是和远程代码一摸一样,而切换到master分支就是我们之前的代码,这样我们就可以使用git diff master test比较分支差异,再合并即可.直接演示操作如下:
git checkout --
git checkout -- file 这里是分成2中情况
1.一种是file自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
2.一种是file已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
下面是截图操作,分别对应上面的2种情况
没有放到缓存区的情况 放在缓存区又修改了情况所以上面的2个红色里面的和我实际操作的还是有点出入,我个人感觉上面红色的git checkout HEAD是有点问题,如有知道的,大佬可以指正一下
标签管理
发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
Git的标签虽然是版本库的快照,但其实它就是指向某个commit的指针(跟分支很像对不对?但是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
然后,敲命令git tag <name>就可以打一个新标签:git tag <tagname>
可以用命令git tag查看所有标签:git tag
如果标签打错了,也可以删除:git tag -d <tagname>
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
如果要推送某个标签到远程,使用命令git push origin <tagname>
一次性推送全部尚未推送到远程的本地标签:git push origin --tags
从远程删除。删除命令也是push,但是格式如下: git push origin:refs/tags/<tagname>