复习了一下Git
,看了看Git
相关的书,在这总结一下,后期如果用到了没有总结到的命令,再来这里补充一下。
【参考链接】Git命令文档 这只是一个指令参考手册,不是书籍,用它来查阅命令
【参考链接】Git官方书籍 这本书的原名叫做《Pro Git
》很专业,就是容易看困
【参考链接】Git简明指南 没有了解过Git
的人看这个就很棒
【参考链接】Git参考手册 对于每个命令的讲解,列举了一些使用方法
【参考链接】沉浸式学Git 仿佛没有什么废话
【参考链接】Github秘籍 收录了一些Git
和Github
非常酷同时又少有人知的功能
书籍真的是太多了,不写了...
本文对于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 init
和git 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
将每个提交放在一行显示,查看的提交数很大时非常有用。 另外还有 short
,full
和 fuller
可以用
分支管理
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/z
或 a/b/c/z
等
针对于各种语言的忽略文件 https://github.com/github/gitignore