以及对git基本原理的精晓,那么你默许的长距离分支名字将会是 booyah/master

前言

  那篇小说紧即使介绍自己在采取Git中的有局地遗忘了,可是很重大的授命。


20171127更新

多年来干活平日选取Git,本文重点总括归结一下git经常使用的命令和用法,以及对git基本原理的领悟。

分支

翻看各类分支所指的脚下目标

git log --oneline --decorate

图片 1

git log --oneline --decorate --graph --all //输出你的提交历史,各个分支的指向,以及项目分支分叉的情况

git merge [branchname] 把 branchname 合并到当前分支

一、Git安装后安排

相遇争论时分支的集合

图片 2

此外因含有合并争执而有待解决的文书,都会以未合并状态标识出来。 Git
会在有争辨的文本中投入正规的龃龉解决标记,这样你可以打开这几个含有冲突的文书然后手动解决争辨。
出现冲突的文本会包罗部分差距常常区段,看起来像上面那么些样子:

<<<<<<< HEAD:index.html <div id="footer">contact : email.support@github.com</div> ======= <div id="footer">  please contact us at support@github.com </div> >>>>>>> iss53:index.html 

图片 3

那象征 HEAD 所提醒的本子(也就是您的 master 分支所在的职位,因为你在运行
merge 命令的时候曾经检出到了这么些分支)在这一个区段的上半有些( =======
的上半有的),而 所要统一分支所提示的版本在 ======= 的下半部分。
为明白决争论,你不可能不选择使用由 =======
分割的两部分中的一个,或者您也足以自行合并那个情节。
例如,你可以通过把那段内容换成上面的旗帜来化解争论:

图片 4

1.1 用户消息

安装后要做的第一件事就是设置你的用户名和邮箱地址,因为每一个 Git
的交给都会接纳那个信息,并且它会写入到您的每四回提交中,不可改变:

$ git config --global user.name "adonfu"
$ git config --global user.email adon@example.com
  • 若使用–global 选项,该命令只须求周转四次,Git 都会采取那几个音信;
  • 若针对特定类型选择不一样的用户名称与邮件地址时,可以在至极项目目录下运行没有–global
    选项的通令来配置。

查阅每一个拨出的最后一回提交

git branch -v 

git branch --merged / --no-merged  查看已经合并或者未合并的分支


git branch -d / -D(强制删除)

1.2 Git配置新闻存储在五个不等的职位

  • /etc/gitconfig 文件: 包涵系统上每一个用户及她们仓库的通用配置
    若git config 使用选拔 –system 时,会之后文件读写配置变量。
  • ~/.gitconfig 或 ~/.config/git/config 文件:只针对近期用户
    若使用 –global 选项,Git读写此文件。
  • .git/config:当前仓库。

每一个级别覆盖上一流其余配置,所以 .git/config 的安顿变量会覆盖
/etc/gitconfig 中的配置变量。

Origin 并无出奇意义

长距离仓库名字 origin 与分支名字 master 一样,在 Git
中并不曾任何特其余意思一样。 同时 master 是当您运行 git init
时默认的苗子分支名字,原因仅仅是它的广大应用, origin 是当您运行 git
clone 时默认的远程仓库名字。 即使你运行 git clone -o booyah
,那么您默许的长途分支名字将会是 booyah/master 。

2017 11 23 更新

1.3 查看配置音讯

$ git config --list

翻开文件提交历史

git log
git log -p //显示每次提交的内容差异
git log --stat  //显示每次提交的简略的统计信息
git log --pretty=format:"%h - %an, %ar : %s"

图片 5

图片 6

限制出口长度

git log --sine=2.weeks
git log -<n> 显示 前 n 条提交
git log --author 指定作者的提交
git log -SFunctionName 可以列出那些添加或移除了某些字符串的提交

图片 7

二、基本命令

废除有关操作

撤消刚刚的一个交付

git commit --amend //由于commit 信息写错,好像经常用

1. 获取Git仓库

有二种格局赢得Git项目仓库。

收回暂存文件

当你选用 git add *
时,发现添加了不应该暂存的文书,能够用下边的来撤消暂存

git reset HEAD <file>

git checkout -- <file> //取消对一个未加入暂存区文件的修改

1.1 在现有项目或目录下导入所有文件到Git中

若目录gitCmdTest已创立,执行如下命令:

$ cd gitCmdTest
$ git init

若要早先化一个新的版本库~/gitCmdTest/.git/:

$ git init gitCmdTest

长途仓库

添加一个远程仓库
git remote add <shortname> <url>
git remote add pb https://github.com/paulboone/ticgit

从远程仓库抓取与拉取

git fetch [remote-name] //git fetch origin


git push [remote-name] [branch-name]


查看远程仓库
git remote show [remote-name]

