曾经听到过这样一句话:不会git
就不要敲代码了。细细品味确实有其中的道理,多是当事人代码被强行覆盖后的叹息吧!javascript
所以,为了不这种状况,接下来咱们就一块儿来好好学习git
的相关知识吧!不怕你不会,就怕你不看!vue
git
的三个分区working directory
)stage
)它们之间的关系为:java
经过git status
查看git
状态时,红色的文件表示在工做区;绿色的文件表示在暂存区:node
工做区中的文件只要经过git add
命令添加进了Git
仓库,就会被追踪。git
暂存区也称为
index
,不过常使用stage
表示。正则表达式
git
经常使用命令建立版本库 | 版本控制 | 远程协做 | 查看信息 |
---|---|---|---|
git init |
git add |
git pull |
git help |
git clone |
git commit |
git push |
git log |
* | git rm |
* | git diff |
git
配置git config
能够经过三个地方的三个文件设置git
配置参数,分别表明三个不一样的做用域:算法
/etc/gitconfig
:做用域:一台计算机(操做系统)上的全部用户,几乎不会使用,优先度低于--global
;设置方法:vue-cli
git config --system
~/.gitconfig
:做用域:计算机中的某用户建立的全部项目,经常使用,优先度低于--local
;设置方法:npm
git config --global
.git/config
:做用域:某一特定的版本库,不经常使用,是最具体的,优先度最高;设置方法:vim
git config --local
可以使用git config
查看相关操做命令以及提示:
user.name
与user.email
user.name
和user.email
指的是用户名和邮箱,这些两个配置会被添加到提交信息中,能够搭配上述命令配置到三种做用域中:
--local
命令配置,做用域为当前版本库,配置写入.git/config
文件中,优先度第一;git config --local user.name "张三" git config --local user.email test1@git.com
以上为配置特定版本库(mygit
)的用户和邮箱:这样配置就能够经过两个版本库来进行多人操做的模拟;
--global
命令配置,做用域为当前系统用户,配置写入~/.gitconfig
文件,优先度第二;git config --global user.name "张三哥哥" git config --global user.email test2@git.com
--system
命令配置,做用域为当前操做系统全部用户,配置写入/etc/gitconfig
文件,优先度第三;这里须要管理员身份运行git bash
才有修改权限:git config --system user.name "张三爸爸" git config --system user.email test3@git.com
直接查看配置文件(可经过cat
指令查看):
.git/config
~/,gitconfig
/etc/gitconfig
经过git config --list
:能够批量查看配置信息:
git config user.name/email
查看:能够看到输出的配置信息是仓库配置张三,验证了仓库配置的优先级最高;
删除config
配置
git config --unset <参数名>
首先设置错误参数,随后查看该配置:
删除该配置:
修改user.name/email
配置
--unset
命令删除指定的配置信息:咱们以该方式继续删除用户配置--global user.name
:张三哥哥,和仓库配置--local user.email
:test1@git.com
:
此时再次经过git config user.name/email
查看配置信息user.name/email
:
能够发现user.name
显示的是系统配置:张三爸爸,user.email
显示的是用户配置:test2@git.com
,验证了用户配置优先级第二和系统配置优先级第三;
.gitignore
咱们能够经过git
提供的.gitignore
文件配置不被git
跟踪的文件。被添加到.gitignore
文件中的文件名,将不会被git
追踪。以下图中的新增文件setting.properties
:
可见在.gitignore
(注意文件是官方规定好了的不能随便乱改)文件中添加了文件名setting.properties
后,git
便再也不追踪setting.properties
这个文件了;
一般用来忽略本地开发中的下列文件:
.idea
、.settings
、.classpath
等无用配置;IDE
的配置文件,项目依赖文件等;如vue-cli
建立项目中node_modules
目录下的各类依赖文件;只要与.gitignore
中内容相匹配的目录或文件就会被git
忽略;再如:
.gtiignore
文件很是重要,通常放在建立项目的根目录上。
注意在.gitignore
文件中一行写一个文件名;.gitignore
文件也支持正则表达式好比:
*.a
:忽略全部以 .a
结尾的文件;!lib.a
:表示除了lib.a
文件,其他都会被忽略;/TODO
:仅仅忽略项目根目录下的TODO
文件,不包括subdir/TODO
(TODO
为示例文件);
/*/TODO
使一层目录下的TODO
文件被忽略;/**/TODO
使全部层目录下的TODO
文件都被忽略;build/
表示忽略build
目录下的全部文件;doc/*.txt
表示忽略doc
目录下全部的.txt
文件,包括doc/notes.txt
但不包括 doc/server/.arch.txt
;
doc/*/*.txt
会忽略doc
目录及其任何一个子目录下的全部.txt
文件,好比doc/bin/2.txt
(/ *
表示一层目录);doc/**/*.txt
则会把doc
任何一层目录及其子目录下的.txt
文件忽略;即 /**/
两颗星表示全部层目录;如下为某个使用vue-cli3
建立项目下的.gitignore
文件内容:
.DS_Store node_modules /dist # local env files .env.local .env.*.local # Log files npm-debug.log* yarn-debug.log* yarn-error.log* # Editor directories and files .idea .vscode *.suo *.ntvs* *.njsproj *.sln *.sw?
其实咱们不须要每次都手写一遍.gitignore
文件,能够经过这个网站自动生成不一样语言项目的忽略文件:http://gitignore.io/
在输入框中输入相关语言标签,就能够自动生成忽略文件列表。能够将它做为参考,选择其中须要的添加到.gitignore
文件中:
git status
查看工做区的状态,该命令常用;每执行一条指令后,都应使用该命令查看工做区和暂存区的状态;红色表示对文件的更改还没提交到暂存区;绿色表示已提交到暂存区;
->
暂存区git add <file>
将工做区中的文件提交到暂存区:
git add test.txt
:将工做区中的test.txt
提交到暂存区;git add test.txt test2.txt
:将工做区中的test.txt
和test2.txt
提交到暂存区;git add .
:将当前目录及其子目录下的全部文件从工做区提交到暂存区中;->
版本库git commit -m '注释'
将暂存区中的文件提交到版本库,必定要添加注释,不然不让提交:当注释很短时采用-m
方式(m
为message
的意思):
git commit
当注释很长时,能够直接执行git commit
,进入vim
编辑器界面,在此处编写较长的注释,添加完注释后,经过wq
保存并退出便可:
git commit -am '注释'
表示添加当前目录下全部已被git
追踪的文件到暂存区中并提交,即至关因而git add .
与 git commit
两步操做的合成。
该方式只适用于已被git
追踪的文件(即文件至少提交过一次),当文件第一次提交到暂存区时(此时该文件并未被git
追踪)不可使用该命令,而是要分开写,不然会报错:
<-
暂存区简单来讲,就是将git status
指令显示出来的文件,从绿色变为红色,大概有以下三种方法:
git rm --cached <file>
删除缓存区中的<file>
文件,并将其还原到工做区。该指令须要对暂存区删除的文件进行一次提交操做,因此建议用第二种方法;
git restore --stage <file>
经过该指令,将文件从缓存区中移动到工做区,这里的参数--stage
写成--staged
效果是同样的:
小贴士:可使用
tab
键补全命令;
git reset HEAD <file>
将文件从缓存区中移到工做区,做用与方法2
同样:
这里指的是撤销工做区中对文件的操做,包括新增、修改、删除等,配合着前面第七点所讲的指令使用。大概有如下两种方法:
git checkout -- <file>
能够撤销工做区中对flie
文件的改动操做(包括删除):注意--
后面要跟上空格:若是修改已经经过git add
提交到暂存区,该指令无效。
git restore <file>
能够撤销工做区中对file
文件的操做,效果与方法1
相同;
git
的日志记录了git
仓库对文件的全部操做,主要分为三大类:分支的提交日志、文件的修改日志、git
的操做日志。经过查看这些日志信息,能够很好地了解git
仓库的历史记录,并根据须要进行版本回退。
使用的主要命令为git log
,经过添加不一样的参数,能够显示不一样形式的提交日志,下面主要介绍其中经常使用的几种:
git log
查看版本库的提交(commit
)历史:
提交历史是倒叙的,最新的提交排在最前面;
Git
的提交id
(commit id
)是一个摘要值,这个摘要值其实是经过sha1
算法计算出来的不重复字符串。由此保证了每次提交id
的惟一性;
Author
显示的是提交时优先级最高的配置,好比提交时有--local
配置就显示它,没有就显示--global
的配置;如上图中:第二次提交时使用的是修改事后的config
李四,也就是优先级更高的--local
配置;
git log -n
能够查看最近的n
次的提交历史,好比经过git log -3
查看最近3
次的提交历史:
git log --graph
以图形化的形式显示提交历史:
git log --pretty=oneline
以一行的形式显示提交历史:
git log --graph --abbrev-commit
经过--abbrev-commit
对提交信息进行简化:
还能够结合--pretty=oneline
进行简写:
git log --pretty=oneline --abbrev-commit
git log --pretty=oneline:"%h - %an, %ar : %s"
还能够按照规定的格式显示日志内容:%h
:表示commit id
;%an
:表示提交人;%ar
:表示提交时间;%s
:表示提交信息;
git log --all --decorate --oneline --graph
该命令比较厉害,是StackOverflow
上网友组装的命令,能够一次性查看全部分支及其提交记录,很是实用:
如上图所示,三个分支dev
、master
、test
以及每一个分支的提交记录都一次性显示出来了。因为该命令十分经常使用,可是又很长,很差记忆。因此,咱们能够给该命令设置别名(alias
),好比取该命令的首字母组成别名dog
,在全局下进行配置:
git config --global alias.dog 'log --all --decorate --oneline --graph'
设置好别名以后,就能够经过git dog
来执行这条指令了。有关别名的内容,以后会详细进行讲解。
git blame file_name
如图所示,经过该命令能够清楚查看指定的文件的每次修改。包括修改用户,修改时间等;
git reflog
经过该指令能够详细地查看,每次操做所在提交节点的commit id
,以及在此提交节点上所执行的操做(指令);而且是倒叙显示的,即最近一次操做的序号为{0}
:
git log
:只能显示当前分支的提交历史,若是进行版本回退,会丢失较后版本的提交信息,以下图所示:
能够看到经过reset
进行版本回退,丢失了4th commit
的提交信息,此时可经过git reflog
查看操做日志的相关操做信息来回到最新的版本。
总结:
整体上来讲,操做日志包含了修改日志和提交日志,是最全的
git
日志;注意:不是经过
git
命令,而是手动修改文件,这些修改记录不会被git
日志记录。因此,推荐使用git
指令进行操做;