关闭

GIT

114人阅读 评论(0) 收藏 举报
分类:

Git 在保存和处理各种信息的时候,虽然操作起来的命令形式非常相近,但它与其他版本控制系统的做法颇为不同。

理解这些差异将有助于你准确地使用 Git 提供的各种工具。


直接记录快照,而非差异比较:

Git 只关心文件数据的整体是否发生变化而大多数其他系统则只关心文件内容的具体差异。


近乎所有的操作都是本地执行:

在 Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网


时刻保持数据完整性:

在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git 一无所知。


多数操作仅添加数据:

常用的 Git 操作大多仅仅是把数据添加到数据库在 Git 里,一旦提交快照之后就完全不用担心丢失数据,特别是养成定期推送到其他仓库的习惯的话。


文件的三种状态:

对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged)。已提交表示该文件已经被安全地保存在本地数据库中了;已修改表示修改了某个文件,但还没有提交保存;已暂存表示把已修改的文件放在下次提交时要保存的清单中。


手把手教你使用Git:

http://www.open-open.com/lib/view/open1414396787325.html


使用GitHub:

http://jingyan.baidu.com/article/f7ff0bfc7181492e27bb1360.html





学习态度
* 谦虚
* 严谨
* 勤思
* 善问
学习方法
只听不练肯定学不会Linux,每个知识点都需要去动手实践
目录
前言 i
目录 iii
1 什么是git 1
1.1 git 安装 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
2 git核心原理 3
3 git常用命令 5
4 github协作开发 7
4.1 什么是github . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4.2 创建帐号 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.3 创建项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.4 linux终端配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.4.1 配置环境 . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.4.2 ssh配置 . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4.5 第一个项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.5.1 新建空项目 . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.5.2 把一个已经存在的git管理的项目放到github上托管 . . . . . . . . 12
4.5.3 下载项目 . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.5.4 分支 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.5.5 tag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.5.6 HEAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.5.7 忽略监控文件 . . . . . . . . . . . . . . . . . . . . . . . . 13
4.6 代码协作管理 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.7 关注开源项目 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
5 git服务器协作开发 15
5.1 gitolite服务器安装 . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.2 添加管理员用户 . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.3 生成管理员ssh-key . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.4 管理gitolite . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.5 开发者 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.6 管理者 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.7 带签名的里程碑 . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
6 git服务器分发 19
7 实例场景处理速查 21
7.1 一个管理员三个开发者 . . . . . . . . . . . . . . . . . . . . . . . . 21
7.1.1 管理员的git工作 . . . . . . . . . . . . . . . . . . . . . . . 21
7.1.2 按照分支各自开发自己的,然后再合并 . . . . . . . . . . . . . 21
7.1.3 开发者的git工作 . . . . . . . . . . . . . . . . . . . . . . . 21
7.2 自己的项目,多台电脑 . . . . . . . . . . . . . . . . . . . . . . . . 21
7.3 为github开源项目提交代码 . . . . . . . . . . . . . . . . . . . . . . 21
7.3.1 pull requests . . . . . . . . . . . . . . . . . . . . . . . . 21
7.3.2 给其他人增加项目的写权限deploy key . . . . . . . . . . . . . 21
第 1 章
什么是git
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项
目。 Git的读音为/gɪt/。
Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目
版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码
的版本控制软件。
Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前
一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得
BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更
为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我
们已经发现在很多其他自由软件项目中也使用了 Git。例如 最近就迁移到 Git 上来了,很
多 Freedesktop 的项目也迁移到了 Git 上.
分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者机器上都是一
个完整的数据库。
从一般开发者的角度来看,git有以下功能:
1、从服务器上克隆数据库(包括代码和版本信息)到单机上。
2、在自己的机器上创建分支,修改代码。
3、在单机上自己创建的分支上提交代码。
4、在单机上合并分支。
5、新建一个分支,把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
6、生成补丁(patch),把补丁发送给主开发者。
7、看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要
求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
8、一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交
补丁。
从主开发者的角度(假设主开发者不用开发代码)看,git有以下功能:
1、查看邮件或者通过其它方式查看一般开发者的提交状态。
2、打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决
定哪些补丁有用,哪些不用)。
3、向公共服务器提交结果,然后通知所有开发人员。
2 第1章 什么是git
优点:
适合分布式开发,强调个体。
公共服务器压力和数据量都不会太大。
速度快、灵活。
任意两个开发者之间可以很容易的解决冲突。
离线工作。
缺点:
资料少(起码中文资料很少)。
学习周期相对而言比较长。
不符合常规思维。
代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
1.1 git 安装
ubuntu下: sudo apt-get install git 源码安装
图 1.1: git安装
第 2 章
git核心原理
图 2.1: git工作区暂存区版本库
第 3 章
git常用命令
工作区 暂存区 版本库
git add
添加提交任务到暂存区
git commit -m "commit info"
添加提交任务到版本库
git log
查看提交记录
git diff
查看工作区和暂存区的差异
git diff --cached
查看暂存区和版本库的差异
git diff HEAD
查看工作区和版本库的差异
git status -s
简短输出,第一个M表示暂存区和版本库内容不一致;第二个M表示工作区和暂存区内容不一致
git checkout -- file.txt
把暂存区的file.txt文件恢复到工作区,覆盖工作区之前的修改。checkout命令主要是把历史某个版本检出到工作
区。慎用
git reset HEAD
暂存区的目录树被版本库里的内容重置,但是工作区不受影响。放弃之前git add的提交。
git reset --hard SHA1号/HEAD
工作区和暂存区的目录树被版本库里的内容重置。放弃之前git add和个git commit的提交。
git rm file.txt
删除文件
git blame file.txt
查看文件提交历史信息,方便定位bug
git show-ref
查看所包含的引用
git merge
进行合并操作
git push -u origin master
向远程版本库origin的master分支提交
git pull
把远程版本库的master分支拉到本地,数据同步服务器端
git tag -m "my first tag" mytagv1.0
制作里程碑
git cat-file tag mytagv1.0
查看mytagv1.0提交信息
git tag -l -n1
6 第3章 git常用命令
查看所有tag,n1显示一行信息
git tag -d mytagv1.0
删除tag
git branch newbranch
创建分支
git checkout newbranch
切换到newbranch分支
git branch -d newbranch
删除分支,如没合并,则失败
git branch -D newbranch
强制删除分支
git push origin :newbranch
先删除本地分支,再删除远程版本库对应分支
git show-ref
查看本地引用
git checkout -b hello-1 origin/hello-1
创建跟踪远程分支的本地分支,随后可以pull和push远程分支
git remote add new-remote file:///path/hello-1.git
创建远程版本库
git remote -v
查看远程版本库
第 4 章
github协作开发
4.1 什么是github
GitHub(网址 https://github.com/)是一个面向开源及私有软件项目的托管平台,
因为只支持Git作为唯一的版本库格式进行托管,故名GitHub。 GitHub的注册用户已
经超过百万,托管的版本库数量已超三百万,其中不乏知名的开源项目,如:Ruby on
Rails、Hibernate、phpBB、jQuery、Prototype、Homebrew等。
对于一个开源项目,从开发角度讲大体上分为两类人群,一类称为核心开发团队,他们
可以向保存源代码的版本库提交,即对源代码的修改具有最终的决定权。另外一类称为贡献
者,他们不属于核心开发团队,虽然也能看到源代码,但无权向版本库提交修改。
图 4.1: github合作模式
使用Git做版本控制(如图1-3所示),核心开发团队非常“高兴”,因为他们和共享版
本库之间不必一直保持连接状态,诸如查看日志、提交、创建分支等几乎全部操作都(脱
离网络)在本地的版本库中完成。项目贡献者(非核心成员)也不再那么沮丧,因为版本
库人人皆可更改(当然是对本地版本库而言)。稍微让贡献者感到困难的就是如何将自
己对项目的改进被核心开发团队所了解并接纳。Git提供了多种途径,一个方法是先用git
format-patch命令将本地提交转换为补丁文件或补丁文件序列,再通过邮件发送给核心开
发团队。另外一个办法就是搭建一个自己专有的共享版本库,通过邮件创建一个拉拽请求
(Pull Request),让核心团队的开发者到自己的版本库来抓取(Pull)。 GitHub的出现
进一步推动了Git的普及,简化了版本控制的管理和操作流程。
使用GitHub,无论是项目的核心开发团队,还是普通的项目贡献者都工作得非常“愉
快”。创建项目变得非常轻松,创建者只需在GitHub上点击一下鼠标即可创建一个新版本
8 第4章 github协作开发
图 4.2: github协同模式
库,通过简单的Web操作即可完成项目授权进而组建项目核心团队。在GitHub中,非核心团
队成员参与项目也很容易。先找到自己希望参与的项目,然后只需在Web上点击一下鼠标即
可在自己的托管空间下创建一个派生(fork)的项目,并对派生项目的版本库具有读写的完
全权限,就好像这个项目原本就是由自己创立的那样。当贡献者完成开发并向自己派生的版
本库推送后,可以通过GitHub的Web界面向项目的核心开发团队发送一个Pull Request,请
求审核。项目的核心团队收到Pull Request后审核代码,审核通过后可以直接通过Web界面
执行合并操作接纳贡献者的提交。
github地址:
https://github.com
4.2 创建帐号
图 4.3: github帐号注册
4.3 创建项目
1.创建项目
2.下载项目
4.3节 创建项目 9
图 4.4: 开源项目分类
图 4.5: 创建项目
图 4.6: itcast项目
图 4.7: 创建好itcast项目
10 第4章 github协作开发
1. 网页下载zip文件
2. git clone https://github.com/xwpfullstack/itcast.git
4.4 linux终端配置
4.4.1 配置环境
设置系统全局用户
Global setup:
git config --global user.name "Your Name"
git config --global user.email xwp_fullstack@163.com
每个项目也可以单独在配置文件里设置用户
vim .git/config
查看环境配置
git config -l
删除全局配置
git config --unset --global user.name
git config --unset --global user.email
4.4.2 ssh配置
1.生成ssh-key,在终端下执行以下命令
itcast$ ssh-keygen
~/.ssh/id_rsa是私钥文件
~/.ssh/id_rsa.pub是公钥文件
2.把公钥上传到github上
配置好ssh公钥后,在终端下执行以下命令
4.5节 第一个项目 11
图 4.8: 添加ssh公钥1
图 4.9: 添加ssh公钥2
ssh -T git@github.com Hi gotgithub! You've successfully authenticated, but GitHub does not provide shell access. 出
现上述提示证明配置好ssh
3.ssh-key的作用
用户命令行下提交代码时不需要再输入账号和密码,默认https协议是需要输入的
修改项目中./git/config文件,把url换成 url = git@github.com:注册名/项目名.git
例如: url = git@github.com:xwpfullstack/test.git
4.5 第一个项目
4.5.1 新建空项目
先在github页面创建一个项目world
git clone https://github.com/xwpfullstack/world.git
cd world
echo "world"" >> README.md
git add README.md
12 第4章 github协作开发
git commit -m "first commit"
git remote add origin https://github.com/xwpfullstack/world.git
git push -u origin master
4.5.2 把一个已经存在的git管理的项目放到github上托管
git remote add origin https://github.com/xwpfullstack/world.git
git push -u origin master
4.5.3 下载项目
三种下载方式:
https协议下载
git clone https://github.com/username/test.git
Git-daemon协议下载
git clone git://github.com/username/test.git
打包下载
4.5.4 分支
分支
git branch -a
查看所有分支,含远程
git branch
查看本地分支
git branch -r
查看远程分支
git branch newbranch
创建新分支
git branch -d oldbranch
删除分支oldbranch
git push origin newbranch
把新分支同步到远程仓库
git push origin :oldbranch
删除远程oldbranch分支
git checkout -b newbranch
切换到另一分支,如果不存在则创建
git checkout branch
切换到另一分支
git clone新项目时
无论当前项目在什么分支,都是下载默认master分支
git checkout master
git merge anthorbranch
git push origin master
4.5节 第一个项目 13
合并开发分支到master分支
git pull尽量少使用,隐含了合并信息
get featch 下载远程origin/master更新
git diff master origin/master
查看本地和远程库的区别
get merge origin/master
合并远端更新到本地
4.5.5 tag
tag
git tag v1.0 -m "tag v1"
创建一个标签
git push origin --tags
把所有标签同步到远程库
git checkout v1.0
检出v1.0版本
git reset --hard v1.0
使代码重置,回到v1.0。此功能慎用,后开发的代码会丢失
git tag -d v1.0
删除标签v1.0
git push origin :v1.0
删除远程库里标签
git tag -l -n1
查看所有tag
4.5.6 HEAD
HEAD
指向当前提交点,游标指针
HEAD^ 上次提交点,父提交点
git checkout HEAD^
切换到上次提交点,不在分支
git reset --hard HEAD^
撤销本次提交,恢复到上次提交状态,新创建的文件会丢弃
4.5.7 忽略监控文件
.gitignore一般把.o和临时文件设置进去,忽略代码监控,如某项目.gitignore:
#过滤数据库文件、sln解决方案文件、配置文件
*.mdb
*.ldb
14 第4章 github协作开发
*.sln
*.config
#过滤文件夹Debug,Release,obj
Debug/
Release/
obj/
然后调用git add. ,执行 git commit即可。
问题:.gitignore只适用于尚未添加到git库的文件。如果已经添加了,则需用git rm
移除后再重新commit。
4.6 代码协作管理
4.7 关注开源项目
第 5 章
git服务器协作开发
5.1 gitolite服务器安装
安装环境我选择的是ubuntu14.04
sudo apt-get install openssh-server openssh-client -y
sudo apt-get install git -y
sudo apt-get install gitolite -y
sudo apt-get install git-daemon gitweb -y
5.2 添加管理员用户
sudo adduser --system --shell /bin/bash --group --disabled-password --home /home/gitolite gitolite
sudo su
password gitolite (为gitolite用户设置ssh密码)
5.3 生成管理员ssh-key
ssh-keygen -t rsa
可以设置默认保存路径
将你当前用户的ssh pub key复制到/tmp下备用(这种情况是本地安装的方式)
cp admin.pub /tmp/ubuntugege.pub
pwd
如果你是ssh远程登陆到服务器上安装,就要把你本地的key复制到远程的机器上
16 第5章 git服务器协作开发
scp ~/.ssh/admin.pub gitolite.server:/tmp/ubuntugege.pub
切换到gitolite用户环境中,以gitolite身份去初始化安装git服务器
gl-setup /tmp/ubuntugege.pub
出现配置界面,直接退出就可以了
这样在客户端~/.ssh/ 生成了一个admin.pub 和一个admin, 把admin.pub传到服务器
端,服务器端用gl-setup来装gitolite。当服务器端完成以上安装后,客户端克隆git的管
理库, 首先使用ssh别名,创建或打开编辑∼/.ssh/config, 添加下几行:
host gitolite
user git
hostname 192.168.123.173
port 22
identityfile ~/.ssh/ admin
然后克隆管理库:
git clone gitolite:gitolite-admin.git
就能克隆一个库gitolite-admin下来,这个库是用来管理服务器端上所有的其他git库和所有人的权限的。
5.4 管理gitolite
把某用户自己的ssh公钥交给管理员,由管理员添加到本地管理仓库,再push上传到服
务器端的gitolite-admin/keydir目录下
scp id_rsa.pub username@IP:PATH/user.pub
例如:
scp id_rsa.pub xingwenpeng@192.168.135.128:/home/xingwenpeng/xwp.pub
在gitolite-admin/conf/gitolite.conf里添加对某个用户的读写权限
repo gitolite-admin
RW+ = ubuntugege
R = xwp
repo testing
RW+ = @all
5.5节 开发者 17
管理员在本地管理仓库, 记着
git add ./*
git commit -m "add"
git push
某用户可以clone项目
git clone gitolite@IP:project.git
git clone gitolite@192.168.135.128:gitolite-admin.git
5.5 开发者
1.创建自己的分支,进行开发。
git checkout -b dev1
2.开发阶段完成时,下拉主版本库里的最新代码。
git pull
3.生成patch文件,提交到管理员处,由管理员进行合并到主版本库,金字塔管理模型,linux管理就是此模型。
目前处在dev1分支
git diff master > patch
5.6 管理者
1.收到开发者提供的patch,进行审核
2.创建用来管理patch的分支,不在master上直接合并
git branch PATCH
git checkout PATCH
3.合并patch,到PATCH分支
git apply patch
git commit -a -m "Patch Apply"
5.7 带签名的里程碑
GNUPG签名 sudo apt-get install gnupg gpg –list-keys gpg –gen-key 用户名和
邮箱输入自己的,其它使用默认,密码直接敲回车 git -s -m “first tag” mytagv1 git
cat-file tag mytagv1 git tag -v mytagv1 验证签名的有效性 查看mytagv1.0提交信息 -s
携带签名的tag
第 6 章
git服务器分发
我是在ubuntu12.04下搭建的此服务器,主要用于局域网内匿名下载文件。
1.git-daemon支持匿名读,不支持匿名写,安装git-daemon
sudo apt-get install git-daemon-run
2.修改配置文件,添加项目所在的根目录,以后项目都在此目录下创建
sudo vi /etc/sv/git-daemon/run
3.添加如下配置
[plain] view plaincopy
<pre name="code" class="python">#!/bin/sh
exec 2>&1
echo 'git-daemon starting.'
exec chpst -ugitdaemon \
<span style="white-space:pre"> </span>"$(git --exec-path)"/git-daemon --verbose --export-all --
base-path=/home/xwp/server/git-daemon
图 6.1: git-daemon配置
其中
--export-all 增加此参数
--base-path=目录根路径
20 第6章 git服务器分发
4.创建测试项目code进行测试
cd /home/xwp/server/git-daemon
mkdir code
cd code
git init
下面email和name请修改成自己的
git config --global user.email "wenpeng.xing@gmail.com"
git config --global user.name "xingwenpeng"
touch Readme
echo "init code by xwp" > Readme
git add Readme
git commit -m "init first"
注意察看匿名用户对code是否有读权限
5.创建新项目后需要重启git-daemon
sudo sv down git-daemon
发现没有关闭,通过信号杀死此守护进程
ps aux | grep git
sudo kill -9 -pid
ps aux | grep git
6.开启git-gaemon
sudo sv up git-daemon
7.客户端可以不需要帐号,匿名下载测试
git clone git://serverip/code
第 7 章
实例场景处理速查
7.1 一个管理员三个开发者
7.1.1 管理员的git工作
7.1.2 按照分支各自开发自己的,然后再合并
7.1.3 开发者的git工作
7.2 自己的项目,多台电脑
7.3 为github开源项目提交代码
7.3.1 pull requests
自动合并
手动合并
7.3.2 给其他人增加项目的写权限deploy key
















0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:62428次
    • 积分:2387
    • 等级:
    • 排名:第16159名
    • 原创:175篇
    • 转载:65篇
    • 译文:0篇
    • 评论:3条
    最新评论