廖雪峰git教程笔记与总结--git简介常用命令分支管理(代码片段)

黑子Kuroko 黑子Kuroko     2022-11-22     387

关键词:

本文主要用于记录阅读Git教程 - 廖雪峰的官方网站后的一些心得笔记,并且对git一些常用命令做一个整理总结。

本文要点分为:1、Git简介;2、Git常用命令;3、Git分支管理。

一、Git简介

什么是Git?

Git是目前世界上最先进的分布式版本控制系统(没有之一)。

Git的诞生

个人觉得还是很有必要了解一下Git的来龙去脉的,这样可以加深对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 与 SVN 的区别

我自己最早接触的就是SVN,从SVN到Git使用感触还是比较深刻的,此处先简单叙述一下我个人的理解。

首先,这是一个分布式(git)和集中式(svn)的区别。git好处在于多个人共同研发一个项目可以互不影响,或者多个需求进来可以分不同版本进行分布研发互不影响。而svn由于项目代码集中在一台机子上管理,往往受到彼此的牵制影响,很难做到多个版本并行研发。

其次,svn的那个套路是需要联网才能上传提交和下载更新,而git如果你不去推送到远程分支的话,仅本地git管理的话是可以不用联网的。

最后,git最强大的一点就是他的分支管理还有tag标签管理,如果是小团队(1~2人)、小项目(很少有需求变更,版本更新不多的情况)用用SVN还是阔以的,但是一旦项目庞大、版本复杂,这个时候强烈介意采用git来进行管理,不然svn会被虐很惨的。

△svn图示 -- 集中式

 

△git图示 -- 分布式

 

关于git远程分支(origin)的理解,摘要如下:

在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

综上,我觉得git是一个可以实现“分布式”的升级版“SVN”,当多个人在一个git分支上进行共同研发的时候,那么他就是一个类似svn的操作;当多个人在不同git分支进行研发的时候,那么我们就能感受到了git的强大,svn的局限。

 

二、Git常用命令

说明:以下红色字体为固定命令,紫色字体为可变参数,一般指代路径名或文件名或分支名等。

git clone git@github.com:michaelliao/gitskills.git  从远程库克隆

如果有多个人协作开发,那么每个人各自从远程克隆一份就可以了。

你也许还注意到,GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git这样的地址。实际上,Git支持多种协议,默认的git://使用ssh,但也可以使用https等其他协议。

使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https

git remote add origin git@server-name:path/repo-name.git 关联远程库

注:一般都是从远程库克隆来拉取项目的,不建议本地去关联远程库。

要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git

关联后,使用命令git push -u origin master第一次推送master分支的所有内容;

此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;

分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!

git log 查看提交日志

git log --pretty=oneline 带参数地查看提交日志,显示会好看些

git log --graph 查看分支合并图

git log --graph --pretty=oneline --abbrev-commit 带参数地查看分支合并图,显示更好看

git reset --hard HEAD^ 回滚到上一个版本

git reset --hard HEAD^ 回滚到上上一个版本

git reset --hard commit_id  回滚到指定的提交id,例如 git reset --hard 1094a

注:此处版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

git add readme.txt 添加改动过的文件至暂存区

git commit -m "change something"  将暂存区的变更提交至当前分支,同时带上message备注

git status 查看当前仓库状态,比如有没有还没提交的呀啥的

git checkout -- file 丢弃工作区的修改 比如

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

总之,就是让这个文件回到最近一次git commitgit add时的状态。

git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。

git branch 查看本地分支

git branch -r 查看远程分支

git branch -a 查看所有分支

git branch <name> 创建分支

git checkout <name> 切换分支

git checkout -b <name> 创建+切换分支

git merge <name> 合并某分支到当前分支

git branch -d <name> 删除分支

注:以下为实战经典操作,所以整段copy了过来,大家可以完整地感受一下git命令常用流程。

首先,我们创建dev分支,然后切换到dev分支:

$ git checkout -b dev
Switched to a new branch 'dev'

git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:

$ git branch dev
$ git checkout dev
Switched to branch 'dev'

