以及对git基本原理的精晓,  那篇文章主若是介绍作者在应用Git中的有一对忘记了

那么你默认的远程分支名字将会是 booyah/master,本文重点总结归纳一下git经常使用的命令和用法

前言

  这篇文章首借使介绍本身在动用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 用户消息

安装后要做的率先件事正是设置你的用户名和邮箱地址,因为每3个 Git
的提交都会利用那几个音讯,并且它会写入到您的每1遍提交中,不可变更:

$ git config --global user.name "adonfu"
$ git config --global user.email adon@example.com
  • 若使用–global 选项,该命令只须求周转3遍,Git 都会利用这贰个音讯;
  • 若针对一定类型应用区别的用户名称与邮件地址时,能够在卓殊项目目录下运作没有–global
    选项的指令来安插。

查看每3个拨出的结尾二回提交

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 从1个服务器克隆三个共处的Git仓库

克隆仓库的通令格式是git clone [url]

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

在当前目录下创办1个firstProject目录,在那几个目录下开端化三个.git文件夹,保存远程仓库的有所数据。
若将远程仓库自定义本地仓库:

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

标签

git tag 列出标签

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

七个轻量标签很像贰个不会改变的分支-它只是二个特定提交的引用。

附注标签是储存在Git数据库中的二个完好无损对象。它们是能够被校验的;个中包罗打标签者的名字、电子邮件地址、日期时间;还有3个标签音讯;并且能够动用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

  难题讲述:
比如笔者觉着近来支行也许不适合线上的,那么自个儿必要来1个一发安全的道岔?

实现:

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'

交付时记下的是位于暂存区域的快速照相。任何还未暂存的还是保持已修改景况,能够在下次交给时纳入版本管理。每3回运维提交操作,都以对您项目作1遍快速照相,以往能够回来这一个情形恐怕进行比较。

若已跟踪的文书被改动,能够利用参数-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

终极只有2个交由 – 第四回提交将代表第3次提交的结果。
裁撤对文件的修改:

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

3. 远道仓库操作

3.1 创制远程仓库

  • 能够由此github创设3个长途仓库,使用git clone指令克隆版本库。

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

电动抬高的配置消息,通过命名git config --list查看。

  • 由此命令行创设版本库:

$ git remote add origin remote_git_server_address

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

$ 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 [分支名]
[远程名]/[分支名]。

盯住分支:从一个长距离跟踪分支检出1个本地分支会自动创立3个叫做
“跟踪分支”(有时候也叫做 “上游分支”)。
跟踪分支是与远程分支有直接挂钩的地点分支。
在三个跟踪分支上执行:
git push一声令下:Git会自行推测应该向哪个服务器的哪个分支推送数据;
git pull一声令下:Git能自动地分辨去哪个服务器上抓取、合并到哪个分支。
在执行git clone时,Git常常会自动创制1个名为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

轻量标签和附注标签差异:
一个轻量标签很像一个不会改变的分支,它只是3个一定提交的引用。
附注标签是储存在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不仅仅是三个版本控制系统,它同时是八个12分强大且易用的工具,是1个内容寻址文件系统。那里只介绍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