momo zone

调核人的blog

试玩GIT

前两天搞git版的mplayer ,所以把git的一些概念和操作都总结了一下。

1.获取别人的代码,进行项目编译。

首先建立一个新的目录,这个目录将作为git的工作目录:

$mkdir github

工作目录github 是个不错的名字,但其实后面会提到那个真正的github ,这里用这个名字意味着后来我会把他作为github 中众多项目的总目录。

$cd github

$git clone git://git.mplayerhq.hu/mplayer
耐心等待一下,像mplayer这样的大项目会有上万个object(一般都是源码)

clone完毕后,这里会自动生成mplayer 目录作为git的工作目录(repo) ,里面包含.git 目录。里面存放了内容如下:

FETCH_HEAD  ORIG_HEAD  config       gitk.cache  index  logs     packed-refs
HEAD        branches   description  hooks       info   objects  refs

.git的存在就说明这不是一个普通目录,而是git工作目录。

github------------------
                         |
                   mplayer-----------|
                                       .git
                                        |
                                       other object
在git 目录下可以用一下命令:
git show: 显示最后一次commit 的内容:
commit dbdd0a2dcdaafbb382a460558cb1e11fc55f0e1b
Author: reimar <reimar@b3059339-0415-0410-9bf9-f77b7e298cf2>
Date:   Mon Aug 15 21:28:19 2011 +0000
    Forgotten commit of subreader.h adding SUB_GOOGLE define.
    git-svn-id: svn://git.mplayerhq.hu/mplayer/trunk@33996 b3059339-0415-0410-9bf9-f77b7e298cf2
diff --git a/sub/subreader.h b/sub/subreader.h
index 470167e..35725f7 100644
--- a/sub/subreader.h
+++ b/sub/subreader.h
@@ -50,6 +50,7 @@ extern char *sub_cp;
 #define SUB_SUBRIP09 11
 #define SUB_JACOSUB  12
 #define SUB_MPL2     13
+#define SUB_GOOGLE   14
 #define MAX_SUBTITLE_FILES 128
git log: 显示所有commit,从该项目创立到最近的commit
git pull: 从远端同步代码到本地,也可以用git pull git://git.mplayerhq.hu/mplayer 指定远端。 不写的话就从.git 目录里的config 获得远端。这里先不讨论本地代码和远端不同的情况。
需要留意的是所有git 子命令必须切换到对应的repo 目录才可以用

2. 利用GITHUB建立自己的GIT repo,用于维护代码

先去https://github.com 注册github 帐号。然后去Account Settings -> SSH Public Keys 去把自己的 host/user 的ssh公钥(public key)输入到这里。目的是为了允许github可以访问本机。git的分布式文件操作依赖ssh 。关于ssh key 的相关内容可以点击这里。

然后测试一下连接是否可用:

$ssh -T git@github.com

Hi username! You’ve successfully authenticated, but GitHub does not provide shell access.

然后设定git 的一些变量:

$ git config –global user.name “Firstname Lastname

$ git config –global user.email “your_email@youremail.com

尽量设置成和github上注册的一致吧。

https://github.com/dashboard/yours 点击New Repository 建立新的repo。

现在可以在本地创建repo:

$cd github

$mkdir helloWorld

$cd helloWorld

$git init

然后开始创建object ,也就是源码文件。 不过这里可以写一个README 用来测试。README 在git里面是个特殊文件,它总是在github的repo首页中显示,自动充当项目的自述。

书写完毕后将README 加入repo的stage状态:

$git add README 或者 $git add .  (把当前目录的所有文件加入stage 状态)

然后生成一个提交记录:

$ git commit -m ‘first commit’

一个提交记录就相当于给整个repo记录一个save 档,或者说是一个快照,下次提交时同样再生成一个。两个步骤也可以合并成一个

$git commit -a -m ‘first commit’

接下来就要让远程的repo和本地连接:

$git remote add origin git@github.com:lainredsonic/helloWorld.git

origin 就是remote git repo的别名。

最后将本地的repo同步到远程:

$git push origin master  

如果要将远程同步到本地:

$git pull origin master 

其实git pull 相当于依次执行了git fetch 和git merge。

每当在repo中新增文件到stage 时,都要用git add <filename> or git add . 然后用git status 可以看到当前的repo的变化:

$git add .

$git status

#On branch master
#Changes to be committed:
#       (use “git reset HEAD <file> …” to unstage)
#
#             new file: helloworld.c
#

然后新建一个提交:

$git commit -m ‘new file created’

$git push origin master

如果要从repo 删除一个文件,可以分为两种情况:只从repo中把stage状态改为unstage 状态,另一种是不仅repo中更改为unstage 状态,而且文件本身将被物理删除。无论何种删除,一旦同步到远程,则远程的文件肯定会消失。

$git  rm –cached <filename>    #仅更改为unstage 状态,文件本身还存在

$git rm <filename>  #真正删除文件

$git commit -m ‘del file from repo’

$git push origin master

下面试一下git的高级功能,主要是分支操作,和回退(撤销)操作

先说一下分支, 具体含义就不多说了。

$git branch   #查看当前仓库的所有分支,前面有星号的说明是正处于的分支。一般都是master吧。

$git branch <branch_name> [<source_branch>] #从source_branch建立branch_name的分支。如果source_branch不写的话默认就是master分支了。 注意一个分支是另外一个分支的完整克隆,包括log 。

$git checkout <branch_name> #切换至branch_name分支

$git push origin <branch_name> #提交分支到远程。 branch_name 必须写上,否则将默认push master 分支。

对分支修改完毕后可以合并至另外一个分支(包括master):

$git checkout master

$git merge <branch_name> <branch_name>  #一次可以合并多个branch

$git pull origin <branch_name> #直接将远程的分支合并到本地的当前分支。

这里一般都会遇到冲突提示,比如branch 1 里的一个文件包含和branch 2 同文件的相同部分的内容。通常解决冲突的方法就是vi 那么个有冲突的文件,然后新建一个commit即可。然后再push 这个branch到远程。注意:merge不但合并实际内容,也会合并log。

merge完毕后可以删除这个branch:

$git branch -d <branch_name>

如果没有merge 却要删除的话就要这样:

$git branch -D <branch_name>

这里有个疑问,本地branch 已经删除了,那么如果才能同步删除远程的呢 ? 按照下面来做:

$git push origin  :<branch_name>

最后再说一下回滚

如果要把git里面的内容回滚到之前的某个版本(以commit 为标识),有两张做法:

$git revert -n <commit msg>  #将内容会回到commit msg所指版本 ,而不回滚repo 状态信息

$git reset <commit msg> #回滚整个repo状态到 commit msg 版本。 意味着有可能丢失历史记录和branch 信息。

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s

%d 博主赞过: