注:此文参考
【廖雪峰的官方网站】https://www.liaoxuefeng.com/wiki/896043488029600
【菜鸟教程】https://www.runoob.com/git/git-tutorial.html
【Git官网】https://git-scm.com/docs
小知识
Git是目前世界上最先进的分布式版本控制系统(没有之一)。
Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!
什么是集中式什么是分布式?
集中式:
版本库是集中存放在中央服务器的,而干活的时候,先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器,集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。分布式:
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
安装Git
使用Windows的童鞋要特别注意:
千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议你下载Notepad++代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8 without BOM即可:
【配置Git】
- 安装完成后打开Git / GitBash 输入
- git config --global user.name " 你的用户名 "
- git config --global user.email “你的邮箱地址”
【创建版本库build repository】
- mkdir learngit------------创建一个空目录
- cd learngit------------进入这个目录下
- cd …-------------返回上级目录
- pwd------------显示当前目录
- git init------------把这个目录变成仓库,如果成功目录下生成.git文件夹
- 如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。
【提交文件到仓库】
- git add 文件名加后缀------------把存在的文件添加到仓库,从工作区到暂存区
- git commit -m “本次提交的说明”------------把文件提交到仓库,从暂存区插入到分支,-m后面输入的是本次提交的说明。
- git status------------查看工作区状态
- git diff------------查看修改difference
【版本之间切换】
- git log------------查看历史记录
- git log --pretty=oneline------------查看历史记录在一行显示
- git reset --hard head^ ------------回到上一个版本
- git reset --hard head^^ ------------回到上上一个版本
- git reset --hard head~100------------回到上100个版本
- git reset --hard commitID------------回到指定版本
- git reflog ------------获得历史版本号
【工作区、暂存区、和分支结构】
【为什么Git更优秀:因为Git跟踪并管理的是修改,而非文件】
- git checkout – 文件名加后缀 ---------------撤销修改,在没有add到暂存区之前,其实是将版本库中版本替换工作区中的版本
- git reset head 文件名加后缀 ---------------把暂存区的文件退回到工作区
- git rm 文件名加后缀---------------从版本库中删除文件
- rm 文件名加后缀---------------从工作区删除文件
远程仓库
由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
【1.设置ssh】
- ssh -keygen -t rsa -C “你自己的邮箱地址”
- 一路回车保持默认设置
- 最后在用户主目录下生成了.ssh 文件夹,有id_rsa和id_rsa.pub这两个文件。
- 这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人
【2.登陆GitHub】
- 登陆GitHub,打开“Account settings”,“SSH Keys”页面;
- 点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。
- 首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库:
- 在Repository name填入learngit,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
- 目前,在GitHub上的这个learngit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。现在,我们根据GitHub的提示,在本地的learngit仓库下运行命令:git remote add origin git@github.com:用户名/learngit.git
- git push -u origin master下一步,就可以把本地库的所有内容推送到远程库上:
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。 - 从现在起,只要本地作了提交,就可以通过命令: git push origin master
把本地master分支的最新修改推送至GitHub,现在,你就拥有了真正的分布式版本库!
从远程库克隆
- git clone git@github.com:用户名/库名.git
分支管理
- git checkout -b dev---------------创建一个名为dev分支并切换过去,相当于下面两条命令
- git branch dev
- git checkout dev
- git branch---------------查看分支
- git merge dev---------------合并dev到当前分支
- git branch -d dev---------------删除dev分支
【解决冲突】
- git checkout -b featurel---------------创建并切换到featurel分支
- 在featurel分支上修改文件
- git add readme.txt---------------把文件从工作区提交到暂存区
- git checkout master---------------切换到master分支
- 在master分支上修改文件
- git add readme.txt---------------把文件从工作区提交到暂存区
【现在分支上各有新的提交】
- git merge featurel---------------合并分支, 这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,这时候就要手动删除文件中的内容了
- git log --graph --pretty=oneline --abbrev-commit ---------------用带参数的git log也可以看到分支的合并情况
- git branch -d featurel ---------------删除featurel分支
【分支管理策略】 - git checkout -b dev---------------创建并切换到dev分支
- 修改文件
- git add readme.txt---------------将修改提交到暂存区
- git commit -m “add merge”---------------提交一个新的commit
- git checkout master---------------切换到master分支
- git merge --no -ff -m “merge with --no-ff” dev---------------禁用fast forward模式合并dev分支这样会保留分支合并信息因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去
- git log --graph --pretty=oneline --abbrev-commit---------------格式化查看分支历史,而fast forward 看不出来曾经做过合并
【BUG分支】
每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除
- git stash---------------把当前工作现场“储藏”起来,等以后恢复现场后继续工作
- git checkout master---------------切换到master分支
- git checkout -b issue-101 ---------------创建并切换到issue-101分支
- 修改文件
- git add readme.txt---------------添加到暂存区
- git commit -m “fixed bug 101”---------------提交到分支
- git checkout master---------------切换master 分支
- git merge --no-ff -m “merge bug fix 101” issue-101---------------合并issue-101分支
- git checkout dev---------------切换到原来的分支继续干活
- git stash list ---------------查看储藏区列表
- git stash apply---------------恢复储藏区到工作区
- git stash drop---------------删除储藏区
- git stash pop---------------恢复并删除储藏区
【vi 编辑器】
- cd …--------------- cd 与 … 之间有一空格(这里是两个点)
- cd git--------------- 进入 git 目录
- pwd--------------- 显示当前路径
- touch+文件名.后缀--------------- 直接新建一个文件
- vi+文件名.后缀--------------- 新建一个文件并进入编辑状态(如果文件已存在,则直接进入编辑状态)
- :i--------------- 命令模式下,我们可以直接按:+ i ,此时就会切换到编辑模式(这里有冒号)
- esc---------------在编辑模式下,按 esc 就可以切换到命令模式
- :q---------------退出编辑,如果文本内容被修改过,则会报错
- :q!---------------强制退出编辑,如果文本内容被修改过,会丢弃此次的修改
- :x ---------------退出编辑并保存
vi其实是linux的一个文本编辑器,所以 vi+文件名 后,其实是进入vi程序了。vi有两种模式,编辑模式和命令模式
【多人协作】
- git remote ---------------查看远程库信息
- git remote -v ---------------查看远程库更详细信息(显示抓取和推送的地址,没有推送权限则看不到推送地址)
- git push origin master ---------------推送master分支到远程库
- git checkout -b dev origin/dev ---------------从远程库抓取dev分支到本地,并且切换过去
- git push origin dev ---------------推送dev分支到远程库
- git pull---------------如果推送失败先从远程抓取分支
- git branch --set-upstream branch-name origin/branch-name---------------如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建
- 如果合并有冲突,则解决冲突,并在本地提交
- git rebase---------------操作可以把本地未push的分叉提交历史整理成直线;rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
master分支是主分支,因此要时刻与远程同步; dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
【标签管理】
- git tag v1.0---------------创建v1.0标签
- git tag ---------------查看所有标签
- git log --pretty=oneline --abbrev-commit ---------------格式化查看所有commit
- git tag v1.1 5958fe0---------------给指定commit 打上标签
- git show v1.0---------------展示标签信息
- git tag -a v0.1 -m “version 0.1 released” 1094adb---------------创建带有说明的标签,用-a指定标签名,-m指定说明文字
- git tag -d v0.1---------------删除标签
- git push origin v1.0---------------把指定标签推送到远程库
- git push origin --tags---------------把所有标签推送到远程库
- git push origin :refs/tags/v1.0---------------把远程库中的指定标签删除