Git·命令总结

CY 2018年11月08日 977次浏览

复习了一下Git,看了看Git相关的书,在这总结一下,后期如果用到了没有总结到的命令,再来这里补充一下。

【参考链接】Git命令文档 这只是一个指令参考手册,不是书籍,用它来查阅命令

【参考链接】Git官方书籍 这本书的原名叫做《Pro Git》很专业,就是容易看困

【参考链接】Git简明指南 没有了解过Git的人看这个就很棒

【参考链接】Git参考手册 对于每个命令的讲解,列举了一些使用方法

【参考链接】沉浸式学Git 仿佛没有什么废话

【参考链接】Github秘籍 收录了一些GitGithub非常酷同时又少有人知的功能

书籍真的是太多了,不写了...

本文对于Git做简单的讲解和总结

版本管理的发展史

参考文档

本地版本控制 => 集中化的版本控制 => 分布式版本控制系统

Git有什么优势

参考文档

  • 直接记录快照,而非差异比较

  • 近乎所有操作都是本地执行

  • Git 保证完整性

    Git 用以计算校验和的机制叫做 SHA-1 散列(hash,哈希)。 这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来

  • Git 一般只添加数据

Git的三个区域

参考文档

总结如下:

  • 工作区:修改文件的地方,使用git add命令可以添加到暂存区
  • 暂存区:暂存文件,将文件的快照放入暂存区域。使用git commit命令提交到本地库
  • Git本地库:找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。

Git的状态

已修改(modified)工作区文件修改后还没有放入缓存区之前的状态

已暂存(staged)执行git add 后,缓存区文件所处于的状态

已提交(committed)执行git commit后,本地库中的文件处于已提交状态

代码托管中心

局域网:Gitlab

远程:Github,码云等

Git的初次使用

git add 文件名 # 添加或更新文件到缓存区。
git commit -m "提交信息" 文件名 # 提交代码到本地库

相关命令

git status当前Git仓库的状态

使用 git status -s 命令或 git status --short 命令,你将得到一种更为紧凑的格式输出

git rm --cached 文件名从缓存区中移除文件

git checkout工作空间中修改了文件,想要还原到之前的状态可以使用该命令

如何跳过使用暂存区域

在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤

Git的基本命令

git initgit clone初始化Git仓库

做的事情创建了一个.git文件夹,文件夹里面的目录结构如下:

config

description

HEAD

hooks/

info/

objects/

refs/

这些文件各有各的用途,比如说HEAD文件是存储版本指针的。

区别于git clone这个是命令从代码托管中心克隆一个已经存在的Git仓库。

git config设置Git

设置签名,这个必须要设置,如果没有设置Git也会提醒去设置,用来区分不同的开发人员的身份,这个签名和代码托管中心(Github等)的账号密码没有任何关系。

命令:

  • 在项目级别/仓库基本下设置(优先级高)
git config user.name CY
git config user.email dnydict@163.com

这个签名的信息保存在.git/config文件里面

  • 系统用户级别(全局,优先级低)
git config --global user.name CY
git config --global user.email dnydict@163.com

这里的签名保存在用户目录下的.gitconfig

Git配置文件的路径

git config 配置(如果配置成全局,只需配置一次)

/etc/gitconfig文件,使用--system参数进行配置,所有用户可以读取

/.gitconfig~/.config/git/config 文件 ,使用--global选项配置

.git/config默认就是这个位置

上面配置文件的优先级由小到大。

查看配置信息

可以使用 git config --list 命令来列出所有 Git 当时能找到的配置

$ git config --list
user.name=John Doe
user.email=johndoe@example.com
color.status=auto
color.branch=auto
color.interactive=auto
color.diff=auto
...

git config: 来检查 Git 的某一项配置

$ git config user.name
John Doe

git diff查看修改文件的区别

git diff 文件名查看文件的区别

默认是将工作区暂存区进行比较

