重点 (二十) : 源代码:git

简介

什么是git?

git是一款开源的分布式版本控制工具

在世界上所有的分布式版本控制工具中,git是最快、最简单、最流行的

git的起源

作者是Linux之父:Linus
Benedict Torvalds

当初开发git仅仅是为了辅助Linux内核的开发(管理源代码)

git的现状

在国外已经非常普及,国内并未普及(在慢慢普及)

越来越多的开源项目已经转移到git

其他版本控制工具

CVS

最早的开源、免费的集中式版本控制工具

自身设计有问题,会造成提交文件不完整,版本库莫名其妙损坏的情况

SVN

修正了CVS的一些稳定性问题,是目前用得最多的集中式版本库控制工具

ClearCase

收费的集中式版本控制工具,安装比Windows还大,运行比蜗?;孤?/p>

能用ClearCase的一般是世界500强,他们有个共同的特点是财大气粗或者人傻钱多

VSS

微软的集中式版本控制工具,集成在Visual Studio中

由于它反人类的设计,连微软自己都不好意思用了

1.png

2.png

git和SVN的简单对比

速度

在很多情况下,git的速度远远比SVN快

结构

SVN是集中式管理,git是分布式管理

其他

SVN使用分支比较笨拙,git可以轻松拥有无限个分支

SVN必须联网才能正常工作,git支持本地版本控制工作

旧版本的SVN会在每一个目录置放一个.svn,git只会在根目录拥有一个.git

3.png

4.png

使用git
跟SVN一样,你可以通过命令行敲指令或者图形界面客户端使用git

在Mac上,比较好用的git图形界面客户端有
SourceTree
下载地址:http://www.sourcetreeapp.com/download/

GitHub
下载地址:https://mac.github.com
不过它是专门为GitHub网站而设计的

Xcode

5.png

git常用指令

git help :git指令帮助手册

查看其他指令的做法:git help 其他指令

git config :git的配置信息相关(修改的是.git/config文件)

配置用户名:git config “user.name”用户名(用于跟踪修改记录)

配置邮箱:git config “user.email”邮箱(用于多人开发间的沟通)

查看配置信息:git config –l

编辑配置信息:git config –e(用vim编辑,:wq是退出vim编辑器)

设置指令的别名:git config alias.别名 原指令名称

设置带参数指令的别名:git config alias.别名“原指令名称 参数”

将此设置应用到整个系统中:git config ––gloabal

git常用指令

git status :查文件的状态

查看某个文件的状态:git status 文件名

查看当前路径所有文件的状态:git status

git log :查看文件的修改日志

查看某个文件的修改日志:git log 文件名

查看当前路径所有文件的修改日志:git log

用一行的方式查看简单的日志信息:git log ––pretty=oneline

查看最近的N次修改:git log –N(N是一个整数)

git diff :查看文件最新改动的地方

查看某个文件的最新改动的地方:git diff 文件名

查看当前路径所有文件最新改动的地方:git diff

git常用指令

git init :初始化一个空的本地仓库,生成一个.git目录,用于维护版本信息

在当前路径初始化仓库:git init

在其他路径初始化仓库:git init 仓库路径

git add :将工作区的文件保存到暂缓区

保存某个文件到暂缓区:git add 文件名

保存当前路径的所有文件到暂缓区:git add .(注意,最后是一个点 . )

git commit :将暂缓区的文件提交到当前分支

提交某个文件到分支:git commit -m ”注释” 文件名

保存当前路径的所有文件到分支:git commit -m ”注释”

git reset :版本回退(建议加上––hard参数,git支持无限次后悔)

回退到上一个版本:git reset ––hard HEAD^

回退到上上一个版本:git reset ––hard HEAD^^

回退到上N个版本:git reset ––hard HEAD~N(N是一个整数)

回退到任意一个版本:git reset ––hard 版本号(版本号用7位即可)

git reflog :查看分支引用记录(能够查看所有的版本号)

git rm:删除文件(删完之后要进行commit操作,才能同步到版本库)

git clone:下载远程仓库到本地

下载远程仓库到当前路径:git clone 仓库的URL

