Git全解析之用起来先

Git全解析之用起来先
先安装Git环境
下载安装:http://git-scm.com/download/
配置
配置user与email,用来标识用户
12 |
$ git config --global user.name "wustrive"$ git config --global user.email "wustrive2008@gmail.com" |
也可以直接编辑配置文件,配置文件默认路径在用户目录下的.gitconfig文件中,结构是:
123 |
[user] name = wustrive email = wustrive2008@gmail.com |
简单了解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’的目录一般在项目的根目录下,
这个目录下的重要文件有:
1234567891011121314 |
.|-- 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文件的地方。
可以开始使用了
获取仓库
创建仓库,在工作目录下执行
1
git init .
clone一个仓库
1234
#通过http(s)协议git clone https://github.com/git/git.git#通过ssh协议git clone git@github.com:git/git.git
提示:创建和clone后默认的分支是master,默认的repository引用名称origin
正常的工作流程
修改文件,将它们更新的内容添加到索引中
123
git add file1 file2 file3#也可以通过git add . 来添加所有变动到暂存区git add .
查看当状态
123456789
$ git status# On branch master# Changes to be committed:# (use "git reset HEAD <file>..." to unstage)## modified: file1# modified: file2# modified: file3#
提交commit
12345678
#执行后会进入编辑器进行注释编辑$ git commit #如果注释很短也可以使用$ git commit -m "注释内容" #如果只是修改了文件,没有添加新的文件,可以省略git add$ git commit -am "注释内容"
分支与合并
基本操作命令
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
#查看本地分支 *代表当前所在分支[centos@bogon gittest]$ git branch* master #新建分支[centos@bogon gittest]$ git branch br1[centos@bogon gittest]$ git branch br1* master #切换分支[centos@bogon gittest]$ git checkout br1Switched to branch 'br1'[centos@bogon gittest]$ git branch* br1 master #切换并合并分支,以当前分支为基础新建分支[centos@bogon gittest]$ lltotal 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 br2Switched to a new branch 'br2'[centos@bogon gittest]$ lltotal 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]$ lltotal 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 br2Updating da5068b..f9da174Fast-forward br2-file | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 br2-file[centos@bogon gittest]$ lltotal 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 br2Deleted branch br2 (was f9da174).[centos@bogon gittest]$ git branch br1* master #强制删除分支[centos@bogon gittest]$ git branch br1* master[centos@bogon gittest]$ git branch -D br1Deleted branch br1 (was da5068b).[centos@bogon gittest]$ git branch* master |
分支冲突
如果执行自动合并没有成功的话,git会在索引和工作树里设置一个特殊的状态, 提示你如何解决合并中出现的冲突。
123456789101112 |
[centos@bogon gittest]$ git merge br1Auto-merging file1CONFLICT (content): Merge conflict in file1Automatic merge failed; fix conflicts and then commit the result.[centos@bogon gittest]$ git status# On branch master# Unmerged paths:# (use "git add/rm <file>..." as appropriate to mark resolution)## both modified: file1#no changes added to commit (use "git add" and/or "git commit -a") |
有冲突(conflicts)的文件会保存在索引中,在commit之前要解决冲突,解决冲突的方式就是编辑冲突文件,重新commit。
撤销合并
12345678910 |
#如果合并分支后又后悔了,可以撤销合并[centos@bogon gittest]$ git reset --hard HEADHEAD is now at 2fa716d file1 master[centos@bogon gittest]$ git status# On branch masternothing to commit (working directory clean) #如果已经把合并后的代码提交了,可以执行[centos@bogon gittest]$ git reset --hard ORIG_HEADHEAD is now at 2fa716d file1 master |
log记录
1234567891011 |
$ 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 |
示例:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
#查看当前分支log[centos@bogon gittest]$ git logcommit 2fa716df1d841ac2347cd9b6d371cfdf71682dfeAuthor: wubaoguo <wustrive_2008@126.com>Date: Wed Jan 6 23:53:20 2016 +0800
file1 master
commit f9da1748bddb6cfcc0f492f60328abcd54f97663Author: wubaoguo <wustrive_2008@126.com>Date: Wed Jan 6 23:44:08 2016 +0800
br2
commit da5068b35246dc26b77105a6dc6c2aa6e430fcadAuthor: wubaoguo <wustrive_2008@126.com>Date: Wed Jan 6 23:38:39 2016 +0800
init
#查看详细变动[centos@bogon gittest]$ git log --statcommit 2fa716df1d841ac2347cd9b6d371cfdf71682dfeAuthor: wubaoguo <wustrive_2008@126.com>Date: Wed Jan 6 23:53:20 2016 +0800
file1 master
file1 | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
commit f9da1748bddb6cfcc0f492f60328abcd54f97663Author: wubaoguo <wustrive_2008@126.com>Date: Wed Jan 6 23:44:08 2016 +0800
br2
br2-file | 1 + 1 files changed, 1 insertions(+), 0 deletions(-)
commit da5068b35246dc26b77105a6dc6c2aa6e430fcadAuthor: wubaoguo <wustrive_2008@126.com>Date: Wed Jan 6 23:38:39 2016 +0800
init
#格式化log输出结果[centos@bogon gittest]$ git log --pretty=oneline2fa716df1d841ac2347cd9b6d371cfdf71682dfe file1 masterf9da1748bddb6cfcc0f492f60328abcd54f97663 br2da5068b35246dc26b77105a6dc6c2aa6e430fcad init
#更友好的格式化,历史多了效果明显[centos@bogon gittest]$ git log --pretty=format:'%h : %s' --graph* 2fa716d : file1 master* f9da174 : br2* da5068b : init
|
比较差异DIFF
12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
#比较分支间的差异[centos@bogon gittest]$ git diff master..br1diff --git a/file1 b/file1index 3325d54..76e65f5 100644--- a/file1+++ b/file1@@ -1 +1 @@-file1 master+file1 br1 #工作目录与暂存区(staged)差异[centos@bogon gittest]$ git diffdiff --git a/file2 b/file2index e69de29..35d5537 100644--- a/file2+++ b/file2@@ -0,0 +1,2 @@+diff 的使用+ #暂存区与上次提交之间的差异[centos@bogon gittest]$ git add .[centos@bogon gittest]$ git diff --cacheddiff --git a/file2 b/file2index e69de29..35d5537 100644--- a/file2+++ b/file2@@ -0,0 +1,2 @@+diff 的使用+ #工作目录与上次提交之间的差异[centos@bogon gittest]$ git diff HEADdiff --git a/file2 b/file2index e69de29..35d5537 100644--- a/file2+++ b/file2@@ -0,0 +1,2 @@+diff 的使用+diff --git a/file3 b/file3index e69de29..1bf6afb 100644--- a/file3+++ b/file3@@ -0,0 +1 @@+还没commit 工作目录又改动了 |
附录 .gitconfig文件配置参考
12345678910111213141516171819202122232425262728293031323334353637 |
[user] name = zhangsan email = zhangsan@gmail.com[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》
Git全解析之用起来先的更多相关文章
- Git全解析之远程仓库交互
文章目录 1. Git全解析之远程仓库交互 1.1. 中央仓库的概念 1.2. 本地分支与远程分支 1.3. pull与fetch 1.4. 关于捐赠 Git全解析之远程仓库交互 中央仓库的概念 虽然 ...
- 一扫天下——ZXing使用全解析
一扫天下--ZXing使用全解析 二维码如今已经烂App了,无论什么App.没有二维码就好像低人一等了. 所以,在自己的项目中集成二维码功能还是非常有必要的. 网上非常多都是基于ZXing2.3的.可 ...
- Python 最常见的 170 道面试题全解析:2019 版
Python 最常见的 170 道面试题全解析:2019 版 引言 最近在刷面试题,所以需要看大量的 Python 相关的面试题,从大量的题目中总结了很多的知识,同时也对一些题目进行拓展了,但是在看了 ...
- Google Maps地图投影全解析(3):WKT形式表示
update20090601:EPSG对该投影的编号设定为EPSG:3857,对应的WKT也发生了变化,下文不再修改,相对来说格式都是那样,可以到http://www.epsg-registry.or ...
- C#系统缓存全解析(转载)
C#系统缓存全解析 对各种缓存的应用场景和方法做了很详尽的解读,这里推荐一下 转载地址:http://blog.csdn.net/wyxhd2008/article/details/8076105
- 【凯子哥带你学Framework】Activity界面显示全解析
前几天凯子哥写的Framework层的解析文章<Activity启动过程全解析>,反响还不错,这说明“写让大家都能看懂的Framework解析文章”的思想是基本正确的. 我个人觉得,深入分 ...
- iOS Storyboard全解析
来源:http://iaiai.iteye.com/blog/1493956 Storyboard)是一个能够节省你很多设计手机App界面时间的新特性,下面,为了简明的说明Storyboard的效果, ...
- 【转载】Fragment 全解析(1):那些年踩过的坑
http://www.jianshu.com/p/d9143a92ad94 Fragment系列文章:1.Fragment全解析系列(一):那些年踩过的坑2.Fragment全解析系列(二):正确的使 ...
- (转)ASP.NET缓存全解析6:数据库缓存依赖
ASP.NET缓存全解析文章索引 ASP.NET缓存全解析1:缓存的概述 ASP.NET缓存全解析2:页面输出缓存 ASP.NET缓存全解析3:页面局部缓存 ASP.NET缓存全解析4:应用程序数据缓 ...
随机推荐
- How to customize authentication to my own set of tables in asp.net web api 2?
ssuming your table is called AppUser, convert your own AppUser domain object to IUser(using Microsof ...
- Alljoyn 概述(3)
开发工具 • scons:一个 Python写的自动化构建工具,是对 gnu make 改进的替代工具 • D-Feet:一个D-Bus调试工具 • C++ Code Generator Tool ( ...
- 【转】iOS开发6:UIActionSheet与UIAlertView
原文: http://my.oschina.net/plumsoft/blog/42763 iOS程序中的Action Sheet就像Windows中的 “确定-取消”对话框一样,用于强制用户进行选择 ...
- DataSet与DataTable基本用法
http://files.cnblogs.com/files/monkeyZhong/DataSetExample.rar 在设计数据库操作或者XML操作等表格数据时,我们难免要跟DataSet和Da ...
- 使用BeanUtils组件
使用BeanUtils组件 前提 1:导入commons-beanutils-1.8.3.jar //根据 本人使用的是1.8.3的版本 2:导入日志包 //就是loggin ...
- 《zip命令》-linux命令五分钟系列之九
本原创文章属于<Linux大棚>博客. 博客地址为http://roclinux.cn. 文章作者为roc 希望您能通过捐款的方式支持Linux大棚博客的运行和发展.请见“关于捐款” == ...
- C# 跨线程访问控件
this.BeginInvoke(new Action(() => { this.StatusProgressBar_ExecutingTaskStatus.Value = (int)value ...
- Java 8 与 .Net的平台发展
从早期版本中,我们已经可以领略到一些令人兴奋的特性.但是开发真Andrew C.Oliver表示,尽管如此,Java语言在某些特性上还是落后于.Net.比如,Java 8 中最令人期待的Lambda表 ...
- 滚动条响应鼠标滑轮事件实现上下滚动的js代码
<script type="text/javascript"> var scrollFunc=function(e){ e=e || window.event; if( ...
- Android Toast和Notification
1. Toast用法 Toast 可以设置:时间,位置,自定义View 1.1 最普通的Toast Toast.makeText(ToastActivity.this, "CarloZ Sh ...