title: Git教程
date: 2019-01-07 21:20:37
tags:
Git教程
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
现在的项目开发已经离不开Git了,其强大的分支管理令多人协同开发十分便捷。
并且先在很多项目都选择在github上开源,学Git已是大势所趋。
一、安装和创建版本库
安装
在Ubuntu上安装git,先在终端输入git,看看系统有没有安装git
$ git
The program 'git' is currently not installed. You can install it by typing:
sudo apt-get install git
如上面提示是没有安装git,通过一条sudo apt-get install git
命令即可完成git安装。
安装完成后,需要进行下一步的设置;
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
git config 命令用了-global参数,表示你这台机器上的所有git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址
创建版本库
版本库又名repository。
在一个目录下,通过git init
命令把这个目录变成Git可以管理的仓库,目录下多了一个隐藏的.git文件夹,它是用来跟踪管理版本库的。
将文件添加到仓库需要两步:
$ git add <file> //把file文件添加到仓库。使用git add .可以把目录下全部改动的文件添加
$ git commit -m <message> //把文件提交到仓库。-m后面输入的是提交的说明,最好添加上说明,不然会提示错误
二、远程仓库
远程仓库
Github网站提供Git仓库托管服务,只要注册一个Git帐号,就可以免费获得Git远程仓库。
由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要设置:
第一步:创建SSH Key。打开终端,创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
一路回车,默认值即可。
之后可以在用户主目录中找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第二步:打开github网址,打开“Account setting”,“SSH and GPG keys"页面,然后点New SSH key,填写任意title,在key值栏里粘贴id_rsa.pub文件的内容。
Github需要SSH key是因为github需要识别推送内容是尼推送的,而不是别人冒充推送的,而且Git支持SSH协议,所以Github只要知道了你的公钥,就可以确认只有你可以推送。
而且,Github允许你添加多个Key,你就可以在多台电脑上往Github
上推送了。
添加远程库
在本地创建一个Git仓库后,在Github创建一个Git仓库,并且让着两个仓库进行远程同步,这样。Github上的仓库既可以作为备份,又可以让其他人通过该仓库来协作
git remote add origin git@github.com:sherrybabyone/demo.git // 关联一个远程仓库
git push -u origin master // 关联后,第一次推送master分支的所有内容
git push origin master // 此后,可以省略-u参数
从远程库克隆
git clone git@github.com:sherrybabyone/demo.git // 克隆远程仓库
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快
三、时光机穿梭
先说明两个命令:
$ git status //掌握工作区的状态
$ git diff <file> //如果git status显示有文件被修改过,用git diff 可以查看被修改的内容。可以查看工作区和版本库里面最新版本的区别。
版本回退
$ git log // 命令显示在版本库的提交日志。
在Git中,每次commit提交到仓库都会保存一个快照,称为commit,操作失误时可以回退之前的commit恢复。
一大串类似6899rta…的是commit id(版本号)
// 在Git中,用HEAD表示当前版本,上一个版本是HEAD^,上上一个版本号是HEAD ^^,往上100个版本用HEAD~100表示。
$ git reset --hard commit_id //回退到指定版本
$ git reset --hard HEAD^ //回退到上一个版本
$ git reflog //命令查看历史所有提交命令,以便确定返回哪个版本的版本号
工作区和暂存区
工作区:你存储git及文件的文件夹就是一个工作区。
版本库:工作区里的隐藏目录.git就是GIt的版本库
Git的版本库里包含很多东西,有被称为stage的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master分支的HEAD指针等等。
git add
把文件添加进去,实际上就是把文件添加到暂存区里。
git commit
提交,实际上就是把暂存区里的所有文件提交到当前分支
管理修改
Git追踪并管理的是修改,而非文件。
每次修改,如果不用git add到暂存区,那就不会加入到commit中。
撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
,把暂存区的修改撤销掉(unstage),就回到了场景1,第二步按场景1操作。HEAD表示最新的版本
删除文件
从版本库中删除文件:
$ git rm <file> // 删除一个文件
$ git commit -m " " // 提交到版本库中
四、分支管理
创建和合并分支
在Git里,master称为主分支,HEAD指向是当前分支。
$ git branch // 查看分支,当前分支前会有一个*号
$ git branch <name> // 创建一个指定分支
$ git checkout <name> // 切换到指定分支
$ git checkout -b <name> // 创建并切换到指定分支
$ git merge <name> // 合并某分支到当前分支。Fast-forward指的合并模式是”快进模式“,直接把当前分支指向指定分支的提交
$ git branch -d <name> // 删除指定分支
解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
分支管理策略
通常,合并分支时,如果可能,Git会用Fast forwward模式,但在这种模式下,删除分支后,会丢掉分支信息。
如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。
$ git merge --no-ff -m "merge with no-ff" dev // --no-ff参数,表示禁用Fast forward。因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去
如果要丢弃一个没有合并的分支,使用git branch -d <name>
会报错
$ git branch -D <name> // 强行删除
Bug分支
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,可以先把工作现场git stash
暂存起来
$ git stash // 会把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。
$ git stash pop // 恢复之前缓存的工作目录
$ git stash list // 查看保存的stash
多人协作
当从远程库克隆时,实际上Git会自动把本地的master分支和远程的master分支对应起来了,并且,远程库的默认名称是origin
git remote // 查看远程库的信息
git remote -v // 查看远程库的详细信息
git push origin master // 推送分支。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上。
git pull // 从远程抓取分支,如果有冲突,要先处理冲突
git branch --set-upstream-to=origin/dev dev // 指定设置本地dev分支与远程origin/dev分支的链接
多人协作的工作模式通常是这样的:
- 首先,试图用
git push origin <branch-name>
推送自己的修改 - 如果推送失败,则因为远程分支有更新,需要先用
git pull
试图合并 - 如果合并有冲突,则解决冲突,并在本地提交
- 没有冲突或者解决冲突后,再用
git push origin <branch-name>
推送就能成功!
如果giut pull
显示no tracking information,则说明本地分支与远程分支的链接关系没有创建,需要用命令创建联系
Rebase
$ git log --graph --pretty=oneline --abbrev-commit // 查看提交历史
$ git rebase // 把本地未push的分叉提交历史整理成直线
标签管理
Git的标签是版本库的一个快照。虽然是版本库的一个快照,但其实它就是指向某个commit的指针(跟分支很像,但是分支可以移动,标签不能移动),创建和删除标签都是瞬间完成的。
创建标签
$ git tag <tagname> // 用于新建一个标签,默认为HEAD,也可以指定一个commit id
$ git tag -a <tagname> -m "..." // 可以指定标签信息
$ git tag // 可以查看所有标签
操作标签
git push origin <tagname> // 可以推送一个本地标签
git push origin --tags // 可以推送全部未推送过的本地标签
git tag -d <tagname> // 可以删除一个本地标签
git push origin :refs/tags/<tagname> // 可以删除一个远程标签
使用Github
- Github是一个开源协作社区,通过Github,既可以让别人参与你的开源项目,也可以参与别人的开源项目。
- 在Github上,可以任意Fork开源仓库,参与一个开源项目
- 自己拥有Fork仓库的读写权限
- 可以推送pull request给官方仓库来贡献代码