然后,用git branch命令查看当前分支:

$ git branch
* dev
  master

git branch命令会列出所有分支,当前分支前面会标一个*号。

然后,我们就可以在dev分支上正常提交,比如对readme.txt做个修改,加上一行:

Creating a new branch is quick.

然后提交:

$ git add readme.txt 
$ git commit -m "branch test"
[dev b17d20e] branch test
 1 file changed, 1 insertion(+)

现在,dev分支的工作完成,我们就可以切换回master分支:

$ git checkout master
Switched to branch 'master'

切换回master分支后,再查看一个readme.txt文件,刚才添加的内容不见了!因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:

现在,我们把dev分支的工作成果合并到master分支上:

$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
 readme.txt | 1 +
 1 file changed, 1 insertion(+)

git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并。

合并完成后,就可以放心地删除dev分支了:

$ git branch -d dev
Deleted branch dev (was b17d20e).

删除后,查看branch,就只剩下master分支了:

$ git branch
* master

因为创建、合并和删除分支非常快,所以Git鼓励你使用分支完成某个任务,合并后再删掉分支,这和直接在master分支上工作效果是一样的,但过程更安全。

git remote -v 查看远程库信息

git push origin branch-name 从本地推送分支

git pull 抓取远程的新提交

git checkout -b branch-name origin/branch-name 在本地创建和远程分支对应的分支,本地和远程分支的名称最好一致

git branch --set-upstream branch-name origin/branch-name 建立本地分支和远程分支的关联

git tag 查看所有标签

git tag <tagname> 新建一个标签

默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办? 方法是找到历史提交的commit id,然后打上就可以了:

假设它对应的commit id是f52c633,敲入命令:

$ git tag v0.9 f52c633

git tag -a <tagname> -m "blablabla..." 可以指定标签信息

创建带有说明的标签,用-a指定标签名,-m指定说明文字:

git show <tagname> 可以看到说明文字
 

git tag -d <tagname> 删除一个本地标签

因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。 如果要推送某个标签到远程,使用命令git push origin <tagname>

git push origin <tagname> 推送一个本地标签

git push origin --tags 推送全部未推送过的本地标签

git push origin :refs/tags/<tagname> 删除一个远程标签

如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:

$ git tag -d v0.9
Deleted tag 'v0.9' (was f52c633)

然后,从远程删除。删除命令也是push,但是格式如下:

$ git push origin :refs/tags/v0.9
To github.com:michaelliao/learngit.git
 - [deleted]         v0.9

要看看是否真的从远程库删除了标签,可以登陆GitHub查看。

 

三、Git分支管理

不行了,写的我太TM累了,分支管理暂时用以前的文章将就地看一下吧:Git分支管理使用心得

不过还是那句话,具体情况具体分析,git为我们提供了分布式开发的可能性,如何去应用git分布式特性到我们的项目当中,需要我们灵活应变。

git常用命令总结--廖雪峰老师git教程命令总结(代码片段)

学习了廖雪峰老师的Git教程之后的命令总结,重点关于git和远程仓库的东西。如果没有学过,这是传送门 下面这个图很重要   一、git初始化本地仓库和配置  echo"想输入到文件的内容,一般为#库名字">>README... 查看详情

git常用命令,参照廖雪峰老师的git教程

...就是边学边记笔记,这里只是本人写的自己通过学习了廖雪峰老师的git教程之后自己做的笔记,个人理解,可能有失偏颇,如想学习更专业更权威的git知识,请移步廖雪峰老师的官网一.创建git仓库  1.gitinit 在本地创建一... 查看详情

廖雪峰git教程学习笔记

教程地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000创建版本库初始化一个Git仓库,使用gitinit命令。添加文件到Git仓库,分两步:第一步,使用命令gitadd<file>,注意,可反复多次使用,添加多个文件;... 查看详情

学习总结git学习-参考廖雪峰老师教程九-使用码云

学习总结之Git学习-总目录:一、Git简介二、安装Git三、创建版本库四、时光机穿梭五、远程仓库六、分支管理七、标签管理八、使用GitHub九、使用码云十、自定义Git期末总结九、使用码云 查看详情

