Dark`Kris

Private blog

I'm spark , hope you fire


Git学习笔记

What’s Git ?

Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。 一说到版本控制系统可能很多人会想到SVN,SVN作为一个集中式版本控制系统可是占据了不少程序员的青春,但是,Git的出现让SVN黯然失色。为什么呢?通俗来说,Git比SVN快的可不是一点半点。

什么是版本控制系统呢?看看现在普遍使用的微信、QQ,他们都是有版本的,所以你才会不断的更新,每次更新都有BUG被解决或者新功能的加入。而Git的功能可以说就是管理这些所有版本。公司通过Git将新版本发布,我们才能获取到新版本的app。

话不多说,既然想学Git,那么就对Git会有一定的了解,那这里就不瞎扯淡了,下面我们来讲讲Git的安装。

Git的安装

Mac环境和Linux环境下的安装

博主是使用Mac的,就先来讲讲Mac环境下的安装。

首先,我建议你下载一个Xcode,作为程序员这个是少不了的。

打开终端(命令行),一条指令即可完成安装:

$ sudo apt-get install git

此方法同样适用于Debian或Ubuntu Linux。老一点的Debian或Ubuntu Linux,要把命令改为sudo apt-get install git-core,因为以前有个软件也叫GIT(GNU Interactive Tools),结果Git就只能叫git-core了。由于Git名气实在太大,后来就把GNU Interactive Tools改成gnuit,git-core正式改为git。(摘自廖雪峰的官方网站)

Windows环境下的安装

作为开发者/程序员还用Windows?赶紧换了吧!!!

工作区、暂存区和版本库的介绍

我个人觉得学各类汇编语言之前先了解一下理论知识会学的比较快,于是我们先来看一下关于Git的理论知识。

工作区叫Working Directory;暂存区叫Stage;版本库叫做Repository。

当你要对某一个文件要通过Git上传,你首先要建立版本库,你的版本信息将存放在这里。

图片取自廖雪峰的官方网站

你的文件一开始一定是要存在本地文件夹里的,这个本地文件夹我们就可以称其为Working Directory。

在你上传文件到工作链之前,需要先将文件提交到stage暂存区,再将stage中的文件一并提交的master工作链。

创建版本库

$ mkdir <file name>		//建立一个新目录
$ cd <file name> 		//定位到某个目录
$ pwd					//显示当前目录
$ git init				//将当前目录初始化为版本库

这样,你就可以创建一个名为(你想要的名字)的Git版本库了。 之后系统会告诉你这是一个empty Git repository:

Initialized empty Git repository in <目录>

然后你会发现这个目录下多了一个.git文件(隐藏文件夹)(不要轻易动它!

  • 在目录下添加文件:

接下来我们学习一下最基本的”提交”:

首先将文件置于你的工作目录下,也就是工作区。再使用如下指令:

$ git add <file>			//将某个文件添加到stage
//此时你在工作区的文件已经上传到暂存区了
$ git commit -m "注释"	  //把stage中的文件提交到仓库的工作分支

即可将文件提交。

下面介绍两个比较常用的命令:

$ git status

这条命令可以让你查看当前仓库的状态:红色文字是在工作区内的文件,绿色的是在暂存区中的文件。

$ git diff <file>

这条命令可以查看这个版本与上个版本间文件的不同,这也是版本控制系统的方便快捷之处。

版本操作

作为版本控制系统,肯定要有查看各个版本的能力,我们可以使用以下指令来查看你commit的历史记录。(第二行的指令可以使其更简洁)

$ git log
$ git log --pretty=oneline

版本回溯

在Git中用HEAD表示当前版本,上一个版本是HEAD^,上上个版本是HEAD^^,往上100个版本是HEAD~100

用回退命令将版本回退:

$ git reset --hard HEAD^

这时再使用git log查看目录你就发现已经看不见HEAD的内容了。 但如果你能找到其commit ID,那么你仍然可以恢复其内容:

$ git reset --hard <commit ID>

commit ID并不需要写全,写前几位,Git便可以自动查找

你可以用以下命令查看每一次的命令,以防止你找不到commit ID。

$ git reflog

撤销修改

  • 丢弃工作区的修改
$ git checkout -- <file>
  • 将暂存区的修改撤销,重新放回工作区
$ git reset HEAD <file>

Ps.用HEAD表示最新的版本

删除文件

$ rm <file> 		//在工作区删除文件
$ git rm <file>		//在版本库中删除文件,完成后需要commit
$ git commit -m "注释"

如果你删错了:

$ git checkout -- <file>

git checkout命令是用版本库里的版本替换工作区的版本,所以无论工作区的修改还是删除都可以还原。

远程仓库GitHub

  • 创建SSH Key (Secue Shell Key)
$ ssh-keygen -t rsa -C "youremail@example.com"

然后一路回车。在用户主目录里找到.ssh目录,里面会有id_rsa.pub和id_rsa两个文件(秘钥对),id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉别人。

  • 登录GitHub,打开”Account settings”,”SSH Keys”页面,点击”Add SSH Key”,填上任意Title,在Key文本框里面粘贴公钥。

Ps.GitHub允许添加多个Key,方便在不同电脑上提交推送文件.

远程仓库操作

  • 添加远程库: 先在GitHub上建立一个新仓库,名字为目前电脑上版本库对应的名字。

将其与已有本地仓库关联,并把本地仓库的内容推送到GitHub仓库:

$ git remote add origin git@github.com:用户名/仓库名字.git

添加后远程库的名字是origin,这是Git的默认叫法。

然后把本地库内容推送至远程库:

$ git push -u origin master

(用 git push命令把当前分支master推送到远程库)

Ps.master是仓库的主分支

由于远程库为空,第一次推送master时加上 -u 参数,这样本地与远程的master分支关联起来,在以后的推送或拉取时便可以简化命令

自此只要把本地做了提交,就可以用以下命令将本地master分支推送到远程库:

$ git push origin master
  • 从远程库克隆
$ git clone git@github.com:用户名/仓库名.git

可以用命令ls查看当前目录文件。

分支管理

  • 创建、合并分支

创建:

$ git checkout -b <分支名>

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

$ git branch <分支名>		//新建分支
$ git checkout <分支名>		//切换分支

查看当前分支用git branch命令.

把分支合并到master:

$ git merge <分支名>
  • 删除分支
$ git branch -d <分支名>
$ git branch -D <分支名>		//强制删除

Git在实际生产中的应用

  • –no-ff模式下的merge与实际开发

图片转自廖雪峰的官方博客

通常在合并分支时,If possible,Git会使用Fast forward模式,在这个模式下,删除分支后会丢掉分支信息。若强制禁用Fast forward模式,Git会在merge时生成一个新的commit,这样分支历史上就可以看出分支信息。

$ git merge --no-ff -m "merge with no-ff" <分支名>

因为本次合并后会创建一个新的commit,所以加上-m注释参数,把commit描述进去。(即可达到上图合并模式)

  • Bug处理

当你遇到一个代号为101的Bug,你想创建一个分支issue-101来修复它。但dev上进行的工作未完成而不能提交,我们就可以用stash功能将当前工作现场“储藏”起来,等以后恢复现场后可以继续工作:

$ git stash

并且可以用git stash list命令查看stash目录:

$ git stash list
stash@{0}:WIP on 分支:******* "注释"
stash@{1}:WIP on 分支:******* "注释"
......

有两个恢复工作现场的方式:

  1. 若apply后面不加任何内容则默认为最后一次stash的内容
 $ git stash apply stash@{*}

上述命令提出后不会删除stash,用以下命令删除

 $ git stash drop <stash name>
  1. 提出工作现场后删除stash的命令:
 $ git stash pop <stash name>
  • 多人协作

查看远程库信息的命令:

$ git remote

或者加个参数-v现实更详细的信息

$ git remote -v

创建远程origin的分支到本地

$ git checkout -b <分支名> origin/分支名
  • 解决冲突

把最新的提交从远程库抓取下来:

$ git pull

若无法pull是因为没有与远程库建立连接。

指定本地分支与远程分支的连接:

$ git branch --set-upstream <分支名> origin/分支名

解决完冲突后再push即可

标签

  • 创建标签

首先切换到需要打标签的分支上再运用命令打标签:

$ git tag <tag name> <commit ID>

Ps.commit ID不写的话就是最新一次的commit

用命令查看标签:

$ git tag

(标签将字母排序而不按时间顺序)

可以用命令来查看标签信息:

$ git show <tag name>

可以创建带说明的标签:

$ git tag -a <tag name> -m "注释" <commit ID>

还可以通过加入-s参数用私钥签名一个标签:

$ git tag -s <tag name> -m "注释" <commit ID>

签名采用PGP签名,因此必须首先安装GunPG

标签操作

删除标签:

$ git tag -d <tag name>		//在本地删除
$ git push origin :refs/tags/<tag name>	//在远程库删除

推送标签:

$ git push origin <tag name>		//推送制定标签
$ git push origin --tags			//推送所有标签

自定义Git

让Git显示颜色

$ git config --global color.ui true

忽略特殊文件:

编写.gitignore文件,将需要忽略的文件全部列入即可

  • 配置别名

通俗地来讲就是给命令换个写法:

Eg. st表示status:

  $ git config --global alias.st status

co表示checkout:

  $ git config --global alias.co checkout

ci表示commit,br表示branch等等。

Ps.–global参数是全局参数,对在这台电脑上的所有Git仓库都生效

用unstage代表reset HEAD

$ git config --global alias.unstage 'reset HEAD'

用last显示最后一次提交信息

$ git config --global alias.last 'log -1'

配置高端log:

git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
  • 配置文件:目录:.git/config [alias]后面的即为别名

搭建Git服务器

You need :一台运行Linux的机器(推荐Ubuntu或者Deblan)

假设已有sudo权限的用户账号:

  1. 安装Git
  2. 创建Git用户,用来运行git服务:
  $ sudo adduser git
  1. 创建证书目录: 把所有的公钥全部导入到/home/git/.ssh/authorized_keys文件里,一行一个

  2. 初始化Git仓库: 选定一个目录为Git的仓库:假设为/srv/sample.git 在/srv目录下输入命令:

  $ sudo git init --bare sample.git

把owner改为git:

  sudo chown -R git:git sample.git
  1. 禁用shell登录 编辑/etc/passwd:找到: git:x:1001:1001:…:/home/git:/bin/bash 改为:git:x:1001:1001:…:/home/git:/usr/bin/git-shell

  2. 克隆远程仓库

在各自的电脑上运行以下命令即可克隆:

  $ git clone git@server:/srv/sample.git
  • 管理公钥:可以用Gitosis来管理公钥
  • 管理权限:Git不支持权限控制,但是支持hook,用Gitdite可以达到目的

码了一晚上总算是码完了。博主的Git学习笔记就到此结束了,文中部分内容转自廖雪峰的官方网站.感谢廖雪峰老师

喜欢我的文章可以打赏一下,或者Star以下我的GitHub,也可以去About页面点个赞,谢谢

最后,感谢惠读

Tips

Cancel

Thanks a lot,I will be better!

scan possible
scan possible
Scan and give tips as you wish

OpenAlipayScan it and give tips as you wish

Wait a minute,Loading