下载远程仓库到特定路径:git clone 仓库的URL 存放仓库的路径

git pull:下载远程仓库的最新信息到本地仓库

git push:将本地的仓库信息推送到远程仓库

工作原理

如果想了解git的工作原理,有几个核心概念必须知道

工作区(Working Directory):仓库文件夹里除.git目录以外的内容

版本库(Repository):.git目录,用于存储记录版本信息

暂缓区(stage)

分支(master):git自动创建的第一个分支

HEAD指针:用于指向当前分支

git add和git commit的原理

git add :把文件修改添加到暂存区

git commit :把暂存区的所有内容提交到当前分支

远程仓库

如果是多人团队开发,最好还是搭建一个远程仓库

搭建远程仓库的途径

自己搭建一个git服务器:费时费力

在GitHub上托管项目:公开项目免费、私有项目收费,很多第三方开源项目

在oschina上托管项目:完全免费,在国内访问速度快(推荐使用)

1.png

2.png

搭建GitHub远程仓库 – 配置SSH Key


3.png

搭建GitHub远程仓库– 配置SSH Key

在Mac上生成SSH
Key(在终端输入下面指令)

cd
~/.ssh

ssh-keygen -t rsa -C "你的邮箱地址”

然后一直敲回车

然后就会在~/.ssh目录下生成SSK Key的秘钥对

id_rsa :私钥,不可泄露

id_rsa.pub :公钥,可以公开(将这个文件的内容粘贴到GitHub上)

利用cat指令可以查看文件的内容

cat id_rsa.pub

1.png

2.png

3.png

4.png

5.png

6.png

7.png

*******************笔记*********************


一. 掌握 - git 概述

  1. git 简介?
    1.什么是git?

git是一款开源的分布式版本控制工具
在世界上所有的分布式版本控制工具中,git是最快、最简单、最流行的

2.git的起源?

作者是Linux之父:Linus Benedict Torvalds
当初开发git仅仅是为了辅助Linux内核的开发(管理源代码)

3.git的现状?

在国外已经非常普及,国内并未普及(在慢慢普及)
越来越多的开源项目已经转移到git

  1. 常见的源代码管理工具有哪些?

CVS

  • 开启版本控制之门
  • 1990年诞生,“远古时代”的主流源代码管理工具

SVN

  • 全称是Subversion,集中式版本控制之王者
  • 是CVS的接班人,速度比CVS快,功能比CVS多且强大
  • 在国内软件企业中使用最为普遍(70%-90%)

ClearCase

  • 收费的集中式版本控制工具,安装比Windows还大,运行比蜗?;孤?/li>
  • 能用ClearCase的一般是世界500强,他们有个共同的特点是财大气粗或者人傻钱多

VSS

  • 微软的集中式版本控制工具,集成在Visual Studio中
  1. git 和 svn的简单对比

速度
在很多情况下,git的速度远远比SVN快

结构
SVN是集中式管理,git是分布式管理

其他
SVN使用分支比较笨拙,git可以轻松拥有无限个分支
SVN必须联网才能正常工作,git支持本地版本控制工作
旧版本的SVN会在每一个目录置放一个.svn,git只会在根目录拥有一个.git

  1. SVN工作流程和GIT工作流程对比
  • svn checkout —— git clone
    svn 只下载代码, git 会连同代码仓库一起下载下来

  • svn commit —— git commit
    svn 是提交到服务器,git 中是提交到本地仓库,需要使用push才能提交到服务器

  • svn update - git pull
    都是从服务器下载最新被修改的代码
    分布式和集中式最大的区别在于:在分布式下,本地有个代码仓库,开发者可以在本地提交; 而集中式版本控制, 只有在服务器才有一个代码仓库, 只能在服务器进行统一管理

  1. git工作原理
    1.概念理解
  • 工作区

与.git文件夹同级的其他文件夹或者子文件夹

  • 版本控制库

