Linux下使用git

先在github.com上注册帐号


第一步:安装&配置

apt-get install git git-core
配置:(网站指引)
jeakon@ASUS:~$ git config --global user.name "jeakon"
jeakon@ASUS:~$ git config --global user.email "jeakons@gmail.com"
jeakon@ASUS:~$ git config --global credential.helper cache                                  可以保存密码
jeakon@ASUS:~$ git config --global credential.helper 'cache --timeout=7200'        保存密码的时间,单位秒


第二步:更新版本库

如果你已经安装好git那么通过下面命令来更新版本库。(要下载约50M的东西,比较慢)

git clone git://git.kernel.org/pub/scm/git/git.git

第三步:创建一个版本库git init

创建一个 Git 版本库是很容易的,只要用命令 git init 就可以了

$ mkdir gittutorcn
$ cd gittutorcn

$ git init    (新版 git 中应该用 git init ,不要再用 init-db 命令,具体可以通过命令 git help init 查看)

git 将会作出以下的回应

Initialized empty Git repository in /[yourpath]/.git
这样,一个空的版本库就创建好了,并在当前目录中创建一个叫 .git 的子目录。你可以用 ls -a 查看一下,并请注意其中的三项内容:
++ 一个叫 HEAD 的文件, 内容应该是这样:  ref: refs/heads/master
我们可以看到,HEAD 文件中的内容其实只是包含了一个索引信息,并且,这个索引将总是指向你的项目中的当前开发分支。
++ 一个叫 objects 的子目录,它包含了你的项目中的所有对象,我们不必直接地了解到这些对象内容,我们应该关心是存放在这些对象中的项目的数据。
++ 一个叫 refs 的子目录,它用来保存指向对象的索引。
具体地说,子目录 refs 包含着两个子目录叫 heads 和 tags,就像他们的名字所表达的意味一样:他们存放了不同的开发分支的头的索引, 或者是你用来标定版本的标签的索引。

请注意:master 是默认的分支,这也是为什么 .git/HEAD 创建的时候就指向 master 的原因,尽管目前它其实并不存在。 git 将假设你会在 master 上开始并展开你以后的工作,除非你自己创建你自己的分支。

另外,这只是一个约定俗成的习惯而已,你的工作分支可以叫任何名字,而不必在版本库中一定要有一个叫 master 的分支,尽管很多 git 工具都认为 master 分支是存在的。

现在已经创建好了一个 git 版本库,但是它是空的,还不能做任何事情,下一步就是怎么向版本库植入数据了。

第四步:植入内容跟踪信息:git add:

植入内容跟踪信息:git add
为了简明起见,我们创建两个文件作为练习:
$ echo "Hello world" > hello
$ echo "Snake Zero" > snake
我们再用 git add 命令将这两个文件加入到版本库文件索引当中:
$ git add hello snake
git add 实际上是个 脚本命令,它是对 git 内核命令 git update-index 的调用。因此上面的命令和下面的命令其实是等价的:
$ git update-index --add hello snake
如果你要将某个文件从 git 的目录跟踪系统中清除出去,同样可以用 git update-index 命令。例如:
$ git update-index --force-remove foo.c
Note
git add 可以将某个目录下的所有内容全都纳入内容跟踪之下,例如: git add ./path/to/your/wanted 。但是在这样做之前,应该注意先将一些我们不希望跟踪的文件清理掉,例如,gcc 编译出来的 *.o 文件,vim 的交换文件 .*.swp 之类。
应该建立一个清晰的概念就是,git add 和 git update-index 只是刷新了 git 的跟踪信息,hello 和 snake 这两个文件中的内容并没有提交到 git 的内容跟踪范畴之内。
普通用户总是应该是用 git add, 而不要使用上面提到的 update-index  内部命令
添加所有未 跟踪文件用 git add -A, 添加所有未跟踪文件并且提交用 git commit -a。(注意大小写)
从当前 跟踪文件中删除用 git reset HEAD <filename>。事实上也就是用当前 HEAD(commited) 中的内容替换掉 index(staging) 的内容。

