原文地址:欢迎访问我的个人博客
Catalog:
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 分支:******* "注释"
......
有两个恢复工作现场的方式:
若apply后面不加任何内容则默认为最后一次stash的内容
$ git stash apply stash@{*}
上述命令提出后不会删除stash,用以下命令删除
$ git stash drop <stash name>
提出工作现场后删除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:
bash
$ git config --global alias.st status
co表示checkout:
bash
$ 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权限的用户账号:
- 安装Git
创建Git用户,用来运行git服务:
$ sudo adduser git
创建证书目录:
把所有的公钥全部导入到/home/git/.ssh/authorized_keys文件里,一行一个初始化Git仓库:
选定一个目录为Git的仓库:假设为/srv/sample.git
在/srv目录下输入命令:$ sudo git init --bare sample.git
把owner改为git:
sudo chown -R git:git sample.git
禁用shell登录
编辑/etc/passwd:找到:
git:x:1001:1001:…:/home/git:/bin/bash
改为:git:x:1001:1001:…:/home/git:/usr/bin/git-shell克隆远程仓库
在各自的电脑上运行以下命令即可克隆:
$ git clone git@server:/srv/sample.git
- 管理公钥:可以用Gitosis来管理公钥
- 管理权限:Git不支持权限控制,但是支持hook,用Gitdite可以达到目的
码了一晚上总算是码完了。博主的Git学习笔记就到此结束了,文中部分内容转自廖雪峰的官方网站.感谢廖雪峰老师
喜欢我的文章可以打赏一下,或者Star以下我的GitHub,也可以去About页面点个赞,谢谢
最后,感谢惠读