Git 王者超神之路

发布于 2016-12-16  271 次阅读


安装Git

Linux

Mac

直接在Terminal执行git命令, 如果没有会提示安装方法.

如果喜欢安装程序的话, 点这里

配置文件

第一次安装, 千万别要忘了配置你的git的使用者名字和邮箱. 这个道理很简单, 每一次的提交时需要记录提交者的, 如果没有提交者, 那么bug出现找谁来背锅??

查看config

Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量。

当前使用仓库的 Git 目录中的 config 文件(就是 .git/config):针对该仓库。

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

当然, 也可以查看某一项配置信息.

  • 形式:git config [--global|--system]

设置用户信息

使用--global选项, 当以后在该系统上做的任何操作都会使用此属性. 如果你需要在某一个特定的项目使用其他名字和邮箱, 那么可以通过设置项目中的config文件, 这样config中的属性会覆盖掉global的全局属性, 并且当在其他项目中并不会造成影响. 使用方式只需要去掉--global参数即可修改项目中的.git/config文件

获取帮助手册

形式: git help 或者 git --help

比如查看config手册

Git别名

例如: 生成别名之后可以在日后用简短的表示来使用

.gitignore文件

对于自动生成的文件, 日志, 编译的临时文件等. 可以对其进行配置, 让git不追踪这些文件

规范如下:

  • 所有空行或者以 # 开头的行都会被 Git 忽略。
  • 可以使用标准的 glob 模式匹配。
  • 匹配模式可以以(/)开头防止递归。
  • 匹配模式可以以(/)结尾指定目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反

glob模式是指shell所使用的简化了的正则表达式.

  • * :匹配零个或多个任意字符
  • [abc] :只匹配括号内的任意一个字符
  • [0-9] :使用短划线表示范围, 可以匹配0到9之间的任何字符.
  • ? :匹配任意一个字符
  • **:匹配任意的中间目录,例如a/**/z可以匹配a/z,a/b/z,a/b/c/z

如下给出一个样板:

仓库的基础操作

初始化仓库

添加文件到暂存区

status仓库

紧凑式中字母的表示含义如下:

  • ?? :表示新添加的未追踪的文件
  • M :M出现在右边,表示该文件被修改但是还没有放入暂存区
  • M :M出现在左边,表示文件被修改已经放入了暂存区
  • MM :出现两个,代表此文件在工作区修改已经放入了暂存区, 但之后有进行了修改,没有添加到暂存区

diff仓库

如果你想知道文件具体修改的内容, 那么diff会很有用

提交更新

移除文件

如果在工作区间对一个文件进行删除, 需要先进行add,然后才可以提交. 使用git rm可以直接在工作区间删除文件, 并提交到暂存区.

移动文件

同样使用git rm会方便很多, 并且如果相对文件重命名也可以如此

当执行了这条语句之后, 只需要在下一次commit即可, 不需要考虑额外操作. 等价于如下:

查看历史提交

如果是最基本的git log, 那么会按提交时间列出所有更新, 包括提交的SHA-1校验和, 作者名称,邮箱,提交时间,提交说明. 下面说说常用选项.

关于format对应的常用占位符的写法和意义

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

图形展示分支的合并历史

git log的一些其他操作

选项 说明
-p 按补丁格式显示每个更新之间的差异。
–stat 显示每次更新的文件修改统计信息。
–shortstat 只显示 –stat 中最后的行数修改添加移除统计。
–name-only 仅在提交信息后显示已修改的文件清单。
–name-status 显示新增、修改、删除的文件清单。
–abbrev-commit 仅显示 SHA-1 的前几个字符,而非所有的 40 个字符。
–relative-date 使用较短的相对时间显示(比如,“2 weeks ago”)。
–graph 显示 ASCII 图形表示的分支合并历史。
–pretty 使用其他格式显示历史提交信息。可用的选项包括 oneline,short,full,fuller 和 format(后跟指定格式)。

查找一个字符串的出现和删除的提交

哈哈,即使如果你不小心写个隐藏bug不管几个月之后,如果老大要想找出问题是写引发的其实很简单.例如这样
$ git log -p fileName 想甩锅?算了吧,还是认错以后多注意吧.

还有一些限制log输出的选项

选项 说明
-(n) 仅显示最近的 n 条提交
–since, –after 仅显示指定时间之后的提交。
–until, –before 仅显示指定时间之前的提交。
–author 仅显示指定作者相关的提交。
–committer 仅显示指定提交者相关的提交。
–grep 仅显示含指定关键字的提交
-S 仅显示添加或移除了某个关键字的提交

一个实际的例子,如果要查看 Git 仓库中,2016 年 11 月1号到7号,作者叫苏的提交文件,可以用下面的查询命令:

撤销操作

amend重新提交

当我们commit之后突然发现漏掉了一个文件, 这个时候不可能对一个文件再进行commit一次, 这样做就显得很多余, 而如果版本回退之前再添加也比较麻烦. 这个时候就可以使用这个amend命令.如下:

取消暂存的文件

就是对文件进行了git add操作. 这个时候可以reset

撤销对文件的修改

场景: 当文件修改了, 但是还没有进行git add的时候还只是在工作区间, 还原成最后一次提交的内容

