欢迎使用CSDN-markdown编辑器

来源:互联网 发布:mac电脑游戏推荐 编辑:程序博客网 时间:2024/06/18 08:38

Git基础篇
一.Git是什么&为什么使用Git?
git是什么
Git项目是Linus Torvalds在2005年的时候为了支持Linux kernel项目而开发的。
Git是一个分布式的版本控制系统。
建立一个空目录,从远程服务器上同步一个或多个项目的内容到本地
每个工作目录中都是一个项目的完全拷贝,带有全部的版本历史信息。
查看变化和做提交的时候是不需要联网的。
为什么使用Git?
* 速度快 直接快照,而非比较差异,近乎所有操作都可本地执行
* 简单的设计
* 对非线性开发模式的强力支持(允许上千个并行开发的分支)
* 完全分布式
* 开源、免费的
* 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
二.Git简介
Git的三种状态
已提交(committed)
已修改(modified)
已暂存(staged)
Git的三个工作区域
本地数据目录
工作目录
暂存区域
Git的基本工作流程
1. 在工作目录中修改某些文件。
2. 对这些修改了的文件作快照,并保存到暂存区域。
3. 提交更新,将保存在暂存区域的文件快照转储到 git 目录中。
所以,我们可以从文件所处的位置来判断状态:如果是 git 目录中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。

Git文件存储
blob–文件内容,没有属性信息
tree – 所有文件名字及其属性的列表
commit–表示修改历史,描述一个个tree之间如何联系起来
tag–标签,它可以指向blob,tree,commit,大部分是commit

1) Git 目录( .git )
每个项目都只有一个.git目录,为项目存储所有元数据和对象数据库。包括所有的对象(commits,trees,blobs,tags),这些对象指向不同的分支。
该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。
2) Git 工作目录
Git的工作目录存储从项目中取出的某个版本的所有文件和目录。
当在项目的不同分支间切换时,工作目录里的文件经常会被替换和删除。所有历史信息都保存在GIT目录(.git)中;
3) Git 暂存区域
所谓的暂存区域只不过是一个简单的文件,一般都放在 Git 目录中。有时候人们会把这个文件叫做索引文件
三.Git配置
.gitconfig配置文件

Git 使用一系列配置文件来保存你自定义的行为。 它首先会查找 /etc/gitconfig 文件,该文件含有系统里每位用户及他们所拥有的仓库的配置值。 如果你传递 –system 选项给 git config,它就会读写该文件。
接下来 Git 会查找每个用户的 ~/.gitconfig 文件(或者 ~/.config/git/config 文件)。 你可以传递 –global 选项让 Git 读写该文件。
最后 Git 会查找你正在操作的版本库所对应的 Git 目录下的配置文件(.git/config)。 这个文件中的值只对该版本库有效。
以上三个层次中每层的配置(系统、全局、本地)都会覆盖掉上一层次的配置,所以 .git/config 中的值会覆盖掉 /etc/gitconfig 中所对应的值。
格式化与多余的空白字符

格式化与多余的空白字符是许多开发人员在协作时,特别是在跨平台情况下,不时会遇到的令人头疼的琐碎的问题。 由于编辑器的不同或者文件行尾的换行符在 Windows 下被替换了,一些细微的空格变化会不经意地混入提交的补丁或其它协作成果中。 不用怕,Git 提供了一些配置项来帮助你解决这些问题。

core.autocrlf
假如你正在 Windows 上写程序,而你的同伴用的是其他系统(或相反),你可能会遇到 CRLF 问题。 这是因为 Windows 使用回车(CR)和换行(LF)两个字符来结束一行,而 Mac 和 Linux 只使用换行(LF)一个字符。 虽然这是小问题,但它会极大地扰乱跨平台协作。许多 Windows 上的编辑器会悄悄把行尾的换行字符转换成回车和换行,或在用户按下 Enter 键时,插入回车和换行两个字符。

Git 可以在你提交时自动地把回车和换行转换成换行,而在检出代码时把换行转换成回车和换行。 你可以用 core.autocrlf 来打开此项功能。 如果是在 Windows 系统上,把它设置成 true,这样在检出代码时,换行会被转换成回车和换行:

$ git config –global core.autocrlf true
如果使用以换行作为行结束符的 Linux 或 Mac,你不需要 Git 在检出文件时进行自动的转换;然而当一个以回车加换行作为行结束符的文件不小心被引入时,你肯定想让 Git 修正。 你可以把 core.autocrlf 设置成 input 来告诉 Git 在提交时把回车和换行转换成换行,检出时不转换:

$ git config –global core.autocrlf input
这样在 Windows 上的检出文件中会保留回车和换行,而在 Mac 和 Linux 上,以及版本库中会保留换行。

如果你是 Windows 程序员,且正在开发仅运行在 Windows 上的项目,可以设置 false 取消此功能,把回车保留在版本库中:

$ git config –global core.autocrlf false
core.whitespace
Git 预先设置了一些选项来探测和修正多余空白字符问题。 它提供了六种处理多余空白字符的主要选项 —— 其中三个默认开启,另外三个默认关闭,不过你可以自由地设置它们。

默认被打开的三个选项是:blank-at-eol,查找行尾的空格;blank-at-eof,盯住文件底部的空行;space-before-tab,警惕行头 tab 前面的空格。

默认被关闭的三个选项是:indent-with-non-tab,揪出以空格而非 tab 开头的行(你可以用 tabwidth 选项控制它);tab-in-indent,监视在行头表示缩进的 tab;cr-at-eol,告诉 Git 忽略行尾的回车。

通过设置 core.whitespace,你可以让 Git 按照你的意图来打开或关闭以逗号分割的选项。 要想关闭某个选项,你可以在输入设置选项时不指定它或在它前面加个 -。 例如,如果你想要打开除 cr-at-eol 之外的所有选项:

$ git config –global core.whitespace \
trailing-space,space-before-tab,indent-with-non-tab

Alains 别名配置
1.Git窗口执行git config –global alias.co checkout
2.直接修改 .gitconfig
特例: git config –global alias.gk ‘!gitk’ (相当于 gitk 修改为 git gk)
注:设置gitk编码格式,防止中文乱码
git config –global gui.encoding utf-8

四.Git基本指令
4.1添加文件到版本库
git add [file]
添加目录下修改、删除、新增加的文件到仓库暂存区
git add –A
添加所有文件,包括:untrack,modify,delete
git add –u
添加所有track文件,包括:modify,delete
git add –f
强制添加被忽略的文件。
git add .
添加项目中除delete文件外的其他文件
git add a.txt c.txt
只添加某些文件到index(删除的文件需要用git rm)

4.2忽略某些文件
无需纳入git管理,也不希望出现在untrack文件列表的文件,只对未加入版本控制的文件有效。(共享和独享??)
在.gitignore文件中列出这些需要忽略的文件模式。
格式规范:
所有空行或者以注释符号#开头的行会被git忽略;
可以使用标准的模式匹配;
匹配模式最后跟反斜杠(/)说明忽略的是目录;
要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号取反。
$ cat .gitignore
# frameworks/base # 此为注释,被git忽略
*.a # 忽略所有.a结尾的文件
!lib.a # 但lib.a除外,!
build/ # 忽略build目录下的所有文件
doc/.txt # 忽略doc目录下的所有.txt结尾文件,但不包含doc/notes/.txt
/TODO # 仅忽略项目根目录下的TODO文件,但不包含subdir/TODO

4.3删除文件
git rm [file]
删除受版本控制的文件或文件夹
git rm [file] # 删除文件
git rm –rf [folder] # 删除文件夹

4.4移动文件
git mv [sourcefile] [destinationfile]
移动源文件为目标文件,相当于重命名。
git mv readme.txt README
相当于:
mv readme.txt README
git rm readme.txt
git add README

