———————————————————————————————————————
主机操作系统:Centos 6.7
安装配置:GIT
邮箱:[email protected]
———————————————————————————————————————
一GIT简介
Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得 BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如最近就迁移到 Git 上来了,很多 Freedesktop 的项目也迁移到了 Git 上。
二.特点分布式和集中式的最大区别在于开发者可以本地提交。每个开发者机器上都有一个服务器的数据库。
下图是经典的git开发过程。
Git的功能特性:
从一般开发者的角度来看git有以下功能:
1:从服务器上克隆数据库(包括代码和版本信息)到单机上。
2:在自己的机器上创建分支,修改代码。
3:在单机上自己创建的分支上提交代码。
4:在单机上合并分支。
5:新建一个分支,把服务器上最新版的代码fetch下来,然后跟自己的主分支合并。
6:生成补丁(patch),把补丁发送给主开发者。
7:看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一个人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
8:一般开发者之间解决冲突的方法,开发者之间可以使用pull 命令解决冲突,解决完冲突之后再向主开发者提交补丁。
三.功能从主开发者的角度(假设主开发者不用开发代码)看,git有以下功能:
1:查看邮件或者通过其它方式查看一般开发者的提交状态。
2:打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。
3:向公共服务器提交结果,然后通知所有开发人员。
优点:
适合分布式开发,强调个体。
公共服务器压力和数据量都不会太大。
速度快、灵活。
任意两个开发者之间可以很容易的解决冲突。
离线工作。
缺点:
资料少(起码中文资料很少)。
学习周期相对而言比较长。
不符合常规思维。
代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。
[leiyuxing@centos6 ~]$ sudo useradd -m git
[leiyuxing@centos6 ~]$ sudo passwd git
更改用户 git 的密码 。
新的 密码:
重新输入新的 密码:
passwd: 所有的身份验证令牌已经成功更新。
五.切换到git用户,并初始化git帐户信息:
[leiyuxing@centos6 ~]$ su git
密码:
[git@centos6 leiyuxing]$cd
[git@centos6 ~]$ git config --global user.name "git"
[git@centos6 ~]$ git config --global user.email "[email protected]"
六.修改/etc/sudoers文件,把git用户添加到sudo里去,方便使用sudo管理:
[leiyuxing@centos6 ~]$ sudo vim /etc/sudoers
****
git ALL= NOPASSWD: ALL
****
七. 配置ssh公钥访问oschina:
oschina简介:
ssh公钥:
---------------------------------------
大多数 Git 服务器都会选择使用 SSH 公钥来进行授权。系统中的每个用户都必须提供
一个公钥用于授权,没有的话就要生成一个。生成公钥的过程在所有操作系统上都差不多。
首先先确认一下是否已经有一个公钥了。SSH 公钥默认储存在账户的主目录下的 ~/.ssh
目录。关键是看有没有用 something 和 something.pub 来命名的一对文件,这个 something
通常就是 id_dsa 或 id_rsa。有 .pub 后缀的文件就是公钥,另一个文件则是密钥。假如没有这些文件,或者干脆连 .ssh 目录都没有,可以用 ssh-keygen 来创建。该程序在
---------------------------------------
转到.ssh目录下(若没有则新建一个),生成的公钥将放到该目录下
[leiyuxing@centos6 git]$ cd ~/.ssh/
使用ssh-kengen工具生成公钥(public key):
[leiyuxing@centos6 .ssh]$ ssh-keygen -t rsa -C"[email protected]" //Creates a new ssh key using the provided email,"[email protected]"是您注册时使用的邮箱名,注意会弹出要输入文件名及密码等,直接敲Enter即可。
Generating public/private rsa key pair.
Enter file in which to save the key (/home/leiyuxing/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/leiyuxing/.ssh/id_rsa.
Your public key has been saved in /home/leiyuxing/.ssh/id_rsa.pub.
The key fingerprint is:
99:7b:20:40:dc:d4:09:4a:68:a3:88:87:d2:ca:da:d7 [email protected]
The key's randomart image is:
+--[ RSA 2048]----+
| ooooo . |
| +o... o |
|o= .o |
|* o . o |
|oo . S |
|.. . o |
|.. . . . |
|. . . E . |
| . |
+-----------------+
查看生成的公钥,并将公钥内容拷贝添加到Git @ OSC http://git.oschina.net/keys
[leiyuxing@centos6 .ssh]$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQ..........................................................................................................................................................................................................
PzARbyLiutwEAblSx4zy01WT8Xjdxz0jAPSZo3vGppLb1P0o2GpGfHOhuU5SAaoBVsA/30s5X9MbvLxuznyUqAf7WckX34ztT9thMgw== [email protected]
[leiyuxing@centos6 .ssh]$ ls
id_rsa id_rsa.pub known_hosts
注意拷贝过程中不能多一个空格,也不能少一个空格,格式等必须和生成的公钥一致(不要用Windows自带的记事本打开复制)。
通过如下的命令可以查看是否设置公钥成功:
[leiyuxing@centos6 .ssh]$ ssh -T [email protected]八.创建git存放代码的仓库:
如图我用osc托管的,我就先在那上面建立了一个新的项目,里面除了一个readme什么都没有。
其中以下网址是用来连接的:
接下来就回到我们虚拟机上:
[leiyuxing@centos6 ~]$ mkdir git
[leiyuxing@centos6 ~]$ cd git/
[leiyuxing@centos6 git]$ git init
Initialized empty Git repository in /home/leiyuxing/git/.git/
首先是建立我们本地一个git目录,然后git init使它真正成为一个仓库,会出现一个.git目前,仓库的属性都在里面,它就是一个标志,有它就是一个git仓库。
建立联系:
[leiyuxing@centos6 ~]$ git remote add origin [email protected]:LYX_WIN/OV9650.git
[leiyuxing@centos6 ~]$ git remote -v
origin [email protected]:LYX_WIN/OV9650.git (fetch)
origin [email protected]:LYX_WIN/OV9650.git (push)
可以用pull把我们远处仓库的文件下下来(刚才我们上面建立了联系,所示我们可以用这个命令:git pull origin master)
[leiyuxing@centos6 git]$ git pull [email protected]:LYX_WIN/OV9650.git
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From git.oschina.net:LYX_WIN/OV9650
* branch HEAD -> FETCH_HEAD
[leiyuxing@centos6 git]$ ls
README.md
我们想做的是如何把自己仓库的文件放到远程仓库中呢?
首先我创建一个文件,然后用命令加入到我本地的仓库中去
[leiyuxing@centos6 git]$ vim a.txt
[leiyuxing@centos6 git]$ cat a.txt
aaa
[leiyuxing@centos6 git]$ git status
# On branch master
# Untracked files:
# (use "git add
#
# .a.txt.swp
# a.txt
nothing added to commit but untracked files present (use "git add" to track)
这时会提示我们有一个未追踪的文件,叫a.txt。我们要把这个文件加入到版本控制中,于是,我们运行如下命令:
[leiyuxing@centos6 git]$ git add a.txt
这个命令表示把我们指定的a.txt加入到git控制之下。add命令可以没有参数(在windows下可以没有参数,在mac下需要指定当前目录即“.”),如果没有参数,则表示把目录下的所有文件都加入到git仓库中。这个时候,我们再运行下“git status”:
[leiyuxing@centos6 git]$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD
#
# new file: a.txt
#
# Untracked files:
# (use "git add
#
# .a.txt.swp
提示我们有改变需要被提交。这个时候,a.txt这个文件就存在于所谓的“暂存区”中,暂存区中的文件可以被真正提交到git仓库。有同学可能说,如果我不想提交这个文件了,那怎么把刚才的文件从暂存区移除呢?其实答案就在刚才的提示中:
use "git rm --cached ..." to unstage。
那么,我们运行下这个命令:
[leiyuxing@centos6 git]$ git rm --cached a.txt
rm 'a.txt'
再运行git status时就可以发现,又回到文件没有被提交时的状态了。
当我们的文件已经通过“git add”加入到暂存区后,就可以把文件真正提交到git仓库了。如下:
[leiyuxing@centos6 git]$ git commit -m "add a file"
[master 284a63b] add a file
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 a.txt
[leiyuxing@centos6 git]$ git push -f [email protected]:LYX_WIN/OV9650.git
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 271 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To [email protected]:LYX_WIN/OV9650.git
a97700d..284a63b master -> master
发现已经可以提交成功了,提示一个文件被修改(就是我们的a.txt),一行被插入(就是我们唯一的一行“aaa”)。
我们再运行下git status:
[leiyuxing@centos6 git]$ git status
# On branch master
nothing to commit (working directory clean)
提示我们当前没有东西要提交,当前工作目录是干净的,因为我们都提交到git了。
好了,到这步后,git就可以完全跟踪已经被提交的文件了,以后,这个文件的任何修改,它都可以记录下来。比如某个人对项目私自修改了一些东西,项目管理者根据git的版本记录是一定可以找到是谁修改了哪些文件的。
现在我们就可以把文件提交到远程服务器了。
我们也可以刷新网页,在我们的osc上看到了:
九.这次我们尝试不用自己创建仓库了,直接用 clone命令
[leiyuxing@centos6 git]$ git clone [email protected]:LYX_WIN/OV9650.git
Initialized empty Git repository in /home/leiyuxing/git/OV9650/.git/
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (6/6), done.
[leiyuxing@centos6 git]$ ls
a.txt OV9650 README.md
我们进去ov9650这个目录可以看见.git这个目录:
[leiyuxing@centos6 OV9650]$ ls ../ .git
../:
a.txt OV9650 README.md
.git:
branches description hooks info objects refs
config HEAD index logs packed-refs
我们git log可以看见我们在1.3服务器上做的事情,说明就是那个仓库:
[leiyuxing@centos6 OV9650]$ git log
commit 284a63b496f11bd7949bcf3a1d3d0ee70b716409
Author: leiyuxing <[email protected]>
Date: Thu Aug 18 08:34:06 2016 +0800
add a file
commit a97700d366d8703cbfbcc109862c0b9781733834
Author: leiyuxing <[email protected]>
Date: Wed Aug 17 10:42:17 2016 +0800
Initial commit
然后可以测试一下,创建一个1.c文件然后上传:
[leiyuxing@centos6 OV9650]$ touch 1.c
[leiyuxing@centos6 OV9650]$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
# Untracked files:
# (use "git add
#
# 1.c
nothing added to commit but untracked files present (use "git add" to track)
[leiyuxing@centos6 OV9650]$ git add 1.c
[leiyuxing@centos6 OV9650]$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
# Changes to be committed:
# (use "git reset HEAD
#
# new file: 1.c
#
[leiyuxing@centos6 OV9650]$ git commit -m "add a file"
[master 8ce8431] add a file
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 1.c
[leiyuxing@centos6 OV9650]$ git push -f [email protected]:LYX_WIN/OV9650.git
Counting objects: 8, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 708 bytes, done.
Total 7 (delta 0), reused 0 (delta 0)
To [email protected]:LYX_WIN/OV9650.git
284a63b..8ce8431 master -> master
我们可以再一次刷新网页,在我们的osc上看到了: