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即可退出

  

远程分支操作

posted @ 2017-11-08 22:30  咔嚓咔嚓卡擦  阅读(228)  评论(0编辑  收藏  举报