提交内容

提交内容到版本库:git commit
既然我们刷新了 Git 的跟踪信息,现在我们看看版本库的状态:
$ git status
我们能看到 git 的状态提示:
#
# Initial commit
#
#
# Updated but not checked in:
# (will commit)
#
# new file: example
# new file: hello
#
提示信息告诉我们版本库中加入了两个新的文件,并且 git 提示我们提交这些文件,我们可以通过 git commit 命令来提交:
$ git commit -m "Initial commit of gittutor reposistory"
查看当前的工作:git diff
git diff 命令将比较当前的工作目录和版本库数据库中的差异。现在我们编辑一些文件来体验一下 git 的跟踪功能。
$ echo '这段是后来加的' > snake
我们再来比较一下,当前的工作目录和版本库中的数据的差别。
$ git diff
差异将以典型的 patch 方式表示出来:
diff --git a/snake b/snake
index 3b85043..d79f20a 100644
--- a/snake
+++ b/snake
@@ -1 +1 @@
-snake zero
+这段是后来加的
此时,我们可以再次使用组合命令 git add 和 git commit 将我们的工作提交到版本库中。
$ git add snake
$ git commit -m "new day for git"
实际上,如果要提交的文件都是已经纳入 git 版本库的文件,那么不必为这些文件都应用 git add 命令之后再进行提交,下面的命令更简捷并且和上面的命令是等价的。
$ git commit -a -m "new day for git"

管理分支

管理分支:git branch
直至现在为止,我们的项目版本库一直都是只有一个分支 master。在 git 版本库中创建分支的成本几乎为零,所以,不必吝啬多创建几个分支。下面列举一些常见的分支策略,仅供大家参考:
* 创建一个属于自己的个人工作分支,以避免对主分支 master 造成太多的干扰,也方便与他人交流协作。
* 当进行高风险的工作时,创建一个试验性的分支,扔掉一个烂摊子总比收拾一个烂摊子好得多。
* 合并别人的工作的时候,最好是创建一个临时的分支,关于如何用临时分支合并别人的工作的技巧,将会在后面讲述。

创建分支

下面的命令将创建我自己的工作分支,名叫 robin,并且将以后的工作转移到这个分支上开展。
$ git branch robin
$ git checkout robin
更简单和常用的方法是直接通过 checkout 命令来一次性创建并转移到新建分支上,命令如下:
$ git checkout -b robin [start_point]
其中 start_point 是一个可选参数,指定新建分支 robin 是基于哪个节点,默认为当前所在分支的节点。

删除分支

要删除版本库中的某个分支,使用 git branch -d 命令就可以了,例如:
$ git branch -d branch-name
但是需要注意的是,如果删除的分支还没有被 merge 到其他分支,删除这样的分支会导致这个分支上所做的改动丢失,因此 git branch -d 命令会失败,提示你这样做会丢失信息。如果你的确想删除这样的分支,不怕信息丢失,那么可以使用 git branch -D 命令,这个命令不会去判断分支的merge状态,例如:
$ git branch -D branch-name
通常建议使用 -d 参数来删除分支,以防无意的信息丢失。

查看分支