git(代码片段)

廖雪峰Git教程+Git-Cheat-Sheet学习总结本教程主要是个人的Git学习总结。主要参考博客:廖雪峰Git教程Git-Cheat-Sheet文章目录廖雪峰Git教程+Git-Cheat-Sheet学习总结Git教程(廖雪峰)安装Git创建版本库时光机穿梭版本回退工作区和暂存区... 查看详情

廖雪峰git教程学习笔记

廖雪峰git简单教程学习笔记教程地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b0001、可以这样设计目录,在d: eposisoty在这个目录下面有很多的仓库。mkdirlearngitcdlearngit>>gitinit   &n 查看详情

廖雪峰git教程学习笔记

...果需要更全的知识请移步廖老师Git教程学习内容来源:廖雪峰Git教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd183 查看详情

廖雪峰的git教程总结

一:创建版本库小结现在总结一下今天学的两点内容:初始化一个Git仓库,使用gitinit命令。添加文件到Git仓库,分两步:使用命令gitadd<file>,注意,可反复多次使用,添加多个文件;使用命令gitcommit-m<message>,完成。二... 查看详情

《廖雪峰git教程》学习笔记

原文链接一.创建版本库①初始化一个Git仓库:gitinit②添加文件到Git仓库:1.gitadd<file>; 2.gitcommit 二.时光机穿梭①查看工作区状态,文件是否被修改过:gitstatus②查看修改的内容:gitdiff1.版本回退①HEAD:当前版本②HEAD^... 查看详情

git学习笔记

本文整理参考廖雪峰的 Git 教程,整理 Git 学习笔记,用于 Git 常用命令速查:常用命令用彩色标注!Git学习笔记$gitconfig--globaluser.name"YourName"配置本机所有仓库的用户名$gitconfig--globaluser.email"[email protected]"配置... 查看详情

git教程

  该笔记事笔者学习廖雪峰Git教程的笔记,如果想详细了解Git请移步廖雪峰官网。  廖雪峰官网地址: https://www.liaoxuefeng.com/  廖雪峰Git教程: https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67 查看详情

git常用命令(代码片段)

Git使用(对廖雪峰老师Git教程的总结,同时推荐一个博客的教程,诙谐有趣)Git配置全局配置主目录下的.gitconfig#设置名称信息gitconfig--globaluser.name<"Name">#设置邮箱信息gitconfig--globaluser.email<"Email">#显示颜... 查看详情

git学习笔记

  以下内容总结自廖雪峰的git教程,教程原址:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 创建版本库初始化一个Git仓库,使用gitinit命令。添加文件到Git仓库,分两步:第一步,使用命令gitadd<fil... 查看详情

笔记git的常用操作命令(持续更新。。。)

...代码git在这里不作什么介绍了,百度一大堆的教程首推廖雪峰老师的:http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000还有一篇我觉得写得不错的教程:http://blog.jobbole.com/ 查看详情

git简单教程

该笔记总结廖雪峰Git教程,参考网站:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 一.简介  Git采用分布式版本控制系统,在此解释分布式与集中式的区别.  集中式版本控制系统:  版本库集中存放在中... 查看详情

廖雪峰git教程学习笔记(代码片段)

原文链接:Git教程-廖雪峰的官方网站一、Git简介Git的诞生集中式vs分布式集中式版本控制系统(CVS、SVN):由中央服务器负责版本控制,必须联网才能工作分布式版本控制系统(Git):没有所谓“... 查看详情

廖雪峰git教程学习笔记(代码片段)

原文链接:Git教程-廖雪峰的官方网站一、Git简介Git的诞生集中式vs分布式集中式版本控制系统(CVS、SVN):由中央服务器负责版本控制,必须联网才能工作分布式版本控制系统(Git):没有所谓“... 查看详情

git常用命令总结——你一定会用到的几个命令

   git入门看廖雪峰大神的教程即可,通俗易懂:   https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000                         &nbs 查看详情