git学习笔记
关于集中式,分布式版本控制系统(了解)
1.集中式版本控制系统(CVS,SVN) 有一个中央服务器,干活的时候,用的都是自己的电脑,需要先从中央服务器获取最新的版本,然后开始干活,干完活了,再把自己的修改推动给中央服务器。 缺点:需要联网的情况下才能使用,上传速度慢。
2.分布式版本控制系统(最常见的Git) 分布式版本控制系统没有中央服务器,每个人的电脑上都用一个完整的版本库,只要交换对方的修改就行,把各自的修改推送给对方。分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。优点:安全性高,不需要联网
集中式:服务器挂了,所有库操作都完蛋了,更像http下载
分布式:互相之间拉来拉去,更像bt下载,有源就可以
版本管理系统
文件每一次提交,都会进行版本记录,可以把当前版本回退到历史当中的任意一个版本
我们了解下的版本管理控制系统,其实只能跟踪 文本文件 的改动,比如TXT文件,网页,所有的程序代码等等
git的功能
备份文件
记录历史
回到过去
多端共享
团队协作
开源协作
开始学习git
安装git命令行
注册github账号
用户设置:
打开命令行,设置用户名和邮箱(在github上注册的用户名和邮箱)
git config --global user.name "zfpx"
git config --global user.email "zfpx@126.com"
用git创建版本库
版本库又称仓库,repository,
打开命令行
在你的学习的目录中,右键git bash,打开命令行,
创建一个空目录
$ mkdir study-git
切换进去
$ cd study-git
初始化仓库
$ git init
```
初始化仓库,其实就是在你的目录下安装了一个.git的目录,这个目录是Git来跟踪管理版本库的,不要随意修改,更不能删掉,否则仓库就died了
.git目录默认是隐藏的,用ls -al命令就可以看见。
```
工作流
本地仓库的组成:
第一个是工作区,对应你的物理目录,树型结构,也就是编辑代码的地方,写代码的地方;
第二个是 暂存区,工作区和历史提交的中间缓存,代表需要提交的工作状态,维护虚拟树型结构,临时保存你的改动;
最后是 历史区,树型结构,历史仓库,指向你最近一次提交后的结果。
添加就是工作区到暂存区,提交就是暂存区到历史区
文件的写入到提交
window的可视化操作,你需要经历一些列点击,点击,点击,双击的操作,不免有些繁琐,体验一下git命令的方便。
上面我们新建并初始化了一个仓库,我们现在在库里面新建文件
新建一个html文件
$ touch index.html
写入一句话
$ echo study git > index.html //清空index.html并写入
再写入一句话
$ echo again study git >> index.html //追加"again study git"
查看文件的内容
$ cat index.html
会看到输出:
study git
again study git
现在文件在工作区,把文件添加到暂存区
$ git add index.html
提交文件
$ git commit index.html -m '我写了study git'
表示提交index.html文件, -m后面为这次提交的描述信息,
在这里如果你没有 -m '' 那么会跳到一个很奇怪的页面,不过没事,它只是让你补充一下提示信息,在你开始编辑之前,按a,i,o其中一个键进入编辑模式,完成后esc退出编辑模式,
输引号内的命令,就可以保存退出,
":wq"
理解这个过程:
git add把文件添加进去,实际上就是把文件修改添加到暂存区,看清是文件修改;
接下来是用git commit提交更改,实际上就是把暂存区的所有内容提交到版本库中的历史区中,在这个历史区中,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往历史区的master分支上提交更改。
你可以尝试再次添加内容到index.html
$ echo 222 >> index.html
然后检查状态
git status
提示:index.html被修改了,让你添加到暂存区以提交,因为它和暂存区的状态不一样了,所以他会提示你
你可以再次添加
$ git add index.html
修改被放到暂存区,然后需要你用commit提交
$ git commit index.html -m '我修改了index.html'
所以,git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
一旦提交后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的:
比较版本差异和查看版本库状态
修改html文件如下
echo diff >> index.html
git diff可以查看修改的内容
git diff
每次清楚index.html作了什么修改后,再把它提交到仓库,提交修改和提交新文件是一样的两步,git add和git commit:
$ git add index.html
$ git commit -m "add diff"
注意
要随时掌握工作区的状态,使用git status命令。
如果git status告诉你有文件被修改过,用git diff可以查看修改内容。
现在可以查看一下历史记录
git log
记录目录按照先后顺序排列,第一列为最新提交版本,第二列次之,以此类推。
版本回退
当你误删了文件,可以回到上一个提交的版本
git log命令查看历史记录
commit 5078bca90fce4a84846fc2adebd550b74dab8576 (HEAD -> master)
Author: LuYuanGit <18392709319@163.com>
Date: Wed Nov 8 21:46:05 2017 +0800
second commit
commit 7a2b6bf0429031b4f901c8fb0c25c93ad6e845df
Author: LuYuanGit <18392709319@163.com>
Date: Wed Nov 8 21:38:28 2017 +0800
first commit
commit是这个版本的id,找回版本就靠它
太乱,看不清?
$ git log --oneline
5078bca (HEAD -> master) second commit
7a2b6bf first commit
返回上一个版本
$ git reset --hard HEAD^
这里HEAD相当于是指针,指向了上一次的commit id,你也可以直接写上commit id 写上前7位,如下
$ git reset --hard 5078bca
提示:HEAD is now at 5078bca second commit
(如果要直接推送:git push -f origin master)
然后查看一下当前目录文件
$ ls
index.html又回来了
cat index.html
内容都在,高兴。
Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向对应版本的commit id
git reset扩展
git reset –mixed:此为默认方式,它回退到某个版本, 工作区不变,回退历史区 和 暂存区
git reset –soft:回退到某个版本,只回退了历史区的信息,工作区 和 暂存区 都不变
git reset –hard:彻底回退到某个版本,回退 工作区 、历史区 和 暂存区 。
撤销修改
修改完后,在git status时,会提示你(use "git checkout -- <file>..." to discard changes in working directory)这句话,
那么就可以
git checkout -- index.html
把index.html文件在工作区的修改全部撤销,
即时你git add index.html 添加到了暂存区,没关系,照样可以撤销
git status会提示(use "git reset HEAD <file>..." to unstage)
那么
$ git reset HEAD index.html
Unstaged changes after reset:
M index.html
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
删除文件
$ rm index.html
有两种情况:
我误删了
但暂存区里还有呢,所以可以很轻松地把误删的文件从暂存区恢复到工作区:
$ git checkout -- index.js
确实要删除,那就确认删除,并提交
$ git rm index.js
$ git commit -m "delete index.js"
分支(继续补充)
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
放弃这次合并: git merge --abort
合并分支时发生冲突并处理:
1.新建dev分支,修改内容,添加提交,
2.切换到主分支,再次修改内容,添加提交
3.git merge dev 合并dev到mater,这里会有错误
4.git merge --abort 放弃合并,或者,vim <file> 删掉冲突的地方,保留你需要的,保存退出,
5.再次添加提交
隐藏工作台(继续补充)
用git stash“储藏”起来
$ git stash
用git stash pop,恢复
git stash pop
把别人的库上传到自己的github上
克隆到本地:git clone <别人的仓库地址>
切到文件夹中:cd <file>
查看仓库的源是谁:git remote -v
删除仓库的源:git remote remove origin
再次查看仓库的源:git remote -v
把仓库的源改为自己的git仓库:git remote add origin <自己的git仓库地址>
推送到远程仓库:git push -u origin master
推送本地分支到远程
git push origin serverfix:serverfix # 或者 git push origin serverfix
意思是上传我本地的 serverfix 分支到远程仓库中去,仍旧称它为 serverfix 分支
检查内容变化 & 退出
# fileName就是文件名称 git diff fileName
按q即可退出