注:该笔记完全是个人在学习《廖雪峰的git教程》中自己总结的笔记,其中肯定会有不少错误,请读者朋友们斧正,感谢!!
廖旭峰的官网:
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
Git版本控制:
本质:对仓库中的文件阶段性修改的记录(即版本库)
----------若在仓库中创建一个空目录时,git是不能察觉他的存在的
svn与git:
一般:
svn 集中式的版本控制系统,有一个中央服务器,有网才能工作
git 分布式的版本控制系统,任何一个节点都可以当作中央服务器,断网也可以工作
反思:
开始以为svn真的只有在有网的情况下才能工作,但是很多人说断网也可以工作,不能人云亦云,大量查看评论
总结:
所谓的svn只能在有网的情况下可以工作,不是说不能进行开发,修改文件操作,而是指不能提交版本操作(即只有中央服务器维护一套版本库),其他节点主机只能向中央服务器提出commit请求,由中央服务器来执行。而git是每个节点主机都拥有一个完整的版本库,可以在本地断网的情况下随意commit,所有的历史版本都会记录在本地,最后使用push向远程服务器提交自己的文件及版本库
svn与git的区别:
svn:必须有中央服务器 (记录版本库)
git:可以没有中央服务器(本地维护版本库,中央服务器只是用来方便交流)
所谓不能工作,特指版本提交:
=====================================================
GIt使用
注:该笔记不太适合完全的小白,是自己学习的一个记录;若想从0开始建议移步《廖雪峰的git教程》
(所有操作均在linux下进行)
1.安装git:
sudo apt-get install git (ubuntu)
yum install git (redhat/centos)
2.配置git:
git config --global user.name 'yourname'
git config --global user.email 'email@example.com'
--global 表示全局设置,这台主机的所有git仓库都使用该配置
3.git仓库初尝试:
mkdir learngit
cd learngit
git init
vi a.txt
git add a.txt
git commit -m 'add a new file a.txt'
创建了一个learngit目录,将该目录初始化为了git仓库(repository),并添加了一个a.txt并提交到了版本库中
图解:
【版本一:】
gitModel.png
【版本二:修正版】
git_2.png
git init (将learngit初始化为git仓库)
git add a.txt (将工作区中的a.txt添加到暂存区中)
git commit -m 'add a.txt' (将暂存区中的a.txt提交到版本库)
git reset HEAD a.txt (将暂存区中的a.txt清除)
git checkout -- a.txt (将工作区中的a.txt回退)
git diff a.txt (对比工作区与缓存区中的a.txt)
git diff --cached a.txt (对比暂存区与版本库中的a.txt)
git diff HEAD -- a.txt (对比工作区与版本库中的a.txt)
git status (查看整个仓库的状态)
git log (查看版本的信息)
git log --pretty=oneline (单行显示版本库)
gti reset --hard <commitid>(切换到具体的提交commit)
git reflog (查看git命令记录)
==============================================
要点:
1.在Git中,用HEAD表示当前版本,上一个版本就是HEAD^ ,上上一个版本就是HEAD^^ ,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100
=============================================
FAQ:将廖大的官网中网友们的一些经典问题搜集:
Q1:本地版本回滚了,然后想让远端的版本也回滚。
远程和本地的版本库位:a->b->c
通过git reset --hard b.id 本地:a->b push到远程 a->b
但是会出问题
A1:
假设一开始你的本地和远程都是:
a -> b -> c
你想把HEAD回退到b,那么在本地就变成了:
a -> b
这个时候,如果没有远程库,你就接着怎么操作都行,比如:
a -> b -> d
但是在有远程库的情况下,你push会失败,因为远程库是 a->b->c,你的是 a->b->d
两种方案:
1.push的时候用--force,强制把远程库变成a -> b -> d,大部分公司严禁这么干,会被别人揍一顿
做一个反向操作,把自己本地变成a -> b -> c -> d,
注意b和d文件快照内容一莫一样,但是commit id肯定不同,
再push上去远程也会变成 a -> b -> c -> d
简单地说就是你无法容易地抹去远程库的提交信息,所以本地提交怎么都行,push前想好了
2.使用 git revert <commit_id>操作实现以退为进,
git revert 不同于 git reset 它不会擦除"回退"之后的 commit_id ,
而是正常的当做一次"commit",产生一次新的操作记录,所以可以push,不会让你再pull
网友评论