git diff 本地库Hash 文件名 和本地库进行比较

例如:git diff HEAD 文件名如果不指定文件名,默认比较的是所有的文件

默认比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容。

若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached 命令。(Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的,但更好记些。)

git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件后,运行 git diff 后却什么也没有,就是这个原因。

git reset基于索引值前后后退版本

git reset --hard hash值 前进后退版本

使用^符号可以按步数后退,注意只能后退

例如:git reset --hard HEAD^^^^一个^符号退一步

git reset --hard HEAD~n 后退n步,n是一个不容挑战的数字

--hard: 移动指针,重置暂存区,重置工作区,改动程度最大的一个参数

--soft: 不会触及工作区和缓存区,仅仅是移动HEAD指针,相当于之前的版本做了一下git add操作,工作区不变,暂存区不变,本地库变了,这也就相当于还没有进行git commit操作

--mixed:默认参数,移动HEAD指针,和重置暂存区,缓存区和本地库都变了,工作区不变,所以相当于工作区和其他区的文件都不一样,也就相当于还没有做git add操作

最常使用git reset --hard HEAD: 将三个区的文件全部以当前HEAD为准

如果想要将指针变化后的本地仓库放到托管中心,这个时候直接push是不行的,需要加上强制,例如:

git push origin master --force

git rm移除文件

git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。

撤回某次git add

 git rm --cached README

git mv移动文件

git mv file_from file_to

相当于

$ mv README.md README
$ git rm README.md
$ git add README

git log查看提交日志

git log 查看提交日志,历史记录,HEAD指针标明的位置是当前版本的位置

git log --pretty=oneline 以一行去显示日志

git log --oneline 以一行去显示日志(简洁写法),只显示HEAD之前的历史记录

git reflog会提示回退版本需要移动几步,所有的历史记录都能显示

显示的时候HEAD@{移动到这个版本需要几步}

可以使用

空格向下翻页

b 向上

q 退出

--stat 选项在每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过的文件的哪些行被移除或是添加了。 在每次提交的最后还有一个总结。

--pretty这个选项可以指定使用不同于默认格式的方式展示提交历史 ,oneline 将每个提交放在一行显示,查看的提交数很大时非常有用。 另外还有 shortfullfuller 可以用

分支管理

git branch命令

查看所有的分支 git branch -v

创建一个分支 git branch 分支名

切换分支 git checkout 分支名

合并分支:

​ 第一步:切换到接受修改的分支上git checkout 分支名

​ 第二步:git merge 分支名

解决冲突

执行合并分支后,产生冲突的情况下,两边人先商讨如何解决冲突,可以在文件里面直接编辑发生冲突的部分。

解决完成后,使用git add命令来标记为已经解决

然后执行git commit -m "日志信息" 注意这里不能带文件名

Github 操作

pull操作

拉取:pull = fetch + merge

git fetch [远程库地址别名] [远程分支名]

git marge [远程库地址别名/远程分支名]

push操作

git push [remote别名] [分支名]

remote操作

remote是为当前仓库的一个远程仓库地址起别名

git remote -v 查看remote列表

git remote add [shortname] [url]添加一个remote

git remote show [remote-name] 查看一个remote

git remote rename 旧名 新名为remote重命名

git remote rm [remote-name]删除一个remote

获取Git帮助

$ git help <verb>
$ git <verb> --help
$ man git-<verb>

Git的忽略文件

创建一个名为 .gitignore 的文件

$ cat .gitignore
*.[oa] # 告诉 Git 忽略所有以 .o 或 .a 结尾的文件
*~ # 告诉 Git 忽略所有以波浪符(~)结尾的文件

星号(*)匹配零个或多个任意字符;

[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);

问号(?)只匹配一个任意字符;

如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。

使用两个星号(*) 表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z , a/b/za/b/c/z

针对于各种语言的忽略文件 https://github.com/github/gitignore