git学习笔记

为啥要写这一篇呢?最近在整理过去1~2年的分享笔记,一方面可以温故而知新,另一方面希望在工作得以实践。随着最大的同性恋社区github的流行,很多公司已经放弃使用svn,而使用了gitlab。据悉Google, Facebook, Microsoft等世界级公司每天在用Git,而github和gitlab都在Git基础上得以发展及延伸。

1. 集中式vs分布式

笔者之前使用过非常多的版本控制工具,主要有CVS(09年左右)、VSS(微软的Visual Source Safe)、TFS(微软的Team Foundation Server)、SVN(Subversion)。这些都是集中式的版本控制系统,而TFS功能是最强大的,可以讲它已经到了极致。

什么是集中式?

版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。

什么是分布式?

首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。

那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

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

分布式版本很多,Git(免费的)的优势不单是不必联网这么简单,后面我们还会看到Git极其强大的分支管理。

2. Git的诞生

Linus Torvalds是大牛中的大牛,它不但开创了Linux操作系统,而且他发明了Git版本控制系统。

在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码。2005年Linux 内核开发社区正面临严峻的挑战:他们不能继续使用 BitKeeper了(一个分布式版本控制系统),原因是当时Bitkeeper 著作权所有者决定收回授权,内核开发团队与其协商无果,而又没有其他的 SCM (Software Configuration Management)可满足他们的分布式系统的需求。

为什么Linus不把Linux代码放到版本控制系统里呢?不是有CVS、SVN这些免费的版本控制系统吗?因为Linus坚定地反对CVS和SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。

Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!牛是怎么定义的呢?大家可以体会一下。Git迅速成为最流行的分布式版本控制系统,尤其是2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。

Atlassian为Git做了一个10年的纪录图。

3. git github gitlab区别

git 它是一种开源的版本控制系统,可以高效的管理项目版本。同时也是一个版本控制软件。在Git中并不存在主库这样的概念,每一份复制出的库都可以独立使用,任何两个库之间的不一致之处都可以进行合并。
github 它可以托管各种Git库,并提供web界面。GitHub的独特卖点在于从另外一个项目进行分支的简易性。为一个项目贡献代码非常简单:首先点击项目站点的“fork”的按钮,然后将代码检出并将修改加入到刚才分出的代码库中,最后通过内建的“pull request”机制向项目负责人申请代码合并。已经有人将GitHub称为代码玩家的MySpace。
gitlab 它是一个用于仓库管理系统的开源项目,使用git进行代码管理工具,可以自己搭建GitLab仓库服务器。

4. 安装

最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。安装比较简单,这里不解释了,看官方介绍吧

5. 命令操作

5.1 远程仓库操作

检出仓库 $git clone git://github.com/jquery/jquery.git
查看远程仓库

$git remote –v

$git remote show origin

添加远程仓库 $git remote add [name] [url]
删除远程仓库

$git remote rm [name]

修改远程仓库

$git remote set-url --push[name][newUrl]
拉取远程仓库

$git pull [remoteName] [localBranchName]

推送远程仓库

$git push [remoteName] [localBranchName]

$git push origin [name]  创建远程分支(本地分支push到远程)

5.2 分支操作

git branch 		#列出本地分支
git branch -a	#列出local and remote branch
git branch -r   #列出remote branch
git branch feture1 		#新建一个分支feture1 

git branch -d feture1	#删除分支feture1,d会检查feture1是否已经merge到其父分支,如果没有,不予删除。D直接删除 

git checkout feture1 	#切换到分支feture1
git checkout -b feture1 #创建新分支并立即切换到新分支

git merge feture1 	  #合并并提交feture1的所有版本到当前分支,如果当前分支自建立feture1后无更改,则启动fastforward,可以添加参数–no-ff关闭该效果

git status 				#查看目前分支下文件控制情况 
git commit -v 		#可以查看diff内容
git log -1 				#查看log信息,最近1条
git log --pretty=oneline 					 #展示提交历史(用oneline 将每个提交放在一行显示)
git log --pretty=format:"%h - %an, %ar : %s" #可以定制要显示的记录格式

5.3 版本操作

查看版本 $git tag
创建版本

$git tag [name]

删除版本

$git tag -d [name]

查看远程版本 $git tag -r
创建远程版本(本地版本push到远程) $git push origin [name]
删除远程版本 $git push origin :refs/tags/[name]

5.4 submodule操作

git submodule add [url] [path]

 

添加子模块,如:

$git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs

git submodule init

初始化子模块,只在首次检出仓库时运行一次就行

git submodule update

 

更新子模块,每次更新或切换分支后都需要运行一下
git rm

删除子模块,

1)$ git rm --cached [path]
2) 编辑“.gitmodules”文件,将子模块的相关配置节点删除掉
3) 编辑“.git/config”文件,将子模块的相关配置节点删除掉
4) 手动删除子模块残留的目录

5.5 忽略

在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可。可以忽略自身。.gitignore文件本身要放到版本库里,并且可以对.gitignore做版本管理!

.a             #忽略.a的文件 
!lib.a         #不要忽略lib.a 
/TODO     #忽略此目录下的TODO文件,子目录下的TODO文件不忽略 
build/        #忽略所有build/目录下的文件 
doc/.txt      #忽略文件入doc/notes.txt,但是子目录下的txt不被忽略

5.5 git config

因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识

$git config --global user.name "alex2chen"
$git config --global user.email "[email protected]"

注意:git config  –global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。

5.6 创建版本库

$cd D:
$mkdir git-test
$cd git-test
$pwd
$git init				#把这个目录变成git可以管理的仓库,会多了一个.git的目录,是Git来跟踪管理版本的,没事千万不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了
$git add readme.txt			#添加到暂存区
$git commit -m "readme.txt"		#把文件提交到仓库
$git status 				#查看是否还有文件未提交
$git diff readme.txt	 		#readme.txt文件已被修改,但是未被提交的修改,可以查看差异性
$git log				#查看修改历史
$git log --pretty=oneline		#查看简单的修改历史
$git reset --hard HEAD^	 		#回退到上一个版本的命令

我们前面说过使用Git提交文件到版本库有两步:

  1. 是使用 git add 把文件添加进去,实际上就是把文件添加到暂存区
  2. 使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上

6. TortoiseGit 可视化

TortoiseGit是一个开放的git版本控制系统的源客户端,支持Winxp/vista/win7/Win10,下载地址。

7. github演示

…or create a new repository on the command line
echo "# osgi_javaModel_t1" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/alex2chen/osgi_javaModel_t1.git
git push -u origin master
…or push an existing repository from the command line
git remote add origin https://github.com/alex2chen/osgi_javaModel_t1.git
git push -u origin master
…or import code from another repository
You can initialize this repository with code from a Subversion, Mercurial, or TFS project.

8. Q&A

理解工作区与暂存区的区别?

工作区:就是你在电脑上看到的目录,比如目录下git-test里的文件(.git隐藏目录版本库除外)。或者以后需要再新建的目录文件等等都属于工作区范畴。

版本库(Repository):工作区有一个隐藏目录.git,这个不属于工作区,这是版本库。其中版本库里面存了很多东西,其中最重要的就是stage(暂存区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。

svn和gitlab操作习惯?

git学习笔记_第1张图片

如果你是window系统,可参阅window7下同时使用github和gitlab 。

你可能感兴趣的:(工具)