远程仓库的移除与重命名
git remote rename <originName> <afterName>

git remote rm <remote-name>

1.2 从一个服务器克隆一个共处的Git仓库

仿造仓库的指令格式是git clone [url]

$ git clone https://github.com/fuyadong/firstProject

在当前目录下创办一个firstProject目录,在那么些目录下伊始化一个.git文件夹,保存远程仓库的具有数据。
若将远程仓库自定义本地仓库:

$ git clone https://github.com/fuyadong/firstProject myproject

标签

git tag 列出标签

Git 使用二种主要品种的竹签: 轻量标签(lightweight) 与
附注标签(annotated)。

一个轻量标签很像一个不会变动的分支-它只是一个一定提交的引用。

附注标签是储存在Git数据库中的一个整机对象。它们是可以被校验的;其中饱含打标签者的名字、电子邮件地址、日期时间;还有一个标签音信;并且可以应用GNU
Privacy Guard (GPG) 签名与认证。

1.3 将文件放入版本库

$ touch file1.py    #创建文件file1
$ touch file2.py     #创建文件file2
$ git add .     #将当前路径下所有修改/新增的文件加入代码库
$ git add file1.py file2.py #单个文件添加
$ git add LICENSE
$ git commit -m 'some message'  #提交代码
$ git diff          #比较当前修改的文件与之前的区别
$ git status        #查看状态

附注标签

git tag -a v1.4 -m 'my version 1.4'

git show 可以看到标签信息对应的提交信息

1.4 设置忽略文件

些微公文无需纳入Git
的管住,也不希望它们总出现在未跟踪文件列表。寻常都是些自动生成的文书,比如日志文件,或者编译进度中开创的临时文件等。

轻量标签

git tag v1.4-lw

1.4.1 设置总体项目要不经意的公文

在根目录新建一个文本.gitignore,列出要不经意的文本形式。

$ touch .gitignore
$ echo *.[oa] > .gitignore
$ echo *~ > .gitignore

.gitignore文件加入版本库并付诸。

给从前的交由打标签

git tag -a v1.2 9fsdfdasfa  某个提交的校验和的值

1.4.2 设置自己项目要不经意的文书

修改.git/info/exclude文件,设置要不经意的公文:

*.[oa]
*~

还足以忽略 log,tmp 或者 pid 目录,以及自动生成的文档等。

推送标签

git push origin v1.2 推送指定标签

git push origin --tags 一次性推送把所有不在远程仓库服务器上的标签全部推送过去

在特定标签上创建一个新分支
git checkout -b [branchname] [tagname]
git checkout -b version2 v3.3.0

1.4.3 .gitignore 的格式规范

格式规范如下:

  • 装有空行或者以 # 开端的行都会被 Git 忽略。
  • 可以选取正式的 glob 情势匹配。
  • 卓越格局可以以(/)早先防止递归。
  • 合营形式可以以(/)结尾指定目录。
  • 要不经意指定格局以外的公文或目录,可以在情势前增加惊叹号(!)取反。

glob 格局是简化的 shell 正则表明式:

  • 星号(*)匹配零个或三个随机字符;
  • [abc] 匹配任何一个列在方括号中的字符;
  • 问号(?)只卓越一个自由字符;
  • 在方括号中使用短划线分隔八个字符,表示拥有在那三个字符范围内的都得以协作(比如
    [0-9] 表示非凡所有 0 到 9 的数字;
  • 动用七个星号(*) 表示至极任意中间目录,比如a/**/z 可以匹配 a/z,
    a/b/z 或 a/b/c/z等。

不相同品种及言语的.gitignore文件列表gitignore

哪些跳转到指定的 commit

  难题讲述:
比如我觉得眼前支行可能不适合线上的,那么我索要来一个越来越安全的支行?

实现:

git checkout -b new-branch commitId

对 指定的 CommitId开创新支行。

2. 本土操作

克隆远程仓库的时候自定义本地仓库名字

git clone http://github.com/xx myName

2.1 提交操作

利用git add建立跟踪,将修改或新增的文件添加到暂存区:

$ git add file1.py

选用git status查询暂存状态:

$ git status

若不想暂存文件file1.py,运行如下命令撤出暂存区:

$ git reset HEAD file1.py

后悔操作:

$ git reset HEAD^    # 恢复到上一个版本
$ git reset HEAD^ file1.py   # 将文件回退到上一个版本
$ git reset -soft HEAD~n    # 回退到第n个版本
$ git reset <object key>    # 回退到具体的提交对象
$ git reset -hard origin/master  # 将本地状态与远程master库一致

将暂存区的情节交给更新:

$ git commit -m 'msg'

交给时记下的是放在暂存区域的快照。任何还未暂存的仍然保持已修改景况,可以在下次提交时纳入版本管理。每一回运行提交操作,都是对你项目作一回快照,以后可以回到这些情况或者举行比较。

若已跟踪的公文被涂改,可以选用参数-a将修改的文书暂存并交给:

$ git commit -a -m 'msg'

选拔 git status -s 可以望见状态的简写版本,如下所示

图片 8

2.2 移除文件

若要删除已暂存的文件(从暂存区移除):

$ rm file.py
$ git rm file.py

再付出时,文件file.py就不会纳入到版本管理。

若要将曾经交付到版本库中的文件移除,但愿意保留在当前工作目录中,使用选用--cached

$ git rm --cached file.py

手动删除,将文件撤出暂存区:

$ rm file.py

可以应用git status取名查看意况。

文件重命名操作:

$ git mv filename.py file.py

周旋于如下操作:

$ mv filename.py file.py
$ git rm filename.py
$ git add file.py

翻看已暂存的文件差别相比

初叶一向不明了,当暂存之后选用 git diff 就没用了,明日意识竟是还有这些
(在未 commit 的动静下!)

git diff --cached
git diff --staged

2.3 工作区文件状态

干活目录下各样文件有七个情景:已跟踪或未跟踪。

  • 已跟踪的文本:被纳入了版本控制的文本,在上两次快照中有它们的笔录,在做事一段时间后,它们的状态恐怕处于未修改,已修改或已放入暂存区。
  • 未跟踪文件:除已跟踪的文书以外的保有其余文件。它们既不存在于上次快照的记录中,也未尝放入暂存区。
  • 首先克隆的仓库,工作目录中的所有文件都属于已跟踪文件,并处在未修改状态。

文本状态变化:

图片 9

git add 建立跟踪,放入暂存区;
git commit 将暂存区中的文件纳入到版本管理;

移除文件

先是先选择 rm filename 然后再选择 git rm filename 进行记录。

除此以外一种情景是,大家想把文件从 Git
仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。
换句话说,你想让文件保留在磁盘,不过并不想让 Git 继续跟踪。 当你忘掉添加
.gitignore 文件,不小心把一个很大的日志文件或一堆 .a
那样的编译生成文件添加到暂存区时,这一做法尤为有用。
为达到这一目标,使用 –cached 选项

git rm --cached deleteName

图片 10

2.4 撤除操作

若漏提文件或提交音信写错,可以利用参数–amend双重提交:

$ git commit --amend

示例:

$ git commit -m 'initial commit'
$ git add some_file
$ git commit --amend

最后只有一个付出 – 第二次提交将代表第两次提交的结果。
裁撤对文本的改动:

$ git checkout -- file.py
$ git checkout HEAD file.py
$ git checkout HEAD *.py
$ git checkout HEAD .

3. 长途仓库操作

3.1 创立远程仓库

  • 可以经过github成立一个远道仓库,使用git clone指令克隆版本库。

git clone https://github.com/fuyadong/firstProject

自动抬高的布置音讯,通过命名git config --list查看。

  • 通过命令行创设版本库:

$ git remote add origin remote_git_server_address

来得远程仓库的名字和URL:

$ git remote -v

3.2 从远程仓库中抓取与拉取

从远程仓库中得到数据:

$ git fetch [remote-name]

若版本库通过git clone一声令下获取,仓库名称remote-name默许为origin。

3.3 推送到长途仓库

命令格式:git push [remote-name] [branch-name]
先是有限支撑克隆服务器有写入权限。

$ git push origin master

若版本库使用其它名目pub:

$ git remote add pub https://github.com/fuyadong/firstProject
$ git push -u pub master

-u表示使用某个远程仓库,默许的远程库,设置一回即可。

3.4 查看远程仓库

$ git remote show origin

3.5 远程仓库重命名和移除

$ git remote rename pub publish
$ git remote rm publish

4 分支

Git分支是指向提交对象的可变指针,默许分支名字是master,始终对准最新的交由对象,自动向前挪动。与其他分支完全没有分别,由git init命令默许创建。
卓殊规指针HEAD:指向工作空间当前所在的本土分支,那样Git就知晓当前是在哪个分支上。

4.1 成立分支

$ git branch dev

成立一个新支行dev,并不会自动切换来新支行中去。
翻开分支当前所指对象:

$ git log --oneline --decorate

查阅分叉历史:

$ git log --oneline --decorate --graph --all

可以观察提交历史、种种分支的指向以及项目标分段分叉景况。

4.2 切换分支

切换来支行dev:

$ git checkout dev

新建并切换分支:

$ git checkout -b dev

4.3 删除分支

$ git branch -d dev

4.4 分支管理

$ git branch      # 查看本地分支
$ git branch -r  # 查看远程分支
$ git branch -v  # 查看每个分支的最后一次提交

查阅哪些分支已经联合到眼前支行:

$ git branch --merged

翻看所有包涵未合并工作的道岔:

$ git branch --no-merged

4.5 合并分支

将分支dev合并入master分支:

$ git checkout master
$ git merge dev

4.6 解决统一争论

Git在暴发争论的文本中会参与正规的争执解决标记,可以手动解决争持,如下一段内容:

<<<<<<< HEAD:index.html
<div id="footer">contact : email.support@github.com</div>
=======
<div id="footer">
 please contact us at support@github.com
</div>
>>>>>>> dev:index.html

在======= 的上半局地是HEAD 所提示的版本,即HEAD所在的分层;在 =======
的下半部分,是dev分支所提醒的版本;那是足以选用一些保留,也可手动解决争辨,然后删除争持标记。使用git add命令标记争持已解决。

4.7 远程分支

4.7.1 跟踪分支

在长距离跟踪分支基础上,建立地点分支:

$ git checkout -b dev origin/dev

地点分支dev自动从origin/dev拉取,命令格式:git checkout -b [分支名]
[远程名]/[分支名]。

跟踪分支:从一个中距离跟踪分支检出一个地方分支会自动成立一个叫做
“跟踪分支”(有时候也叫做 “上游分支”)。
跟踪分支是与长途分支有一贯互换的本土分支。
在一个跟踪分支上执行:
git push命令:Git会自行估摸应该向哪些服务器的哪位分支推送数据;
git pull指令:Git能自动地辨别去哪个服务器上抓取、合并到哪些分支。
在执行git clone时,Git日常会自行创造一个名为master的分支来跟踪origin/master

4.7.2 查看设置的兼具跟踪分支

$ git branch -vv

列出具有地点分支及其每个分支正在跟踪哪个远程分支。

4.7.3 推送分支

$ git push origin master

将master分支推送到长途仓库origin上。

4.7.4 获取服务器数据

$ git fetch

从服务器上抓取本地没有的数据,并不会联合;必要实践git merge命令。

4.7.5 删除远程分支

$ git push origin --delete remote_branch

5 标签

可以采取打标签效应来标记发表节点,比如发布版本的时候。也足以为某个提交打标签。

5.1 查看标签

$ git tag
$ git tag -l 'v2.0*'

5.2 创立标签

创办附注标签:

$ git tag -a v2.0 -m 'my version 2.0'

因此接纳git show命令能够观望的签音信与相应的付出音讯。

轻量标签本质上是将交由校验和存储到一个文本中,没有保存任何其余消息。创立轻量标签,不要求利用-a-s
-m分选,只须求提供标签名字:

$ git tag v2.0-lw

轻量标签和附注标签不一样:
一个轻量标签很像一个不会转移的道岔,它只是一个一定提交的引用。
附注标签是储存在Git数据库中的一个完全对象。它们是足以被校验的;其中含有打标签者的名字、电子邮件地址、日期时间和标签音讯。寻常选拔附注标签,这样可以观察以上音信。

5.3 前期打标签

可以为事前的交由打标签:

$ git log --pretty=oneline
$ git tag -a v1.2 8fceb05
$ git show v1.2

5.4 共享标签

默许情状下,git push一声令下并不会传递标签到长途仓库服务器上,在创制完标签后你必须显式地推送标签到共享服务器上。

$ git push origin v1.2

将不再远程仓库服务器上的价签全体推送到服务器上:

$ git push origin --tags

据悉特定的价签版本创造一个支行:

$ git checkout -b dev v2.0

命令格式:git checkout -b branch tag

三、Git基本原理

Git不仅仅是一个版本控制系统,它同时是一个可怜有力且易用的工具,是一个内容寻址文件系统。那里只介绍Git内部的目的,以更好的了解地方的下令。

Git对象

多个对象模型:

  • blob对象:保存文件快照
  • Tree对象:记录目录结构和blob对象索引
  • 交由对象:包蕴树对象指针和交由音讯

交给音讯有小编的人名和邮箱、提交时输入的音信以及针对它的父对象的指针。首次提交爆发的交给对象没有父对象,普通提交操作暴发的交由对象有一个父对象,而由多少个支行合并发生的提交对象有多少个父对象。

举行五回git commit交给操作,Git会先计算每一个子目录的校验和,然后在
Git 仓库中这个校验和封存为树对象。 随后,Git
便会创建一个付给对象,对版本库做几次快照。

图片 11

可以运用如下命令查询提交消息:

$ git log  # 获取提交记录
$ git ls-tree <object key>  # 查看指定对象所有信息
$ git cat-file -p <object key>  # 获取key对应object的内容,根据object里面的内容,继续探索,访问到所有关联object。

参考资料:
[1]: git book官网 Git
Book

相关文章