暂缓区
分支(Git不像SVN那样有主干和分支的概念. 仅仅存在分支,其中master分支为默认被创建的分支,类似于SVN中的主干)
切换分支:通过控制HEAD指针指向不同的分支,就可以切换*
操作原则: 所有新添加/删除/修改的文件 必须先添加到暂缓区,然后才能提交到HEAD指向的当前分支中

  1. git使用环境
    1.单人开发只需要一个本地库
    原因:不需要与他人共享代码,只负责管理自己代码即可;例如提交代码,删除代码,版本控制等等

2.多人开发时需要一个共享版本库
共享版本库的形式:
本地共享库:文件夹/U盘/硬盘
远程共享库:自己搭建git服务器/ 托管到第三方平台(例如github, oschina)

3.客户端使用环境 无论是单人开发还是多人开发,客户端都可以使用命令行或者图形界面使用git

SourceTree

GitHub

Xcode

  • 虽然集成较好,但是只能做一些常用的简单操作,复杂操作还要使用命令行
  1. 学习网站
    http://backlogtool.com/git-guide/cn/intro/intro1_1.html

二. 掌握 - Git命令行演练-个人开发

  1. 如何学习git指令

git help [子命令]
和学习SVN指令是一样的,只不过git是通过使用指南的形式展示给用户看(不能编辑的vim编辑器),使用q退出vim编辑器,按空格进入下一页,ctrl + B 回到上一页; /关键字 进行搜索

  1. 初始化一个本地仓库

原因: 管理本地代码,修改上传,版本回退
命令: git init

  1. 配置仓库

告诉git你是谁?(方便以后管理自己的代码)
原因: 追踪修改记录
命令: git config user.name “Edison”

告诉git怎样联系你?
原因: 多人合作开发时, 沟通交流
命令: git config user.email "shunzi@qq.com"

查看配置信息(.git -> config打开)
命令: git config -l
? 全局的配置:git config --global user.name edison
? git config --global user.email 350106106@qq.com

  1. 个人开发演练

创建文件并提交
命令:
touch main.c
git add .

git commit -m “注释”

修改文件并提交
命令:
git add .
git commit -m “注释”
删除文件并提交
命令:
git rm person.h
git commit -m “注释”
日志查看
命令:
git log
git reflog
版本回退

命令:
git reset —-hard HEAD 重置到当前版本
git reset —-hard HEAD^^ 重置到上上个版本
git reset ——hard HEAD~2 重置到往上2个版本
git reset —-hard 七位版本号 重置到指定版本::

  1. 备注补充
    1.文件状态(git status)

颜色含义
红色: 代表被添加或者修改的文件没有被添加到暂缓区
绿色: 代表文件在暂缓区,等待提交
版本号的含义
版本号是一个由SHA1生成的40位哈希值
这样做的目的是保证版本号的唯一

2.vim编辑器的使用:

8.png

命令模式:等待编辑命令输入;所有输入的内容都被当做命令来执行
插入模式:输入的所有内容都被显示,并被当做文件内容处理
命令行模式:执行待定命令(保存文件并退出vim : wq ; 强制退出不保存: q! )

3.日志查看配置
命令如下:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

4.配置别名
git config alias.st “status”
git config alias.ci “commit -m”

