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 ssh://user@server:3387/git/myproj$ git clone git://github.com/schacon/grit.git mygrit
3. 基本操作
Git 分为 "工作目录"、"暂存区"、"代码仓库" 三个部分。
(1) 添加
文件通过 "git add <file>" 被添加到暂存区,如此暂存区将拥有一份文件快照。
$ git add .$ git add file1 file2$ git add *.c
"git add" 除了添加新文件到暂存区进行跟踪外,还可以刷新已被跟踪文件的快照。需要注意的是,被提交到代码仓库的是暂存区的快照,而不是工作目录中的文件。
(2) 提交
"git commit -m <message>" 命令将暂存区的快照提交到代码仓库。
$ git commit -m "message"
在执行 commit 提交时,我们通常会直接使用 "-a" 参数。该参数的含义是:刷新暂存区快照,提交时同时移除被删除的文件。但该参数并不会添加未被跟踪的新文件,依然需要执行 "git add <file>" 操作。
$ 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 <file>..." to update what will be committed)# (use "git checkout -- <file>..." to discard changes in working directory)## modified: readme## Untracked files:# (use "git add <file>..." to include in what will be committed)## installno 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 readmediff --git a/readme b/readmeindex e69de29..df8285e 100644--- a/readme+++ b/readme@@ -0,0 +1,2 @@+1111111111111111111+
(5) 撤销
作为代码管理工作,我们随时可以 "反悔"。
使用 "git reset HEAD <filename>" 命令可以取消暂存区的文件快照(即恢复成最后一个提交版本),这不会影响工作目录的文件修改。
使用 "git checkout -- <filename>" 可以使用暂存区快照恢复工作目录文件,工作目录的文件修改被抛弃。
$ 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 -pcommit c11364da1bde38f55000bc6dea9c1dda426c00f9Author: Q.yuhen <qyuhen@hotmail.com>Date: Sun Jul 18 15:53:55 2010 +0800 b--- 0 files changed, 0 insertions(+), 0 deletions(-)diff --git a/install b/installnew file mode 100644index 0000000..e69de29commit 784b289acc8dccd1d2d9742d17f586ccaa56a3f0Author: Q.yuhen <qyuhen@hotmail.com>Date: Sun Jul 18 15:33:24 2010 +0800 a--- 0 files changed, 0 insertions(+), 0 deletions(-)diff --git a/readme b/readmenew file mode 100644index 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 logcommit 6abac48c014598890c6c4f47b4138f6be020e403Author: Q.yuhen <qyuhen@hotmail.com>Date: Sun Jul 18 15:53:55 2010 +0800 b2commit 784b289acc8dccd1d2d9742d17f586ccaa56a3f0Author: Q.yuhen <qyuhen@hotmail.com>Date: Sun Jul 18 15:33:24 2010 +0800 a
(8) 查看
使用 "git show" 可以查看日志中文件的变更信息,默认显示最后一个版本(HEAD)。
$ git show readme $ git show HEAD^ readme
(9) 标签
可以使用标签(tag)对最后提交的版本做标记,如此可以方便记忆和操作,这通常也是一个里程碑的标志。
$ git tag v0.9$ git tagv0.9$ git show v0.9commit 3fcdd49fc0f0a45cd283a86bc743b4e5a1dfdf5dAuthor: Q.yuhen <qyuhen@hotmail.com>Date: Sun Jul 18 14:53:55 2010 +0800...
可以直接用标签号代替日志版本号进行操作。
$ git log v0.9commit 3fcdd49fc0f0a45cd283a86bc743b4e5a1dfdf5dAuthor: Q.yuhen <qyuhen@hotmail.com>Date: Sun Jul 18 14:53:55 2010 +0800 a
4. 工作分支
用 Git 一定得习惯用分支进行工作。
使用 "git branch <name>" 创建分支,还可以创建不以当前版本为起点的分支 "git branch <name> HEAD^"。
使用 "git checkout <name>" 切换分支。
$ git branch yuhen$ git checkout yuhenSwitched to branch 'yuhen'$ git branch master* yuhen
使用 "git chekcout -b <name>" 一次完成分支创建和切换操作。
$ git checkout -b yuhenSwitched to a new branch 'yuhen'$ git branch master* yuhen
在分支中完成提交,然后切换回主分支进行合并(git merge)和删除(git branch -d <name>)操作。
$ git checkout masterSwitched to branch 'master'$ git merge yuhenUpdating 6abac48..7943312Fast-forward 0 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 abc.txt$ git branch -d yuhenDeleted branch yuhen (was 7943312).$ git branch* master
附注: 如果当前工作目录有未提交的内容,直接切换到其他分支会将变更一同带入。
5. 服务器
(1) 首先克隆服务器代码仓库。
$ git clone git@192.168.1.202:/git.server/project1 # SSH
完成克隆后,可以用 origin 来代替服务器地址。使用 "git remote" 命令查看相关信息。
$ git remoteorigin$ 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 remoteoriginproject1$ git remote rm project1
(2) 在将代码提交(push)到服务器之前,首先要确认相关更新已经合并(merge)到主分支(master)。还应该先从服务器刷新(pull)最新代码,以确保自己的提交不会和别人最新提交的代码冲突。
$ git pull origin master$ git push origin master
(3) 要提交标签到服务器,需要额外操作 (先执行 git push 提交,然后再执行该指令)。
$ git push origin --tags
6. 管理
检查损坏情况。
$ git fsck
清理无用数据。
$ git gc
联系客服