Git小玩
早就听说了GitHub的强大. 一直没有机会去看, 在公司实习的几个月里也没机会接触SVN和Git,
可是抱着对Linus大神的崇敬, 和开源的崇敬之情.
趁着不忙的几天, 来学习一下Git. 希望以后可以用到.
事实上Git还是十分好学. 用不了多久, 你就能体会到它的高效简洁之美!
这里我是在本地虚拟机Centos来学习. . . 仅仅是学习他的简单原理和操作, 并没有真正的尝试项目.
同一时候借鉴了网上一些有经验的前辈们的理解.. 来自己操作和学习
非常多地方简单的样例我都有做图解,,做PPT真的好难阿!!!
而且花了两天时间来学习并编写这个小的文档.
希望能有所收获!
1. 介绍Git
一款免费, 开源, 高效的分布式版本号控制系统
https://git-scm.com官网下载 支持命令行和GUI
https://gitref.org 官方的帮助文档.
SVN和Git的主要差别:
SVN是集中式版本号控制系统。版本号库是集中放在中央server的,而干活的时候,用的都是自己的电脑。
所以首先要从中央server哪里得到最新的版本号,然后干活,干完后,须要把自己做完的活推送到中央server。
集中式版本号
Git是分布式版本号控制系统。那么它就没有中央server的,每一个人的电脑就是一个完整的版本号库,这样,工作的时候就不须要联网了,由于版本号都是在自己的电脑上。
既然每一个人的电脑都有一个完整的版本号库,那多个人怎样协作呢?比方说自己在电脑上改了文件A,其它人也在电脑上改了文件A。
这时,你们两之间仅仅需把各自的改动推送给对方,就能够互相看到对方的改动了。
2. 全局配置git
- 安装 : sudo apt-get install git
- 查看版本号: git --version
- 全局配置:
- git config --global user.name xxx
- git config --global user.email xxx
- git config --global color.ui true
配置username和邮箱是为了提交代码时的团队标识
git config --list 查看git全局配置
cat ~/.gitconfig 全局配置都保存在用户文件夹下这个.gitconfig隐藏文件里, 也能够vi编辑
能够通过下面命令获取git帮助
-- git help
能够通过下面命令获取特定某个指定的的帮助
-- git help 特定指令
能够查看仓库提交的历史记录
-- git log
3. 创建Repository
- 初始化一个新的Git仓库
git init : 初始化git文件夹环境(创建出新的空的repository) 并生成隐藏文件夹.git
.git(Git仓库文件, 全部相关的数据都保存在这儿)
- $ ls -A 查看到隐藏文件.git
- $ cd .git/
还有一种方式:
- git clone https://github.com/kennethreitz/requests.git
克隆网上的git项目,会自己主动创建repository
4. Git的对象类型
- Git中有四种基本对象类型,组成了Git更高级的数据结构:
● Blobs
每一个blob代表一个(版本号的)文件,blob仅仅包括文件的数据,而忽略文件的其它元数据。如名字、路径、格式等。
● trees
每一个tree代表了一个文件夹的信息。包括了此文件夹下的blobs。子文件夹(相应于子trees)。文件名称、路径等元数据。
因此。对于有子文件夹的文件夹。git相当于存储了嵌套的trees。
● commits
每一个commit记录了提交一个更新的全部元数据,如指向的tree,父commit。作者、提交者、提交日期、提交日志等。每次提交都指向一个tree对象,记录了当次提交时的文件夹信息。
一个commit能够有多个(至少一个)父commits。
● tags
tag用于给某个上述类型的对象指配一个便于开发人员记忆的名字, 通经常使用于某次commit。
5. 提交及加入文件
git status --查看git repository的状态
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
Untracked files: 没有登记的文件
a).加入
git add hello.py命令进行加入
b).提交
git commit -m ‘init commit’
(不加-m会默认打开vi, ‘ ’里面是操作的描写叙述,这里的init commit表示首次提交,)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
能够直接提交到仓库(不暂存)
git commit -a -m (或-am) “modify hello.txt”
注意:
1.事实上不是在暂存区不存, 而是帮我们跳过(git add暂存区)这一步骤.
2.他不会自己主动提交 未追踪文件, 也就是新文件没有add过是不行的.
- 关于这三个文件状态及工作区域:
● History 也能够说 Git repository(git仓库):
终于确定的文件能保存到仓库, 成为一个新的版本号, 而且对他人可见
● Staging area (暂存区,Cache, Index):
暂存已经改动的文件
● Working directory(工作区):
编辑, 改动文件
6. 查看git状态
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
git status -s 列出简要状态信息
文件前面有两个flag. 第一个是Staging area, 第二个是Working directory
再次vi hello.py后查看状态:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
出现两个M, 第一个M表示Staging area里的文件发生变化, 第二个M表示Working directory发生了变化.
两个区全然一致, 标志位就是空白, 有发生变化导致不一致, 标志位就是M
再次进行commit, 三个区全然一致. 两个标志位都为空
7. 查看文件区别
git diff 是查看第二个flag(也就是Staging area和Working directory) 详细变化信息的命令
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
在modify操作后能够用:
git diff --staged 能够查看第一个flag(也就是Staging arae和History 之间的变化), 产生同样的效果
git diff HEAD 能够看History 和 Working 之间的变化
git diff --stat 后面加stat能够简化变化信息
8. 撤销误操作
9. 移除及重命名文件
-删除文件
1.系统级别删除
rm filename
2.从git中删除文件
git rm filename
3.提交操作
git commit -m “delete filename”
注意: 仅仅是删除当前版本号中的文件, 文件依旧被记录在Git仓库历史中
git rm --cached filename , 删除Staking arae中的文件, 文件还存在Working directory中, 能够通过git add 或 git reset 恢复
- 重命名文件
git mv xxx new xxx
git commit -m “rename xxx”
重命名相当于运行了下面三条命令:
1. mv xxx newxxx (先系统级别上改名mv)
2. git rm xxx
3. git add newxxx
10. 暂存工作区
假如出现这样的情况(MM), 工作区改动完(改动1)后add到暂存区, 还未commit到仓库中, 此时发现一个遗漏或紧急情况, 须要在工作区中在改动1之前做改动(改动2), 可是又不想放弃改动1, 此时能够暂存工作区后进行改动.
git stash 暂存工作区
此时就回到了改动一之前的现场, 此时能够做自己的代码修复vi
- git commit -am ‘quick fix’
改动完后就能够提交这个紧急修复
- git stash list 查看暂存工作区的列表
能够看到一个
- git stash pop 弹出这个现场
然后在进行add和commit后, 改动1和改动2的作用就同一时候生效了.
11. 图解commit对象
为了理解HEAD,commit,和commit下对象之间的结构关系, 我们用图来理解:
以下实际来看一下
git log 后, 出现近期的操作日志例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
每一个commit后面都有一个哈希码来唯一标识这个commit.
HEAD默认指向第一个commit
- git cat-file -t : show object type
- git cat-file -p: print object’s content
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
当然, 用commit 前的哈希值也能够看到这个对象.
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
这里就能够看到前面commit图解中的信息
找到这个commit对象了, 我们再来看看这个对象中的tree里面有什么.
也能够继续追踪下去. 这样你就能够自由的找到commit对象里面的全部内容.
12. 理解tree-ish表达式
在.git文件里有一个HEAD
- # cat HEAD
- # ref: refs/heads/master
我们查看这儿
- # cat refs/heads/master
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
- # git log --oneline
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
能够看到, 这个master分支就指向的是最新的commit
- git rev-parse HEAD
能够看到, 这里HEAD和master的终于指向是一致的, 都是commit.
-- git show 和 git cat -file -p类似, 能更简便的看到content
假设要定位到commit下的tree. 能够用tree-ish表达式
- HEAD ~3^{tree}
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
假设要定位到tree下的hello.py, 不用先定位到tree. 也能够用表达式
- HEAD~3:
tree-ish表达式的引入, 让我们更方便的定位到随意一个对象和文件
13. 创建及删除分支
- 查看分支:
- # git branch
- * master
- 新建一个分支:
- # git branch newBranch
- #git branch
- * master
- newBranch
- 切换分支:
- # git checkout newBranch
- 创建分支和切换分支能够合并一步进行:
- # git checkout -b newBranch
- 删除分支
- # git branch -d newBranch
注意: 切换分支实际就是把head指向了不同的branch
cd heads文件夹, 就会发现有两个分支,master和newBranch
他们都指向一个commit
14. 合并分支(上)
这里我们介绍合并分支的做法, 和两种合并机制
我们在新创建的分支newBranch中进行代码的升级(hello.py)提交后,
再删除newBranch, 会出现一个error.
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
这是由于newBranch原本指向的呢个新commit, 删除后, 这个新commit就没有被指向了. 如图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
所以应该须要在删除newBranch之前让master指向新commit. 也就是进行分支合并, 合并后的效果如图:
使用git merge newBranch
然后就能够删除newBranch了
这样的合并机制叫Fast-forword
15. 合并分支(下)
假设出现这样的情况: 在两个分支都出现了代码的改动
两个分支master和bugFix
在bugFix分支上做了两次fix (fix1和fix2) 并提交
然后切换到master分支, 做一次Modify.
进行git merge bugFix后, 两个分支的操作都被合并了
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
可是此时的合并方式就不是Fast-forwrd那么简单了. 而是还有一种机制3-way merge
它的合并原理例如以下:
1. 先找到两个分支的共同分支对象
2. 将fix code2和B进行比对, 形成对照信息.
3. 然后将对照信息加入应用到Modify code上. 形成新的对象NEW.
master又一次指向NEW. 分支合并完成!
16. Git远程仓库
远程仓库的实现:
1. 使用现有的Git网络仓库服务
Github: https://github.com (创建开源免费哦)
Bitbucket: https://bitbucket.org
2. 搭建自己的Git仓库server
Git小玩的更多相关文章
- 【原】小玩node+express爬虫-2
上周写了一个node+experss的爬虫小入门.今天继续来学习一下,写一个爬虫2.0版本. 这次我们不再爬博客园了,咋玩点新的,爬爬电影天堂.因为每个周末都会在电影天堂下载一部电影来看看. talk ...
- hugo小玩
hugo小玩 1. 安装 install from source by brew install pre-built-binary 2. 下载源码 $ go get github.com/magefi ...
- Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具
前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...
- Git 小技巧
分享git的几个小技巧,后面会根据使用补充.目前包括git撤销本地修改.git回退到前n个版本.git多用户提交冲突解决.git 命令简化.欢迎大家补充^_* 1.git撤销本地修改 git rese ...
- git小技巧--提取/合并某分支的部分文件
软件开发基本都是多个feature分支并行开发,而在上线前有可能某个分支的开发或测试还没有完成,又或者是产品调整,取消了该分支功能的上线计划,我们在release前不合并该分支即可,然而如果该分支中的 ...
- Git 小课堂 004
rebase--变基,就是这个可能会把事情搞得一团糟的操作. 对于变基,我只能说,需要一个配合默契的团队,你们心灵想通,互相了解,然后你们会做出非常漂亮的事情.对于使用变基且几乎不会出问题的团队,我一 ...
- Git 小课堂 002——别名
昨天我们聊了聊 Git 的文件存储,今天我们聊聊 Git 的别名.不知道你是不是熟悉别名,如果你经常使用命令行做一些事情,有一些复杂的命令,或者是一些简单的操作,往往用一些别名方法就很方便很容易,下面 ...
- 【原】小玩node+express爬虫-1
最近开始重新学习node.js,之前学的都忘了.所以准备重新学一下,那么,先从一个简单的爬虫开始吧. 什么是爬虫 百度百科的解释: 爬虫即网络爬虫,是一种自动获取网页内容的程序.是搜索引擎的重要组成部 ...
- git小操作之checkout、stash
git checkout会带上当前changed但没有commit的内容到目标分支 git stash用来暂存当前改动,并且会退代码到上一个commit:git stash pop则取出所stash的 ...
随机推荐
- caffe+Ubuntu14.04.10 +cuda7.0/7.5+CuDNNv4 安装
特别说明: Caffe 官网地址:http://caffe.berkeleyvision.org/ 本文为作者亲自实验完成,但仅限用于学术交流使用,使用本指南造成的任何不良后果由使用者自行承担,与本文 ...
- python 读取文件夹下的图片进行处理
python的os模块中有一个listdir函数可以遍历读取文件夹下的文件. import os for filename in os.listdir(r"./file"): #l ...
- T-SQL获取同类型数据不足补全的方法
业务规则:如果有本地区的招聘会,显示本地区,如果没有本地区的招聘会,显示最近一场. 一条SQL搞定: [userId],[meetsName],[provinceId], [province],[ci ...
- 程序员编写API遵循法则
Api理解: 1.遵循函数.数据库字段命名规则 2.思考项目的远景(扩展性) 3.思考团队调用是否方便及舒服 4.思考是否有灵动性
- (一) Spring基础概述
1.历史 第一阶段:xml配置 在Spring1.x时代,使用Spring开发满眼都是xml配置的Bean,随着项目的扩大,我们需要把xml配置文件分布放到不同配置文件中,需要频繁的在开发的类和配置文 ...
- css3动画、边框、投影知识
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- synchronous interrupt and asynchronous interrupt
Asynchronous interrupt 中斷请求信号来自CM3内核的外面,来自各种片上外设和外扩的外设,对CM3来说是"异步"的: e.g. usb otg device S ...
- 九、 Java程序初始化的顺序(二)
之前的一篇博客里我写了关于在一个类中的程序初始化顺序,但是在Java的面向对象里,类之间还存在着继承的关系.所以关于程序的初始化顺序,我们可以再细划分为:父类静态变量,父类的静态代码块,父类构造器,父 ...
- [SaltStack] 基础介绍
今天有时间把以前研究过的saltstack梳理总结下 -:) salt是干什么的我就不多说了, 大家Google下资料很多的, 简单来说就是func+puppet: 配置文件管理 远程命令调用 Cro ...
- 使用p6spy格式化日志输出
P6Spy 是针对数据库访问操作的动态监测框架(为开源项目,项目首 页:www.p6spy.com)它使得数据库数据可无缝截取和操纵,而不必对现有应用程序的代码作任何修改.P6Spy 分发包包括P6L ...