4.5代码提交
每次提交后,git内部都会生成一个快照,保存所有修改过的文件,并生成一个标识用以标识本次提交,每次提交都有且仅有一个父提交
git commit [option]
将存储在当前索引的内容全部提交。
1、git commit
git commit 不加-m参数会启动编辑器以便输入本次提交的说明

2、git commit [file] –m “message”
不打开文本编辑器,直接在命令行写注释,然后提交。
提交后会显示本次提交的完整 SHA-1 校验和, 以及在本次提交中,有多少文件修改过,多少行添改和删改过。

3、git commit –a [file]
自动把所有已跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤。

4.6查看仓库状态
git status
查看仓库当前工作于哪个分支;
查看文件状态:被修改,被删除,新增加等
每次提交前,都用git status查看下是不是都已暂存起来了,然后再提交。
git合并时发生冲突没有提交。可以用git status查看是哪些文件发生冲突。
这个命令在不同状态下都会有一些操作提示,按照提示操作即可

4.7查看提交历史
git log
查看全部提交日志
git log -5
查看最近5次的提交日志
git log –p
查看所有提交日志及修改的内容
git log –p –author=“scott”
查看所有scott提交日志及修改内容
git log –since=“2011-05-24”
查看2011-05-24以后所有的提交日志
git log –graph
查看提交日志,以图形方式显示
git log –since=“2 days ago”
查看这两天的提交日志
git log –until=“2011-05-25”
查看截止2011-05-25所有的提交日志
git log –name-only
查看所有修改过的文件
git log –author=xxx
查看xx的所有提交
git log –pretty=oneline
查看提交日志,一行显示
git log –pretty=format:%h:%s
查看提交日志,显示sha1及提交comments

4.8查看差异
git diff
比较当前工作空间与staging area,查看工作空间的变化
git diff –cached
比较staging area与本地仓库,查看暂存区中变化
git diff HEAD
比较当前工作空间与本地仓库
git diff newbranch
比较当前工作空间与newbranch分支
git diff tag1 tag2
比较tag1与tag2
git diff tag1:file1 tag2:file2
比较tag1的file1与tag2的file2
git diff tag1 tag2 file
比较tag1与tag2的file文件
git diff –stat
统计有差异的文件个数

4.9还原文件
git revert和git reset的区别:
git revert 是撤销某次操作,此次操作之前的commit都会被保留
git reset 是撤销某次提交,但是此次之后的修改都会被退回到暂存区
git reset –hard
取消commit,取消add,取消源文件修改
git reset –soft
取消commit
git reset –mixed
取消commit,取消add,是默认模式

git reset –hard HEAD (比较下)
恢复到HEAD状态
git reset –hard HEAD^
彻底撤销最近一次提交
git reset –hard HEAD~3
彻底撤销最近3次提交
git reset –soft HEAD~3
撤销最近3次commit,恢复到index状态,并且工作空间文件内容不变
git reset HEAD filename
删除暂存的文件

