git 安装与使用
说明:下面文章中黑体字是命令行的输入,斜体是命令行的输出,汉字为正文或注释。
Git 是用于Linux 内核开发的版本控制工具。与常用的CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持,使源代码的发布和交流极其方便。
Ubuntu上可以在“system
下面从用户角度分两部分讲述,首先是单个用户独立使用git,其次是多个用户一起使用git进行团队开发。
一:单个用户
Git安装与使用 |
$ mkdir gittest
$ cd gittest
$ git init
Initialized empty Git repository in /home/chenchi/testgit/.git/
这时候我们输入下面的命令
$ ls
可以看到当前目录下创建了一个隐藏的 .git 目录,它就是所谓的Git 仓库,不过现在仓库还是空的。另外当前目录也不再是普通的文档目录了,今后我们将其称为工作树。有兴趣的话,可以先到.git 目录下看看都有哪些文件。
$ cat .git/HEAD
现在 HEAD 的内容应该是这样:
ref: refs/heads/master
我们可以看到,HEAD 文件中的内容其实只是包含了一个索引信息,并且,这个索引将总是指向你的项目中的当前开发分支。
一个叫 objects 的子目录,它包含了你的项目中的所有对象,我们不必直接地了解到这些对象内容,我们应该关心是存放在这些对象中的项目的数据。
一个叫 refs 的子目录,它用来保存指向对象的索引。
具体地说,子目录 refs 包含着两个子目录叫 heads 和 tags,就像他们的名字所表达的意味一样:他们存放了不同的开发分支的头的索引, 或者是你用来标定版本的标签的索引。
请注意:master 是默认的分支,这也是为什么 .git/HEAD 创建的时候就指向 master 的原因,尽管目前它其实并不存在。 git 将假设你会在 master 上开始并展开你以后的工作,除非你自己创建你自己的分支。
另外,这只是一个约定俗成的习惯而已,实际上你可以将你的工作分支叫任何名字,而不必在版本库中一定要有一个叫 master 的分支,尽管很多 git 工具都认为 master 分支是存在的。
现在已经创建好了一个 git 版本库,但是它是空的,还不能做任何事情,下一步就是怎么向版本库植入数据了。
为了简明起见,我们创建两个文件作为练习:
$ echo "Hello world" > hello
$ echo "Silly example" > example
这样在当前的testgit目录下就生成了两个文件hello和example,如果我们想将它们加入到库中,该怎么做呢?
首先利用 git add 命令将这两个文件加入到版本库文件索引(一个临时的存储区域,Git 称该区域为索引,如果不理解,先跳过去)当中:
$ git add hello example
现在让我们看看版本库的状态:
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#
#
#
#
#
我们能看到 git 的状态提示。提示信息告诉我们版本库中加入了两个新的文件,并且 git 提示我们提交这些文件,我们可以通过 git-commit 命令来提交,这里我们有两种输入方式,
(1)带参数m
$ git commit -m "Initial commit of gittest reposistory"
//引号中的内容就是类似于SVN中每次提交代码前,都要填写的message信息,以便于以后自己或者别人能明白你这次更改的原因,及相关改动的信息。
(2)不带参数m
$ git commit
//系统会自动调用一个叫GNU nano的编辑器,来让你输入与上面类似的信息,在编辑器的下面会出现^G
Created initial commit 7ffe128: Initial commit of gittest reposistory
$ git
commit 7ffe1285bda6febfa8d24f8d
Author: chenchi <chen.chi@kortide.com.cn>
Date:
这里我们已经知道如何创建版本库,并向库中添加数据。
再往下走:
$ vim hello
添加如下语句:
today is Tuesday, 20090224, rain.
Are you happy?
利用git diff 查看改了什么:
$ git diff
diff --git a/hello b/hello
index 802992c..e042b07 100644
--- a/hello
+++ b/hello
@@ -1 +1,4 @@
+
+today is Tuesday, 20090224, rain.
+Are you happy?
现在让我们看看版本库的状态:
$ git status
# On branch master
#
#
#
#
no changes added to commit (use "git add" and/or "git commit -a")
它表示hello文件已经被更改了,但没有更新(update)。
$ git add hello
$ git diff
$ git status
# On branch master
# Changes to be committed:
#
#
#
#
它表示hello文件已经被更改了,但没有提交(committed)到本地的仓库中
$ git commit -m "1---add date to hello file"
这里我们其实已经完成了又一次的更改和提交了。
实际开发中,我们通常是直接用别人的仓库来进行进一步的开发,那么下面的流程就是必须要看的了:
因为是团队合作,所以每个人在使用git时,要先进行类似的配置。
$ git config --global user.name "chenchi"
$ git config --global user.email "chen.chi@kortide.com.cn"
这样的配置文件也可以在/home/chenchi/.gitconfig中看到。
回到自己的 /home/chenchi/ 目录下
$ mkdir project
$ cd
首先从服务器上克隆(clone出完整的工作树到本地):
$ git clonechenchi@192.168.2.171:/home/chenchi/git1
$ git clone
Initialized empty Git repository in /home/chenchi/project/git1/.git/
chenchi@192.168.2.171's password:
remote: Counting objects: 94, done.
remote: Compressing objects: 100% (67/67), done.
remote: Total 94 (delta 12), reused 0 (delta 0)
Receiving objects: 100% (94/94), 7.91 KiB, done.
Resolving deltas: 100% (12/12), done.
注意:
$ git
$ git
这里一次代码更改并最后提交就完成了。
这个时候在服务器端可以用 git log 来看看是否有更新,同时可以通过在服务器端输入 git checkout
当服务器上有新的代码(其他人git
zhenguo@zhenguo-desktop:~/chenchi/git1/drv-pxa310$ git push
zhenguo@210.22.155.236's password:
error: failed to push some refs to 'ssh://210.22.155.236:9092/home/chenchi/git1'
这时需要git pull 更新本地代码,系统会在这个过程中自动的进行merger操作,如果本地更改和服务器上最新代码没有冲突,则merger操作自动完成,如果有冲突,则出现类似下面的输出:
zhenguo@zhenguo-desktop:~/chenchi/git1/drv-pxa310$ git pull
zhenguo@210.22.155.236's password:
remote: Compressing objects: 100% (12/12), done.
remote: Total 12 (delta 5), reused 0 (delta 0)
Unpacking objects: 100% (12/12), done.
From ssh://210.22.155.236:9092/home/chenchi/git1
Auto-merged drv-pxa310/t3
CONFLICT (content): Merge conflict in drv-pxa310/t3
Automatic merge failed; fix conflicts and then commit the result.
这时需要我们自己手动更改文件,再提交到本地仓库,最后 git push 到服务器上去。
如果在push过程中有类似下面的错误:
zhenguo@zhenguo-desktop:~/chenchi/git1/drv-pxa310$ git push
zhenguo@210.22.155.236's password:
Compressing objects: 100% (8/8), done.
Writing objects: 100% (8/8), 755 bytes, done.
Total 8 (delta 4), reused 0 (delta 0)
error: unable to create temporary sha1 filename ./objects/ca: File exists
fatal: failed to write object
error: unpack failed: unpacker exited with error code
To ssh://210.22.155.236:9092/home/chenchi/git1
error: failed to push some refs to 'ssh://210.22.155.236:9092/home/chenchi/git1'
Git-reset的概念比较复杂。它的命令形式:git-reset [--mixed | --soft | --hard] [<commit-ish>]
命令的选项:
--mixed
$ git
它的作用仅是重置分支状态到dev1^,
$ git
$ git
当我们改了大量的文件以后,既没有 git add 也没有git commit,这时我们想将其中部分文件的更改撤销掉,即想做SVN中的revert类似操作,这时可以:
$ git
在本地使用git与服务器进行pull、push操作时,每次都要输入密码,比较麻烦,我们可以用ssh密钥来进行验证。这样git使用过程中ssh就会自动登录而无需输入密码。方法如下:
首先用自己账号登录到server上,输入ssh-keygen -t rsa
chenchi@Ubuntu-8:~$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/chenchi/.ssh/id_rsa):
Your public key has been saved in /home/chenchi/.ssh/id_rsa.pub.
The key fingerprint is:
79:8a:78:8f:c6:12:12:3c:fd:40:84:7b:e3:fc:60:dfchenchi@Ubuntu-8
The key's randomart image is:
.........
输入ssh-keygen -t rsa后,出现各个提示,不用管,一直按回车。这样密钥对就生成完了。其中公共密钥保存在 ~/.ssh/id_rsa.pub ( ~ 表示自己账号的home目录,像我的就是/home/chenchi目录);
私有密钥保存在 ~/.ssh/id_rsa 文件中。
chenchi@Ubuntu-8:~$ cd .ssh/
chenchi@Ubuntu-8:~/.ssh$ ls
config
chenchi@Ubuntu-8:~/.ssh$ cat id_rsa.pub
chenchi@Ubuntu-8:~/.ssh$ chmod 600 authorized_keys
将公共密钥id_rsa.pub内容放到authorized_keys文件中,并修改authorized_keys的权限。
退出server,然后登录到本地的机器上执行:
$ scp chenchi@192.168.2.171:/home/chenchi/.ssh/id_rsa
$ scp -P 9092
$ cd /home/chenchi/.ssh/
$ chmod 600 id_rsa
将服务器上密钥对中的私有密钥(id_rsa)用scp命令复制到你自己本地.ssh目录下,修改一下本地的id_rsa
文件权限,这样就好了。之后你用ssh 访问那台服务器时,就不用输入密码 了。