什么是git?
参考文档:https://www.liaoxuefeng.com/wiki/896043488029600
git是目前世界上最先进的分布式版本控制系统
什么是版本控制系统?
版本控制是指对软件开发过程中各种程序代码,配置文件以及说明文档等文件的变更的管理,是软件配置管理的核心思想之一,
版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了已录下来。每一次文件的改变,文件的版本号都将增加。
分布式VS集中式?
集中式:如下图
版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟
分布式:如下图
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。
那么如何在分布式版本控制系统中进行协同开发呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
安装git
在Mac OS X上安装Git
一是安装homebrew,然后通过homebrew安装Git,具体方法请参考homebrew的文档:http://brew.sh/。
第二种方法更简单,也是推荐的方法,就是直接从AppStore安装Xcode,Xcode集成了Git,不过默认没有安装,你需要运行Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
在Windows上安装Git
在Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的同学请移步国内镜像),然后按默认选项安装即可。
安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!
创建版本库
什么是版本库?
版本库又名仓库,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
创建
<1> 选择一个合适的地方,创建一个文件夹,可以直接=右击创建文件夹,也可以使用命令创建,如下图,pwd打印当前目录
<2> 通过git init命令吧这个目录变成Git可以管理的仓库,这样就创建好了一个仓库,并且它还告诉你这是一个空的仓库
<3>验证一下,打开文件夹,会发现文件夹里面多了一个.git文件(这个文件是默认隐藏的)
也可以使用ls -ah命令查看(默认隐藏,所以ls查看不了)
<4>git add 文件(将文件添加到暂存区) 和 git commit -m ‘备注’(将文件提交到本地仓库,-m后面输入的是本次提交的说明)
注意:commit可以一次提交很多文件,所以你可以多次add不同的文件
总结:
创建仓库
初始化一个Git仓库,使用git init命令。
添加文件到Git仓库,分两步:
使用命令git add ,注意,可反复多次使用,添加多个文件;
使用命令git commit -m ,完成。
版本回退
HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
查看状态 git status
管理修改
提交后,用git diff HEAD – readme.txt命令可以查看工作区和版本库里面最新版本的区别
撤销修改
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD ,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
删除文件
一般情况下,rm readme.txt
但是有两种特殊情况
一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit,文件就从版本库中被删除了。
$ git rm test.txt
$ git commit -m "remove test.txt"
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本。git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
$ git checkout -- test.txt
远程仓库
要关联一个远程库,使用命令git remote add origin git@server-name:path/repo-name.git;
关联后,使用命令git push -u origin master第一次推送master分支的所有内容;
此后,每次本地提交后,只要有必要,就可以使用命令git push origin master推送最新修改;
从远程仓库克隆
要克隆一个仓库,首先必须知道仓库的地址,然后使用git clone命令克隆。
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。
分支管理
创建与合并分支
《1》首先,我们创建dev分支,然后切换到dev分支:
$ git checkout -b dev
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
$ git branch dev
$ git checkout dev
《2》用git branch命令查看当前分支。当前分支前面会标一个*号。
$ git branch
《3》对readme.txt做个修改,然后提交。dev分支的工作完成,我们就可以切换回master分支
$ git add readme.txt
$ git commit -m "branch test"
$ git checkout master
《4》我们把dev分支的工作成果合并到master分支上
$ git merge dev
《5》合并完成后,就可以放心地删除dev分支了
$ git branch -d dev
《6》删除后,查看branch,就只剩下master分支了
$ git branch
总结
查看分支:git branch
创建分支:git branch
切换分支:git checkout 或者git switch
创建+切换分支:git checkout -b 或者git switch -c
合并某分支到当前分支:git merge
删除分支:git branch -d
解决冲突
当你的同事比你先提交代码,那么你的代码和你同事的代码就会有冲突,你必须先把代码从远端拉取下来,在本地进行一个合并操作,然后再推送到远端。Git会告诉我们,readme.txt文件存在冲突,必须手动解决冲突后再提交。git status也可以告诉我们冲突的文件。最后,删除我工作的分支。用git log --graph命令可以看到分支合并图。
分支
master分支是主分支,因此要时刻与远程同步;
dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
查看远程库信息,使用git remote -v;
本地新建的分支如果不推送到远程,对其他人就是不可见的;
从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交;
在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致;
建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name;
从远程抓取分支,使用git pull,如果有冲突,要先处理冲突