Git分布式版本管理系统
CVS及SVN集中式版本管理系统
原文:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013744142037508cf42e51debf49668810645e02887691000
总结整理如下:
*集中式vs分布式
集中式版本控制系统的版本库是集中存放在中央服务器的,要先从中央服务器取得最新的版本,再用自己的电脑干活,干完活再推送给中央服务器。最大缺点就是必须联网才能工作,若在互联网上,网速慢时可能提交一个10M的文件就需要5分钟。
分布式版本控制系统无“中央服务器”,每个人的电脑上都是一个完整的版本库,只需把各自的修改推送给对方,就可以互相看到对方的修改了。和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,某一个人的电脑坏掉可从其他人那复制。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
*安装Git
官网: https://git-scm.com/downloads
国内镜像 https://pan.baidu.com/s/1kU5OCOB#list/path=%2Fpub%2Fgit
安装后开始菜单找到“Git”->“Git Bash”,弹出类似命令行窗口就说明Git安装成功
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
*创建版本库repository
版本库即仓库,可理解为一个目录,目录中的所有文件都可以被Git管理起来,每个文件的删除、修改、删除,git都能跟踪,一遍任何时候都可以追踪历史或将来某个时刻可以还原。
1. 先创建一个目录
$ mkdir learngit =>$ cd learngit => $ pwd //用于显示当前目录/Users/michael/learngit
Windows系统避免遇到各种莫名其妙的问题,确保目录名(包括父目录)不包含中文。
2. 通过git init 命令把这个目录变成Git可以管理的仓库
$ git init // Initialized empty Git repository in /Users/michael/learngit/.git/
用ls -ah命令可以看到隐藏的.git目录,用来跟踪管理版本库
3. 把文件添加到版本库
版本控制系统只能跟踪文本文件的改动,如TXT文件,网页,所有的程序代码等,告诉每次的改动,而图片、视频这些二进制文件,虽能由版本控制系统管理,但无法跟踪文件的变化,只能把二进制文件每次改动串起来,只知道图片从100KB改成了120KB,不知道具体改了什么。MicrosoftWord是二进制的,版本控制系统无法跟踪其改动,若要真正使用版本控制系统,就要以纯文本方式编写文件。文本是有编码的,若无历史遗留问题,建议使用UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。不要用windows自带的记事本,用Notepad++,把默认编码设置为UTF-8 without BOM。
创建文件readme.txt到库目录 => $ git add readme.txt => git commit -m “wrote a readme file”
*时光穿梭机
git status命令可以让我们时刻掌握仓库当前的状态;
git diff即difference,显示格式是Unix通用的diff格式,后面可跟文件,显示具体修改内容;
git add 修改后还需要add;
git log 命令可以由近到远提供之前commit的信息(历史记录),后面可加--pretty=oneline参数可使输出信息每条简洁为一行。
1. 版本回退
git reset : 回退到上一个版本,eg: git reset --hard HEAD^;
git reset --hard 3628164(commit id): 指定回到未来某个版本,仅需写版本号前几位即可;
cat 文件: 可以查看文件内容;
git reflog:用来记录每一次命令
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针
2. 工作区和暂存区(其他版本控制系统无暂存区的概念)
工作区Working Directory:即电脑中的一个目录
版本库Repository:工作区中的隐藏目录.git,版本库包括暂存区(stage/index),还有Git自动
创建的第一个分支master,以及指向master的一个指针HEAD。
3. 管理修改:git跟踪管理的是修改而非文件
git diff HEAD -- readme.txt命令可以查看工作区和版本库中最新版本的区别
4. 撤销修改
git checkout -- 文件:可以丢弃工作区的修改,--很重要,没有--为切换到另一个分支的命令。
git reset HEAD 文件:把暂存区的修改撤销掉(unstage),重新放回工作区
撤销提交用版本回退
5. 删除文件
若从版本库中删除该文件,用命令git rm删掉,并且git commit
若删错了,版本库里还在,把误删的文件恢复到最新版本用git checkout。
*远程仓库
1. 创建SSH Key
ssh-keygen -t rsa -C "[email protected]",回车则会在用户主目录下自动创建.ssh目录,里面有id_rsa(私钥,不可泄露)和id_rsa.pub(公钥,可放心告诉别人)两个文件。
2. 登陆GitHub=>settings =>SSHandGPGkeys=>newSSHKey(Key中粘贴id_rsa.pub文件内容)。
SSH Key用于GitHub通过公钥识别出你推送的提交确实是你推送的,而非冒充。允许你添加多个Key。假定你有若干电脑,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
添加远程库:本地创建了一个Git仓库后,在GitHub创建一个Git仓库,让这两个仓库进行远程同步,这样,GitHub上的仓库既可作为备份,又可让其他人通过该仓库来协作,一举多得。首先在GitHub上创建一个新仓库,可从这个仓库克隆出新仓库,也可把一个本地仓库与之关联,然后把本地仓库的内容推送到GitHub仓库。
关联:git remote add origin [email protected]:Jane-ZhangJing/learngit.git
推送:git push -u origin master
把当前分支master推送到远程,第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
本地提交了,可用命令git push origin master把本地master分支最新修改推送至GitHub
SSH警告:第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告
从远程库克隆:远程库=>git clone [email protected]:Jane-ZhangJing/gitskills.git克隆本地库
*分支管理
分支的作用:既可以保存自己的代码由不影响别人工作。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
1. 创建与合并分支:
git checkout -b dev:等同于git branch dev+git checkout dev创建并切换新分支dev。
git branch:查看当前分支。
git merge dev:合并指定分支到当前分支,dev中做更改提交后,回到主分支进行分支合并。
git branch -d dev:合并完成后就可以放心地删除dev分支了
2. 解决冲突