要注意使用, 使用之前确定是否要抛弃已经添加的内容. 因为这个动作可能让你最新添加的内容彻底丢失. 因为没有进行commit, 一般来说进行了commit的内容都是可以恢复的.

标签

Git可以给历史中的某一个提交打上标签, 以示重要. 比如每次正式版本的上线等.

列出标签


创建标签

标签分为两种一种是附加标签另一种是轻量标签.

  • 附加标签: 会保存打标签者的信息, 时间和附加信息. 最后更随打标签的提交
  • 轻量标签: 只是在一个提交上做一个标记. 存储在一个专门保存标签的文件,指向提交的hash值

先来看附加标签:

轻量标签

后期打标签, 就是对已经提交某次提交进行追加标签设置

共享标签

默认情况下, git push不会把标签传递到远程服务器. 需要显示的推送标签共享到服务器
例如: git push origin [tagname]

检出标签

git中不能真正的检出一个标签, 但是可以在标签处创建一个新的分支.如下

查看标签对应的信息

使用git show 可以查看对应标签的详细信息, 如果git show这样的命令只是显示上次提交的内容

分支操作

分支的创建

分支的创建, 其实本质就是创建一个可以移动的指针,这个指针名就是新的分支名

分支的切换

所谓的分支切换就是HEAD指针的指向的改变

分支合并

利用git merge , 这条命令会把当前所在分支与目标分支的内容合并, 可以这样理解, 如果当你试图向目标分支合并时, 如果当前分支可以顺着一个分支走下去, 那么本质上其实只是当前指针的向前移动, 由于这种情况下的合并并没有需要解决的分期, 所以git会称这个是fast-forward快速前进.

删除分支

当一个功能分支开发完毕之后, 并进行了合并, 通常这个分支也就被删除,以保证仓库中的干净.

分支管理

git branch命令不只是可以创建于删除分支. 如果不添加任何参数, 那么会得到所有分支的一个列表

变基

和合并merge相似的效果都是合并分支, 但是使用变基rebase可以让提交历史变得更简洁. 如下

图片1是merge合并效果, 图片2是rebase合并效果. 明显变基会让提交历史看起来更加干净. 使用如下:

rebase原理就是, 从目标分支和要变基的分支向上查找出共同祖先节点就是c2, 然后把要变基的分支到c2节点的所有提交,提取出相应的修改生成一个副本, 并追加到目标分创建相对应的提交. 此时变基的分支指向目标分支master的后面某一次提交. 此时只要使用修改master指向指针使用merge即可.

远程分支


拉取远程分支

假设远程如果有一个dev分支, 你使用fetch进行抓取. 这个时候, 本地不会自动生成一个可编辑的副本, 换句话说就是这种情况下, 不会有一个新的dev本地分支, 只有一个不可以修改的origin/dev指针. 这个时候可以运行git merge origin/dev命令, 将这些远程dev分支的工作合并到当前分支. 如果想要在自己本地的dev分支上工作, 可以将其建立在远程分支之上.

创建远程分支

如果你的本地有一个新建的dev分支, 并且你进行了提交, 此时你想把这个分支也提交到远程的dev分支, 但是远程还没有创建dev, 这个时候可以使用如下命令: git push

删除远程分支

跟踪分支

从一个远程跟踪分支检出一个本地分支会自动创建一个叫做 跟踪分支(有时候也叫做 “上游分支”)。 跟踪分支是与远程分支有直接关系的本地分支。 如果在一个跟踪分支上输入git pullGit 能自动地识别去哪个服务器上抓取、合并到哪个分支。

当克隆一个仓库时,它通常会自动地创建一个跟踪 origin/mastermaster 分支。 然而,如果你愿意的话可以设置其他的跟踪分支 – 其他远程仓库上的跟踪分支,或者不跟踪 master 分支。 最简单的就是之前看到的例子,运行 git checkout -b [branch] [remotename]/[branch]。 这是一个十分常用的操作所以 Git 提供了 --track 快捷方式:

设置已有的本地分支跟踪一个刚刚拉取下来的远程分支,或者想要修改正在跟踪的上游分支,你可以在任意时间使用 -u 或 –set-upstream-to 选项运行 git branch 来显式地设置。

查看设置的所有跟踪分支

远程仓库操作

克隆仓库

查看远程仓库

如果需要查看某一个仓库更多的信息时, 使用git remote show ...

添加远程仓库

远程仓库的拉取推送

拉取

大家常用的可能是git pull这个指令. 这个指令的通常会从服务器上抓取数据自动尝试合并到当前所在分支.

而我们可以也可以利用git fetch进行本地分支所追踪的远程分支没有提交. 然后我们可以手动的进行合并.

推送

git push [remote-name] [branch-name] 例如:

只有当对服务器有写入权限, 并且之前没有人提交, 这条命令才会生效.

上面的这两个推送也好拉取也好. 如果所在分支设置了远程服务器分支的追踪, 那么可以省略掉后面的仓库名和分支名. 如果没有设置那么必须显示的指定.

远程仓库移除重命名

对远程仓库的名称进行修改

想要移除一个远程仓库,例如服务器搬走了,不再使用一个特定镜像,或者一个贡献者不再贡献

原文链接https://github.com/suzeyu1992/GitOperateDemo