Git简介
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。
Git的三种状态
在git中,文件是处于以下三种状态之一:
- 已提交(committed):表示数据已经被安全地存入本地数据库中
- 已修改(modified):表示已经改动了文件,但未提交到数据库
- 已暂存(staged):表示已修改文件的当前版本做出了标识并将其加入下一次要提交的快照中
为此可以知道Git项目中主要的三个区域:
- Git目录:保存项目元数据和对象数据库的地方
- 工作目录:项目某个版本的单词检出,从Git目录下的压缩数据库内提取,放在磁盘以供使用或修改
- 暂存区:是一个文件,位于Git目录中;保存了下次所要提交内容的相关信息。
Git基本工作流:
- 修改工作目录中的文件
- 暂存文件,将这些文件的快照加入暂存区
- 提交暂存区中的文件,将快照永久的保存在Git目录中
安装Git
- 官网下载Git软件
- 然后点击.exe的文件,一直下一步安装到你设置的位置就行
- 右键菜单选择Git Bash Here打开命令行窗口即可
Git首次配置
Git下载安装完成后,需要自定义以下Git的环境。只需要配置一次,以后甚至升级也不要再配置。
在Git中存在一个叫 git config的工具,该工具主要用来获取或设置配置变量。配置变量可以存储在以下三个位置:
-
/etc/gitconfig文件:包含系统中所有用户及仓库的值; 传入–system选项可以从该文件读写配置变量
$ git config --system xxx
-
~/.gitconfig或~/.config/git/config文件:针对自己。传入–global选项可以从该文件读写配置变量
$ git config --global xxx
-
当前仓库的Git目录(.git/config):针对单个仓库。
上面每一级会覆盖上一级的设置。因此.git/config中的值优先于etc/gitconfig中的值。
配置用户身份
$ git config --global user.name "qixige"
$ git config --global user.email "qixige569@163.com"
配置好之后,查看一下配置的信息:
$ git config user.name
$ git config user.email
或者
$ git config -l // 小写的L,查看配置的全部信息
如果需要修改用户身份信息,只需要重新使用命令覆盖即可。
设置个人编辑器
配置Git默认的编辑器;如果不配置,则默认使用系统默认的编辑器。
-
使用Emacs
$ git config --global core.editor emacs
-
使用Notepadd++
// X86系统上 $ git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -nosession" // X64系统上 $ git config --global core.editor "'C:/Program Files(86)/Notepad++/notepadd++.exe' -multiInst"
检查个人设置
列出当前Git可以找到的所有设置
$ git config --list
或查看Git中当前某个键的值
$ git config <key>
获取帮助
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
Git基础
获取Git仓库
建立Git仓库有以下两种方法:
在现有目录中初始化Git仓库
-
新建一个目录文件夹
-
进入新建的目录中,然后右键选择Git Bash Here打开git命令窗口
-
键入
git init
命令后会自动创建一个名为.git的子目录(不要去修改它)$ git init
-
将需要上传的文件放入到你新建的目录下,然后再窗口中键入以下命令进行初次提交
$ git add * $ git add LICCENSE $ git commit -m "注释信息"
克隆现有仓库
使用git clone命令默认会从服务器上把整个项目历史中每个文件的所有历史版本都拉下来。
$ git clone <仓库URL>
Git仓库中记录变更
Git的工作目录下的每个文件都处于两种状态之一:
- 已跟踪(tracked):指上一次快照中包含的文件。该文件可分为未修改、已修改或已暂存三种状态
- 未跟踪(untracked):指既不在上一次快照中,也不再暂存区中的文件。
下图是文件状态的生命周期:
查看当前文件状态
$ git status
跟踪新文件
$ git add <fileName>
$ git status
暂存已修改的文件
如果在你的工作目录中修改或者添加了文件xxx.txt,此时你应该通过 git add <file>
命令将新增或修改的文件添加到暂存区中,然后再通过 git commit -m "注释信息"
命令进行提交。
在你将文件添加到暂存区之后,你又回去修改了文件xxx.txt,然后你通过 git status
命令会发现你已暂存和未暂存的列表中会同时出现xxx.txt文件,此时你需要再一次的通过git add <file>
命令将修改的文件添加到暂存区中;然后再进行提交。
显示更简洁的状态信息
$ git status -s
$ git status --short
- M:表示已修改,但是还未暂存
- M :表示已修改且已暂存
- MM:表示已修改且已暂存,但是又被修改过
- A :表示已暂存的新文件
- ?? :表示未被跟踪的新文件
忽略文件
创建一个.gitignore文件,然后将不想git自动添加,或者不想被显示在未跟踪的列表中,可以在这个文件中编写匹配文件的模式。
.gitignore文件中的匹配模式规则:
- 空行或者以#开始的行会被忽略
- 支持标准的glob模式
- 以斜杠(/)开头的模式可用于禁止递归匹配
- 以斜杠(/)结尾的模式表示目录
- 以感叹号(!)开始的模式表示取反
查看已暂存和未暂存的变更
$ git diff
$ git diff --staged //查看哪些已暂存的内容会进入下一次提交
$ git diff --cached //查看当前已暂存的更改
提交变更
$ git commit -m "提交信息"
注意,所有未暂存的变更都不会进入到提交的内容中,包括任何在编辑之后没有执行git add命令添加到暂存区的新建或修改过的文件。
如果想要跳过暂存区直接提交,则添加-a选项即可把已跟踪的文件添加到暂存区,然后再提交。
$ git commit -a -m "提交信息"
移除文件
$ git rm <file> // 需要先已跟踪文件列表中移除(暂存区中移除)
$ git rm -f <file> //强制移除
移动文件
git不会跟踪显示跟踪你移动的或重命名的文件。git会检测出你移动还是重命名了文件。
$ git mv <source> <destination> // 重命名
$ git mv <source> <destination directory> // 移动
查看提交历史
$ git log
$ git log -p //显示每次提交所引入的差异
$ git log --stat //查看每个提交的简要统计信息
$ git log --pretty=oneline //更改日志输出的默认格式,oneline可以再每一行中显示一个提交
撤销操作
如果提交之后才发现忘了添加某些文件,或者写错了提交信息;则可以使用–amend选项
$ git commit --amend
例如出现上述情形,可以执行类似下面操作:
$ git commit -m "initial commit"
$ git add forgotten_file
$ git commit --amend
这样最终只会产生一个提交,因为第二个提交修改了第一个提交结果。
撤销已暂存文件
$ git reset HEAD <file>
撤销对文件的修改
如果想撤销修改,并把文件恢复到上次提交的状态,可使用下面命令:
$ git checkout -- <file>
需要注意的是,该命令执行后任何对文件做出的修改都会丢失,若非确信不需要被修改文件,慎用此命令。
远程仓库的使用
显示远程仓库
$ git remote
$ git remote -v // 显示git存储的每个远程仓库对应的URL
添加远程仓库
$ git remote add [shortname] [url]
从远程仓库获取和拉去数据
$ git fetch [remote-name]
将数据推送到远程仓库
$ git push [remote-name] [master]
检查远程仓库
$ git remote show [remote-name]
删除和重命名远程仓库
$ git remote rename [old remote-name] [new remote-name] //重命名
$ git remote rm [remote-name]
标记
列举标签
$ git tag
$ git tag -l "v1.8.5" //查看1.8.5系列标记版本
创建标签
Git标记主要有两种类型:
-
轻量标签
$ git tag v版本号
-
注释标签
$ git tag -a v版本号 -m "注释信息" // 例如: git tag -a v1.0 -m "my version 1.4" $ git show // 查看标签数据以及对应的提交
补加标签
$ git tag -a v版本号 校验和(或部分校验和)
共享标签
默认情况下,git push命令不会把标签传输到远程服务器,所以需要自己手动推送
$ git push origin [tagname]
$ git push origin --tags //多标签可以一次性推送
Git别名
$ git config --global alias.别名 [命令]
例如: 将commit命令设置一个别名 ci
$ git config --global alias.ci commit
sh**命令不会把标签传输到远程服务器,所以需要自己手动推送
$ git push origin [tagname]
$ git push origin --tags //多标签可以一次性推送
Git别名
$ git config --global alias.别名 [命令]
例如: 将commit命令设置一个别名 ci
$ git config --global alias.ci commit
参考资料
精通Git/[美]Scott Chacon Ben Straub著. —北京:人民邮电出版社,2017.9