5.--global的作用
可以进行全局配置,所有的版本库共享此配置
查看全局配置(桌面前往->个人->.gitconfig
** 个人电脑上建议使用全局配置**

三. 掌握 - Git命令行演练-团队开发
团队开发必须有一个共享库,这样成员之间才可以进行协作开发

  1. 共享库分类

本地共享库(只能在本地面对面操作)

  • 电脑文件夹/U盘/移动硬盘

远程共享库(可通过网络远程操作)

  • 自己搭建Git服务器(不建议)
  • 在Github上托管项目(** 建议**)
    Github网址(https://github.com); 公开项目免费, 私有项目收费
  • 在OSChina上托管项目(** 推荐**)
    OSChina网址(https://git.oschina.net) 安全免费,在国内访问速度快
  1. 搭建本地共享库
    原因: 多人合作开发,代码共享
    命令: git init —-bare

  2. 经理初始化项目到本地共享库
    命令: git clone 本地代码仓库地址

  3. 演示多人开发

创建文件夹manager, niuda
命令:
mkdir manager
mkdir niuda
分别进入到两个文件夹从共享库clone项目到本地
命令:
git clone 本地代码仓库地址
git clone 本地代码仓库地址
演练新增文件同步
命令:
touch person.h
git add .
git commit -m “创建person.h”
git push
git pull
演练修改文件同步
命令:
git add .
git commit -m “注释”
git push
git pull
演练删除文件同步
命令:
git rm filename
git commit -m “注释”
git push
git pull
演练冲突解决
命令:
git pull

演练忽略文件
命令:
touch .gitignore
open .gitignore 加入忽略文件名
git add .
git commit -m “注释”
.gitignore文件配置规则
http://www.cnblogs.com/ha iq/archive/2012/12/26/2833746.html

  1. 备注笔记

关于忽略文件
在真实开发中,配置.gitignore文件 , 去github里面搜索gitignore 选择OC版本的,拷贝到本地仓库即可,记得添加到本地版本库

常见问题
fetch first 代表当前文件过期,需要从远程共享库更新
git pull

四. 掌握 - Git-XCode演练-团队开发

  1. 搭建本地共享版本库
    命令: git init —-bare

  2. 经理初始化项目到共享版本库
    ** 注意: 添加忽略文件, 不然Xcode有可能会把没必要的文件提交**
    ** 必须在使用Xcode之前把忽略文件添加进来, 因为Xcode创建工程时, 默认直接把所有文件添加到暂缓区, 加进去之后忽略文件对其就无效了**

  3. 牛大,牛二使用Xcode 克隆项目

  4. 演练添加文件同步

  5. 演练修改文件同步

  6. 演练删除文件同步

  7. 演练冲突

五. 了解 - github的使用

  1. 托管项目到github-HTTPS验证
    1.打开github网站:[https://www.github.com]
    2.注册账号(OneShunzi)
    3.点击创建新仓库[https://github.com/new]
    4.填入项目名称,描述等信息
    5.创建完成
    6.可根据生成的版本库地址进行克隆下来进行操作

  2. 托管项目到github-SSH验证
    1.点击”个人” -> setting -> SSH keys -> Add SSH key
    2.将生成的公钥添加进来即可.(以下是生成公钥私钥方法) [https://help.github.com/articles/generating-ssh-keys/]

  3. 怎样将其他著名框架添加到我们的代码仓库?
    1.搜索到对应的框架
    2.点击fork
    3.当项目被移到自己代码仓库中,就可以根据地址克隆下来进行操作

** 注意:
你可以针对此框架进行任意修改,但是仅仅作用在你的本地仓库中的副本,对原作者项目没有任何影响.
如果想向原作者提建议,可以直接使用,pull request操作.
提交完成后,原作者可以在pull request中看到你的提交.至于是否采纳,就是原作者的意愿搜索到对应的框架

六. 了解 - OSChina的使用

  1. 托管项目到OSChina
    1.打开oschina网站:[https://git.oschina.net]
    2.注册账号(OneShunzi)
    3.点击创建新仓库[https://git.oschina.net/projects/new]
    4.填入项目名称,描述等信息
    5.创建完成
    6.可根据生成的版本库地址进行克隆下来进行操作

  2. 怎样加入合作伙伴?
    1.点击”管理”->项目成员管理->选择成员权限进行创建
    2.或者直接只用SSH(以下是生成公钥私钥方法)

部署公钥允许以只读的方式访问项目,主要用于项目在生产服务器的部署上,免去HTTP方式每次操作都要输入密码和
普通SSH方式担心不小心修改项目代码的麻烦。
[https://help.github.com/articles/generating-ssh-keys/]

  1. 怎样将其他著名框架添加到我们的代码仓库?
    1.搜索到对应的框架
    2.点击fork
    3.当项目被移到自己代码仓库中,就可以根据地址克隆下来进行操作
    ** 注意:
    你可以针对此框架进行任意修改,但是仅仅作用在你的本地仓库中的副本,对原作者项目没有任何影响.
    如果想向原作者提建议,可以直接使用,pull request操作.
    提交完成后,原作者可以在pull request中看到你的提交.至于是否采纳,就是原作者的意愿

七. 了解 - 新人服务器搭建
1.新人服务器搭建概念原因?
概念: 搭建一个临时共享版本库, 供新人专用
原因: 防止新人刚到时,搞乱服务器上的项目
2.新建一个文件夹,newBee,作为新人服务器
3.进入文件夹 使用git init —-bare 初始化仓库
4.经理打开自己项目所在文件夹,执行PULL ,更新到最新
5.然后source control ->项目master -> configure 项目

选择Remotes 选项 代表当前所连的远程服务器地址
点击+号 添加 将newBee文件路径作为另外一个远程服务器地址 file:// 协议开头 结尾以/结尾
Done
6.经理将最新代码提交到新人远程仓库
7.经理分配新人服务器地址给新人
8.新人各种折腾
9.经理建立文件夹,从新人服务器下载代码检查
10.图解:

1.png

八. 了解- Git版本备份/分支管理

在git中不是通过拷贝代码来解决备份和开启分支的 git
直接打标签, 通过控制head指向,来回到任一版本

1.版本备份

1.建立共享库

创建文件夹shareWeibo

进入文件夹后,初始化共享库

git init ——bare

2.经理克隆项目后开发完1.0版本,打标签后,上传共享库

创建manager文件夹

进入文件夹后

git
clone 共享库绝对路径

进入工作区,配置姓名,邮箱

git config user.name
“manager”

git config user.email
manager@qq.com

经理创建文件,并修改部分代码,提交代码,上传到共享库,完成v1.0版本

touch main.c

open
main.c:: 打开后写入abc

git add .

git
commit -m “完成1.0版本开发”

git push

经理给此版本打标签,并将标签上传到共享库

git tag
-a v1.0 -m “标记1.0版本”

git push origin v1.0

经理继续开发2.0版本......并提交

git add .

git
commit -m “2.0部分功能”

git push

  1. 已发布版本bug修复

在以上步骤基础上做以下操作

1.牛大克隆项目,根据1.0版本创建分支,修复bug

创建niuda文件夹

进入文件夹后

git
clone 共享库绝对路径

进入工作区,配置姓名,邮箱

git config user.name
“niuda”

git config user.email
niuda@qq.com

根据v1.0版本建立新分支v1.0fixbug并切换到此分支

git checkout v1.0 -b
v1.0fixbug::

修复bug后提交到本地版本库

注意此处提交到的是HEAD指向的分支-v1.0fixbug

git add .

git
commit -m “修复bug”

2.牛大修复bug后,打标签v1.1作版本备份,并上传共享库

git tag
-a v1.1 -m “1.1版本备份”

git push origin v1.1

3.牛大上传整个分支到共享版本库

git push origin
v1.0fixbug

———至此,分支修复bug结束,下面经理要合并分支———

1.经理从共享库更新代码到本地库

git pull

2.经理查看当前服务器都有哪些分支

git branch -r

3.经理切换到master分支后,将v1.0fixbug分支合并过来

git checkout master

git
merge origin/v1.0fixbug -m “合并分支”

4.经理合并完成后提交到共享库

git add .

git
commit -m “合并分支”

git push

5.合并完成后,可以删除共享库的分支

git branch -r -d
origin/v1.0fixbug

6.查看版本标签,至此结束!!

git tag

最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,128评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,316评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,737评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,283评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,384评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,458评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,467评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,251评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,688评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,980评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,155评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,818评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,492评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,142评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,382评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,020评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,044评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,649评论 9 163
  • 今天是2016年2月22日,转眼间我已经毕业将近三年,换了三份工作,搬了四个地方,然而恋爱经历还是零,不知道从什么...
    静静Lee阅读 417评论 0 0
  • 楔子:每个人都有他的瓶子,有人在瓶子中央,有人贴着瓶壁,他们活着。哲学家生来是敲瓶子的人。然而,漂往冥河谁不需要个...
    崔钰懿阅读 552评论 0 2
  • 我们活在浩瀚的宇宙里,漫天飘洒的宇宙尘埃和星河光尘,我们是比这些更渺小的存在。 这是《小时代》里周崇光的经典语录。...
    山城里的夏菇凉阅读 229评论 0 0