先安装Git环境
下载安装:http://git-scm.com/download/
配置
配置user与email,用来标识用户
$ git config --global user.name "wustrive"
$ git config --global user.email "[email protected]"
也可以直接编辑配置文件,配置文件默认路径在用户目录下的.gitconfig文件中,结构是:
[user]
name = wustrive
email = [email protected]
简单了解Git
Git是一个快速的分布式版本控制系统
Git对象模型 SHA
所有用来表示项目历史信息的文件是通过一个40个字符“对象名”来索引的。每一个“对象名”都是对“对象”内容做SHAI哈希计算来的。这个对象名是全局唯一的,不同的对象生成的“对象名”不同。
Git中四种类型的对象:"blob","tree","commit"和"tag"。每个对象包括三个部分:类型,大小和内容。
- blob用来存储文件数据
- tree有点像一个目录,用来管理一些blob与tree
- commit,一个commit只指向一个tree,用来标记项目某一个特定时间点的状态,即一次提交
- tag,一个tag用来标记一个commit
Git目录与工作目录
git目录是为你的项目存储所有历史和元信息的目录,包括所有对象,这些对象指向不同的分支,每个项目只能有一个Git目录,这个叫'.git'的目录一般在项目的根目录下,
这个目录下的重要文件有:
.
|-- FETCH_HEAD #指向着目前已经从远程仓库取下来的分支的末端版本。
|-- HEAD #这个git项目当前处在哪个分支里
|-- ORIG_HEAD #HEAD指针的前一个状态
|-- branches/ #项目的所有分支
|-- config/ #项目的配置信息,git config命令会改动它
|-- description #项目的描述信息
|-- hooks/ #系统默认钩子脚本目录
|-- index #索引文件
|-- info/ #包含仓库的一些信息
|-- logs/ #各个refs的历史信息
|-- objects/ #Git本地仓库的所有对象 (commits, trees, blobs, tags)
|-- packed-refs #运行 git gc, refs 下的所有文件都会消失。Git 会将这些文件挪到 .git/packed-refs 文件中去以提高效率
|-- refs/ #标识你项目里的每个分支指向了哪个提交(commit)
工作目录就是你的项目源代码目录,即是你签出(checkout)用来编辑的文件,当在不同的分支间切换时,工作目录里的内容会随之替换或删除,所有的操作历史都保存在Git目录中,工作目录是用来临时保存checkout文件的地方。
可以开始使用了
获取仓库
- 创建仓库,在工作目录下执行
git init .
- clone一个仓库
#通过http(s)协议
git clone https://github.com/git/git.git
#通过ssh协议
git clone [email protected]:git/git.git
提示:创建和clone后默认的分支是master,默认的repository引用名称origin
正常的工作流程
- 修改文件,将它们更新的内容添加到索引中
git add file1 file2 file3
#也可以通过git add . 来添加所有变动到暂存区
git add .
- 查看当状态
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD ..." to unstage)
#
# modified: file1
# modified: file2
# modified: file3
#
- 提交commit
#执行后会进入编辑器进行注释编辑
$ git commit
#如果注释很短也可以使用
$ git commit -m "注释内容"
#如果只是修改了文件,没有添加新的文件,可以省略git add
$ git commit -am "注释内容"
分支与合并
基本操作命令
#查看本地分支 *代表当前所在分支
[centos@bogon gittest]$ git branch
* master
#新建分支
[centos@bogon gittest]$ git branch br1
[centos@bogon gittest]$ git branch
br1
* master
#切换分支
[centos@bogon gittest]$ git checkout br1
Switched to branch 'br1'
[centos@bogon gittest]$ git branch
* br1
master
#切换并合并分支,以当前分支为基础新建分支
[centos@bogon gittest]$ ll
total 0
-rw-rw-r--. 1 centos centos 0 Jan 6 23:32 file1
-rw-rw-r--. 1 centos centos 0 Jan 6 23:32 file2
-rw-rw-r--. 1 centos centos 0 Jan 6 23:32 file3
[centos@bogon gittest]$ git branch
* br1
master
[centos@bogon gittest]$ git checkout -b br2
Switched to a new branch 'br2'
[centos@bogon gittest]$ ll
total 0
-rw-rw-r--. 1 centos centos 0 Jan 6 23:32 file1
-rw-rw-r--. 1 centos centos 0 Jan 6 23:32 file2
-rw-rw-r--. 1 centos centos 0 Jan 6 23:32 file3
[centos@bogon gittest]$ git branch
br1
* br2
master
#合并分支,将其他分支合并到当前分支
[centos@bogon gittest]$ ll
total 0
-rw-rw-r--. 1 centos centos 0 Jan 6 23:32 file1
-rw-rw-r--. 1 centos centos 0 Jan 6 23:32 file2
-rw-rw-r--. 1 centos centos 0 Jan 6 23:32 file3
[centos@bogon gittest]$ git merge br2
Updating da5068b..f9da174
Fast-forward
br2-file | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 br2-file
[centos@bogon gittest]$ ll
total 4
-rw-rw-r--. 1 centos centos 10 Jan 6 23:44 br2-file
-rw-rw-r--. 1 centos centos 0 Jan 6 23:32 file1
-rw-rw-r--. 1 centos centos 0 Jan 6 23:32 file2
-rw-rw-r--. 1 centos centos 0 Jan 6 23:32 file3
#删除分支,删除已经被合并过的分支,安全删除分支
[centos@bogon gittest]$ git branch
br1
br2
* master
[centos@bogon gittest]$ git branch -d br2
Deleted branch br2 (was f9da174).
[centos@bogon gittest]$ git branch
br1
* master
#强制删除分支
[centos@bogon gittest]$ git branch
br1
* master
[centos@bogon gittest]$ git branch -D br1
Deleted branch br1 (was da5068b).
[centos@bogon gittest]$ git branch
* master
分支冲突
如果执行自动合并没有成功的话,git会在索引和工作树里设置一个特殊的状态, 提示你如何解决合并中出现的冲突。
[centos@bogon gittest]$ git merge br1
Auto-merging file1
CONFLICT (content): Merge conflict in file1
Automatic merge failed; fix conflicts and then commit the result.
[centos@bogon gittest]$ git status
# On branch master
# Unmerged paths:
# (use "git add/rm ..." as appropriate to mark resolution)
#
# both modified: file1
#
no changes added to commit (use "git add" and/or "git commit -a")
有冲突(conflicts)的文件会保存在索引中,在commit之前要解决冲突,解决冲突的方式就是编辑冲突文件,重新commit。
撤销合并
#如果合并分支后又后悔了,可以撤销合并
[centos@bogon gittest]$ git reset --hard HEAD
HEAD is now at 2fa716d file1 master
[centos@bogon gittest]$ git status
# On branch master
nothing to commit (working directory clean)
#如果已经把合并后的代码提交了,可以执行
[centos@bogon gittest]$ git reset --hard ORIG_HEAD
HEAD is now at 2fa716d file1 master
log记录
$ git log v2.5.. # commits since (not reachable from) v2.5
$ git log test..master # commits reachable from master but not test
$ git log master..test # commits reachable from test but not master
$ git log master...test # commits reachable from either test or
# master, but not both
$ git log --since="2 weeks ago" # commits from the last 2 weeks
$ git log Makefile # commits that modify Makefile
$ git log fs/ # commits that modify any file under fs/
$ git log -S'foo()\' # commits that add or remove any file data
# matching the string 'foo()'
$ git log --no-merges # dont show merge commits
示例:
#查看当前分支log
[centos@bogon gittest]$ git log
commit 2fa716df1d841ac2347cd9b6d371cfdf71682dfe
Author: wubaoguo
Date: Wed Jan 6 23:53:20 2016 +0800
file1 master
commit f9da1748bddb6cfcc0f492f60328abcd54f97663
Author: wubaoguo
Date: Wed Jan 6 23:44:08 2016 +0800
br2
commit da5068b35246dc26b77105a6dc6c2aa6e430fcad
Author: wubaoguo
Date: Wed Jan 6 23:38:39 2016 +0800
init
#查看详细变动
[centos@bogon gittest]$ git log --stat
commit 2fa716df1d841ac2347cd9b6d371cfdf71682dfe
Author: wubaoguo
Date: Wed Jan 6 23:53:20 2016 +0800
file1 master
file1 | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
commit f9da1748bddb6cfcc0f492f60328abcd54f97663
Author: wubaoguo
Date: Wed Jan 6 23:44:08 2016 +0800
br2
br2-file | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
commit da5068b35246dc26b77105a6dc6c2aa6e430fcad
Author: wubaoguo
Date: Wed Jan 6 23:38:39 2016 +0800
init
#格式化log输出结果
[centos@bogon gittest]$ git log --pretty=oneline
2fa716df1d841ac2347cd9b6d371cfdf71682dfe file1 master
f9da1748bddb6cfcc0f492f60328abcd54f97663 br2
da5068b35246dc26b77105a6dc6c2aa6e430fcad init
#更友好的格式化,历史多了效果明显
[centos@bogon gittest]$ git log --pretty=format:'%h : %s' --graph
* 2fa716d : file1 master
* f9da174 : br2
* da5068b : init
比较差异DIFF
#比较分支间的差异
[centos@bogon gittest]$ git diff master..br1
diff --git a/file1 b/file1
index 3325d54..76e65f5 100644
--- a/file1
+++ b/file1
@@ -1 +1 @@
-file1 master
+file1 br1
#工作目录与暂存区(staged)差异
[centos@bogon gittest]$ git diff
diff --git a/file2 b/file2
index e69de29..35d5537 100644
--- a/file2
+++ b/file2
@@ -0,0 +1,2 @@
+diff 的使用
+
#暂存区与上次提交之间的差异
[centos@bogon gittest]$ git add .
[centos@bogon gittest]$ git diff --cached
diff --git a/file2 b/file2
index e69de29..35d5537 100644
--- a/file2
+++ b/file2
@@ -0,0 +1,2 @@
+diff 的使用
+
#工作目录与上次提交之间的差异
[centos@bogon gittest]$ git diff HEAD
diff --git a/file2 b/file2
index e69de29..35d5537 100644
--- a/file2
+++ b/file2
@@ -0,0 +1,2 @@
+diff 的使用
+
diff --git a/file3 b/file3
index e69de29..1bf6afb 100644
--- a/file3
+++ b/file3
@@ -0,0 +1 @@
+还没commit 工作目录又改动了
附录 .gitconfig文件配置参考
[user]
name = zhangsan
email = [email protected]
[color]
branch = auto
diff = auto
status = auto
ui = auto
[core]
quotepath=false
edit = vim
autocrlf = true
filemode = false
[i18n]
commitencoding = UTF-8
[gui]
encoding = utf-8
[alias]
stage = add
unstage = reset HEAD
hb = merge --no-ff
rmv = remote -v
ci = commit
cia = commit --amend
co = checkout
br = branch
st = status
dc = diff --cached
dw = diff --word-diff
aa = add -A
rmall = !git ls-files --deleted | xargs git rm
ll = log --pretty=format:"%C(yellow)%h%Cred%d%Creset\\ %cn\\ %Cblue%cr%Creset\\ %Cgreen%s%Creset" --decorate --numstat
lg = log --pretty=format:"%C(yellow)%h%Cred%d%Creset\\ %cn\\ %Cblue%cr%Creset\\ %Cgreen%s%Creset" --decorate
lt = log --pretty=format:"%C(yellow)%h%Cred%d%Creset\\ %cn\\ %Cblue%cr%Creset\\ %Cgreen%s%Creset" --graph
[receive]
denyCurrentBranch = ignore
更多配置文件参考: https://github.com/wustrive2008/conf-file
参考
《Git Community Book》