运行下面的命令可以得到你当前工作目录的分支列表:
$ git branch
在你正在工作的分支的名字前面,会有 * 号标示,比如:
$ git branch
bugfix
* master
说明有两个本地分支 bugfix 和 master, 其中当前的工作分支为 master。
查看项目的发展变化和比较差异
这一节介绍几个查看项目的版本库的发展变化以及比较差异的很有用的命令:
git show-branch
git diff
git whatchanged
我们现在为 robin, master 两个分支都增加一些内容。
$ git checkout robin
$ echo "Work, work, workd" >> hello
$ git commit -m "Some workd" -i hello
$ git checkout master
$ echo "Play, play, play" >> hello
$ echo "Lots of fun" >> example
$ git commit -m "Some fun" -i hello example
git show-branch 命令可以使我们看到版本库中每个分支的世系发展状态,并且可以看到每次提交的内容是否已进入每个分支。
$ git show-branch
这个命令让我们看到版本库的发展记录。
* [master] Some fun
! [robin] some work
--
* [master] Some fun
+ [robin] some work
*+ [master^] a new day for git
譬如我们要查看世系标号为 master^ 和 robin 的版本的差异情况,我们可以使用这样的命令:
$ git diff master^ robin
我们可以看到这两个版本的差异:
diff --git a/hello b/hello
index 263414f..cc44c73 100644
--- a/hello
+++ b/hello
@@ -1,2 +1,3 @@
Hello World
It's a new day for git
+Work, work, work
Note
关于 GIT 版本世系编号的定义,请参看 git help rev-parse 。
我们现在再用 git whatchanged 命令来看看 master 分支是怎么发展的。
$ git checkout master
$ git whatchanged
diff-tree 1d2fa05... (from 3ecebc0...)
Author: Vortune.Robin
Date: Tue Mar 21 02:24:31 2006 +0800
Some fun
:100644 100644 f24c74a... 7f8b141... M example
:100644 100644 263414f... 06fa6a2... M hello
diff-tree 3ecebc0... (from 895f09a...)
Author: Vortune.Robin
Date: Tue Mar 21 02:17:23 2006 +0800
a new day for git
:100644 100644 557db03... 263414f... M hello
从上面的内容中我们可以看到,在 robin 分支中的日志为 "Some work" 的内容, 并没有在 master 分支中出现。

合并分支

合并两个分支:git merge
既然我们为项目创建了不同的分支,那么我们就要经常地将自己或者是别人在一个分支上的工作合并到其他的分支上去。现在我们看看怎么将 robin 分支上的工作合并到 master 分支中。现在转移我们当前的工作分支到 master,并且将 robin 分支上的工作合并进来。
$ git checkout master
$ git merge -m "Merge from robin" robin
上面的命令会将 robin 分支的改动 merge 到 master,并生成一个新的 commit 节点,这个 commit 的注释信息为 "Merge from robin"
(kwydwuf注: $ git merge "Merge work in robin" HEAD robin 是老版本的用法,应该废弃 )
合并两个分支,还有一个更简便的方式,下面的命令和上面的命令是等价的 (kwydwuf注:git pull 的本意是用来 merge 远端版本库中的某个分支,用在此处没有任何简便之处,可以废弃)。
$ git checkout master
$ git pull . robin
但是,此时 git 会出现合并冲突提示:
Trying really trivial in-index merge...
fatal: Merge requires file-level merging
Nope.
Merging HEAD with d2659fcf690ec693c04c82b03202fc5530d50960
Merging:
1d2fa05b13b63e39f621d8ee911817df0662d9b7 Some fun
d2659fcf690ec693c04c82b03202fc5530d50960 some work
found 1 common ancestor(s):
3ecebc0cb4894a33208dfa7c7c6fc8b5f9da0eda a new day for git
Auto-merging hello
CONFLICT (content): Merge conflict in hello
Automatic merge failed; fix up by hand
git 的提示指出,在合并作用于文件 hello 的 'Some fun' 和 'some work' 这两个对象时有冲突,具体通俗点说,就是在 master, robin 这两个分支中的 hello 文件的某些相同的行中的内容不一样。我们需要手动解决这些冲突,现在先让我们看看现在的 hello 文件中的内容。
$ cat hello
此时的 hello 文件应是这样的,用过其他的版本控制系统的朋友应该很容易看出这个典型的冲突表示格式:
Hello World
It's a new day for git
<<<<<<< HEAD/hello
Play, play, play
=======
Work, work, work
>>>>>>> d2659fcf690ec693c04c82b03202fc5530d50960/hello
我们用 编辑器将 hello 文件改为:
Hello World
It's a new day for git
Play, play, play
Work, work, work
现在可以将手动解决了冲突的文件提交了。
$ git commit -i hello
以上是典型的两路合并(2-way merge)算法,绝大多数情况下已经够用。但是还有更复杂的三路合并和多内容树合并的情况。详情可参看: git help read-tree, git help merge 等文档。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值