git revert
撤销某次提交,此次操作之前的commit都会被保留,但撤销也会作为一次提交进行保存。
git commit –amend
修改最后一次提交。
如果上次提交时遗漏了文件,可以在提交后将文件加入缓存然后用该命令提交即可。
如果缓存中内容没有任何修改,只更新修改的提交注释。
常用命令:
4.1 git clone
4.2 git checkout -b xx ( == git branch xx & git checkout xx)
4.3 git branch -vv 本地分支对应远程分支
4.4 git checkout . /add .
4.5 git commit -m “” / -a -m “” (== git add ./-a & git commit -m “”)/–amend(漏提交文件后,再次提交 使用上次的commitId)
4.6 git push orgin xxx:xxx 创建远程分支 / git push orgin :xxx 删除远程分支
4.7 git branch -d/-D xxx 删除本地分支
4.8 git stash (打本地patch) / git stash pop 拉取patch代码
4.9 git rm –cached xxx (== git reset HEAD xxx) 从stage状态 到unstage状态
4.10 git rm -rf xxx 删除文件夹
4.11 git rm -rf xxx\/* 删除xxx\下的所有文件 /* 转义 *号 匹配所有字符
4.12 git diff / –cached –staged 查看支持的可视化工具
4.13 git log / -p -2 /–stat /–pretty=online 查看最近2次提交/显示提交简介信息/格式化信息
(pretty=online/short/full/fuller/format:”%h - %an, %ar : %s”)
例子:lg = log –color –graph –pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ –abbrev-commit
4.14 git tag v2.0
4.15 git cherry-pick commitId(拉取某次提交)
4.16 git pull xxx
4.17 git grep -n xx /-n 显示行号 /–count 显示个数 / -p 显示方法
4.18 git blame的使用
git blame xx/../yy.java | grep zz (查询某个文件的某个修改)

五.Git项目子模块
1.子模块意义:
某个工作中的项目需要包含并使用另一个项目。 也许是第三方库,或者你独立开发的,用于多个父项目的库。 现在问题来了:你想要把它们当做两个独立的项目,同时又想在一个项目中使用另一个。
2.为项目添加子模块
git submodule add xxx(git地址)
2.1 .gitmodules 文件。 该配置文件保存了项目 URL 与已经拉取的本地目录之间的映射。
2.2 子模块代码更新
a. 流程
1.git clone xxxx
2.cd xx
3.git submodule init (初始化本地配置文件)
4.git submodule update (更新数据)
b.流程
1.git clone xxx –recursive
c.流程
1.git clone xxxx
2.git submodule update –init –recursive

3.子模块删除
git rm -rf xxx /.gitmodules /.git目录先的xx需要删除 否则后续添加会提示
出现此提示可以 –force xxx强制覆盖

六.Git目录结构
description 文件仅供 GitWeb 程序使用,我们无需关心。 config 文件包含项目特有的配置选项。 info 目录包含一个全局性排除(global exclude)文件,用以放置那些不希望被记录在 .gitignore 文件中的忽略模式(ignored patterns)。 hooks 目录包含客户端或服务端的钩子脚本(hook scripts),在 Git 钩子 中这部分话题已被详细探讨过。

剩下的四个条目很重要:HEAD 文件、(尚待创建的)index 文件,和 objects 目录、refs 目录。 这些条目是 Git 的核心组成部分。 objects 目录存储所有数据内容;refs 目录存储指向数据(分支)的提交对象的指针;HEAD 文件指示目前被检出的分支;index 文件保存暂存区信息。 我们将详细地逐一检视这四部分,以期理解 Git 是如何运转的。

附:
“快进(fast-forward)”:
由于当前 master 分支所指向的提交是你当前提交(有关 hotfix 的提交)的直接上游,所以 Git 只是简单的将指针向前移动。 换句话说,当你试图合并两个分支时,如果顺着一个分支走下去能够到达另一个分支,那么 Git 在合并两者的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作没有需要解决的分歧——这就叫做 “快进(fast-forward)”。

glob 正则 :
文件 .gitignore 的格式规范如下:
所有空行或者以 # 开头的行都会被 Git 忽略。
可以使用标准的 glob 模式匹配。
匹配模式可以以(/)开头防止递归。
匹配模式可以以(/)结尾指定目录。
要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号()匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号() 表示匹配任意中间目录,比如a/**/z 可以匹配 a/z, a/b/z 或 a/b/c/z

git log –pretty=format 常用的选项说明:
%H提交对象(commit)的完整哈希字串
%h提交对象的简短哈希字串
%T树对象(tree)的完整哈希字串
%t树对象的简短哈希字串
%P父对象(parent)的完整哈希字串
%p父对象的简短哈希字串
%an作者(author)的名字
%ae作者的电子邮件地址
%ad作者修订日期(可以用 –date= 选项定制格式)
%ar作者修订日期,按多久以前的方式显示
%cn提交者(committer)的名字
%ce提交者的电子邮件地址
%cd 提交日期
%cr提交日期,按多久以前的方式显示
%s提交说明

git学习书籍:
https://git-scm.com/book/zh/v2

常见问题&解决方式:
这里写图片描述

这里写图片描述
这里写图片描述
这里写图片描述

原创粉丝点击