1. 系统设置
通常情况下,我们只需简单设置用户信息和着色即可。
$ git config –global user.name “Q.yuhen”
$ git config –global user.email qyuhen@abc.com
$ git config –global color.ui true
可以使用 “–list” 查看当前设置。
$ git config –list
2. 初始化
创建项目目录,然后执行 “git init” 初始化。这会在项目目录创建 “.git” 目录,即为元数据信息所在。
$ git init
通常我们还需要创建一个忽略配置文件 “.gitignore”,并不是什么都需要加到代码仓库中的。
$ cat > .gitignore << end
> *.[oa]
> *.so
> *~
> !a.so
> test
> tmp/
> end
如果作为 Server 存在,那么可以忽略工作目录,以纯代码仓库形式存在。
$ git –bare init
在客户端,我们可以调用 “clone” 命令克隆整个项目。支持 SSH / HTTP/ GIT 等协议。
$ git clone user@server:/path.git
$ git clone git://github.com/schacon/grit.git mygrit
3. 基本操作
Git 分为 “工作目录”、”暂存区”、”代码仓库” 三个部分。
(1) 添加
文件通过 “git add ” 被添加到暂存区,如此暂存区将拥有一份文件快照。
$ git add .
$ git add file1 file2
$ git add *.c
“git add” 除了添加新文件到暂存区进行跟踪外,还可以刷新已被跟踪文件的快照。需要注意的是,被提交到代码仓库的是暂存区的快照,而不是工作目录中的文件。
(2) 提交
“git commit -m ” 命令将暂存区的快照提交到代码仓库。
$ git commit -m “message”
在执行 commit 提交时,我们通常会直接使用 “-a” 参数。该参数的含义是:刷新暂存区快照,提交时同时移除被删除的文件。但该参数并不会添加未被跟踪的新文件,依然需要执行 “git add ” 操作。
$ git commit -am “message”
(3) 状态
可以使用 “git status” 查看暂存区状态,通常包括 “当前工作分支(Branch)”、”被修改的已跟踪文件(Changed but not updated)”,以及 “未跟踪的新文件(Untracked files)” 三部分信息。
$ git status
# On branch master
# Changed but not updated:
# (use “git add …” to update what will be committed)
# (use “git checkout — …” to discard changes in working directory)
#
# modified: readme
#
# Untracked files:
# (use “git add …” to include in what will be committed)
#
# install
no changes added to commit (use “git add” and/or “git commit -a”)
(4) 比较
要比较三个区域的文件差别,需要使用 “git diff” 命令。
使用 “git diff [file]” 查看工作目录和暂存区的差异。
使用 “git diff –staged [file]” 或 “git diff –cached [file]” 查看暂存区和代码仓库的差异。
$ git diff readme
diff –git a/readme b/readme
index e69de29..df8285e 100644
— a/readme
+++ b/readme
@@ -0,0 +1,2 @@
+1111111111111111111
+ #p#副标题#e#(5) 撤销
作为代码管理工作,我们随时可以 “反悔”。
使用 “git reset HEAD ” 命令可以取消暂存区的文件快照(即恢复成最后一个提交版本),这不会影响工作目录的文件修改。
使用 “git checkout — ” 可以使用暂存区快照恢复工作目录文件,工作目录的文件修改被抛弃。
$ git chekcout — readme
在 Git 中 “HEAD” 表示仓库中最后一个提交版本,”HEAD^” 是倒数第二个版本,”HEAD~2″ 则是更老的版本。
我们可以直接 “签出” 代码仓库中的某个文件版本到工作目录,该操作同时会取消暂存区快照。
$ git checkout HEAD^ readme
如果想将整个项目回溯到以前的某个版本,可以使用 “git reset”。可以选择的参数包括默认的 “–mixed” 和 “–hard”,前者不会取消工作目录的修改,而后者则放弃全部的修改。该操作会丢失其后的日志。
$ git reset –hard HEAD^
(6) 日志
每次提交都会为整个项目创建一个版本,我们可以通过日志来查看相关信息。
参数 “git log -p” 可以查看详细信息,包括修改的内容。
参数 “git log -2” 查看最后两条日志。
参数 “git log –stat” 可以查看统计摘要。
$ git log –stat -2 -p
commit c11364da1bde38f55000bc6dea9c1dda426c00f9
Author: Q.yuhen
Date: Sun Jul 18 15:53:55 2010 +0800
b
—
0 files changed, 0 insertions(+), 0 deletions(-)
diff –git a/install b/install
new file mode 100644
index 0000000..e69de29
commit 784b289acc8dccd1d2d9742d17f586ccaa56a3f0
Author: Q.yuhen
Date: Sun Jul 18 15:33:24 2010 +0800
a
—
0 files changed, 0 insertions(+), 0 deletions(-)
diff –git a/readme b/readme
new file mode 100644
index 0000000..e69de29
(7) 重做
马有失蹄,使用 “git commit –amend” 可以重做最后一次提交。
$ git commit –amend -am “b2”
[master 6abac48] b2
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 abc
create mode 100644 install
$ git log
commit 6abac48c014598890c6c4f47b4138f6be020e403
Author: Q.yuhen
Date: Sun Jul 18 15:53:55 2010 +0800
b2
commit 784b289acc8dccd1d2d9742d17f586ccaa56a3f0
Author: Q.yuhen
Date: Sun Jul 18 15:33:24 2010 +0800
a #p#副标题#e#(8) 查看
使用 “git show” 可以查看日志中文件的变更信息,默认显示最后一个版本(HEAD)。
$ git show readme
$ git show HEAD^ readme
(9) 标签
可以使用标签(tag)对最后提交的版本做标记,如此可以方便记忆和操作,这通常也是一个里程碑的标志。
$ git tag v0.9
$ git tag
v0.9
$ git show v0.9
commit 3fcdd49fc0f0a45cd283a86bc743b4e5a1dfdf5d
Author: Q.yuhen
Date: Sun Jul 18 14:53:55 2010 +0800
…
可以直接用标签号代替日志版本号进行操作。
$ git log v0.9
commit 3fcdd49fc0f0a45cd283a86bc743b4e5a1dfdf5d
Author: Q.yuhen
Date: Sun Jul 18 14:53:55 2010 +0800
a
4. 工作分支
用 Git 一定得习惯用分支进行工作。
使用 “git branch ” 创建分支,还可以创建不以当前版本为起点的分支 “git branch HEAD^”。
使用 “git checkout ” 切换分支。
$ git branch yuhen
$ git checkout yuhen
Switched to branch ‘yuhen’
$ git branch
master
* yuhen
使用 “git chekcout -b ” 一次完成分支创建和切换操作。
$ git checkout -b yuhen
Switched to a new branch ‘yuhen’
$ git branch
master
* yuhen
在分支中完成提交,然后切换回主分支进行合并(git merge)和删除(git branch -d )操作。
$ git checkout master
Switched to branch ‘master’
$ git merge yuhen
Updating 6abac48..7943312
Fast-forward
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 abc.txt
$ git branch -d yuhen
Deleted branch yuhen (was 7943312).
$ git branch
* master
附注: 如果当前工作目录有未提交的内容,直接切换到其他分支会将变更一同带入。
5. 服务器
(1) 首先克隆服务器代码仓库。
$ git clone git@192.168.1.202:/git.server/project1 # SSH
完成克隆后,可以用 origin 来代替服务器地址。使用 “git remote” 命令查看相关信息。
$ git remote
origin
$ git remote show origin
* remote origin
Fetch URL: …
Push URL: …
HEAD branch: master
Remote branch:
master tracked
Local branch configured for ‘git pull’:
master merges with remote master
Local ref configured for ‘git push’:
master pushes to master (up to date)
还可以创建新的 remote 设置。
$ git remote add project1 git@192.168.1.202:/git.server/project1
$ git remote
origin
project1
$ git remote rm project1
(2) 在将代码提交(push)到服务器之前,首先要确认相关更新已经合并(merge)到主分支(master)。还应该先从服务器刷新(pull)最新代码,以确保自己的提交不会和别人最新提交的代码冲突。
$ git pull origin master
$ git push origin master
(3) 要提交标签到服务器,需要额外操作。
$ git push origin –tags
6. 管理
检查损坏情况。
$ git fsck
清理无用数据。
$ git gc