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:应用程序数据缓 ...
随机推荐
- dnw for linux: Ubuntu下可用,无需编译驱动,mini2440可用
1.安装所需库文件 sudo apt-get install libusb-dev 2.源代码如下 /* dnw2 linux main file. This depends on libusb. * ...
- (九)打印机驱动设置—USB接口的设置
佳博打印机代理商淘宝店https://shop107172033.taobao.com/index.htm?spm=2013.1.w5002-9520741823.2.Sqz8Pf 在此店购买的打印机 ...
- Struts2默认拦截器配置
http://blog.csdn.net/axin66ok/article/details/7321430
- 【转】iOS-Core-Animation-Advanced-Techniques(三)
原文: http://www.cocoachina.com/ios/20150105/10827.html 专用图层 复杂的组织都是专门化的--Catharine R. Stimpson 到目前为止, ...
- 百度ios 开发面试题
百度移动云可穿戴部门的面试经历,面试官都非常热情友好,一上来到弄的我挺不好意思的.下面记录一下自己的面试过程,因为我真的没啥面试经验,需要总结下. 1面 Objective C runtime lib ...
- TestNG扩展
1. TestNG API 本章节将讨论如何使用TestNG API来创建自己的TestNG对象.TestNG的API基本由接口组成,这样做是为了容易模拟TestNG返回的对象. 1.1 org.te ...
- [前端笔记]第三篇:JavaScript
JavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理. 一.代码存放位置 J ...
- uboot使用tftp下载时出现“checksum bad”问题原因分析
一.问题 二.原因分析 你的虚拟机是不是这样设置的呢? 如果是的话,请看下边的解释: 使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网.也就是说,使用NA ...
- 关于Unity导出的Android应用在小米、联想等机型上崩溃的问题
应用在三星手机上运行没有出现问题,但在小米和联想手机上会崩溃.这个问题在刚开始时一直查不到问题所在,后来发现是因为Android清单文件中声明的权限出现了重复,去掉了重复的权限之后,就没有出现崩溃的情 ...
- 转:gpio_request
今天再次学习SD卡驱动,遇到pgio_request这个函数,始终不知道其什么意思,看了几遍源代码才有了点感觉.现将其关键部分再此说明一下,以备自己以后复习,或是路客参考. 一般gpio_reques ...