Git
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
Git 是一个开源的分布式版本控制系统,可用于高效的管理从小型到大型的不同规模的项目。
特性
- 保存快照
在每次进行提交更新及保存操作时,Git都会对当前文件系统创建快照,并保存快照索引(如果数据未发生修改,则仅仅保存一个指向上一版本文件的链接)。而在其他版本控制系统中,常常采用差异比较的方式,即记录每次保存的数据之间的差异。 - 哈希校验
在每次保存数据前,通过SHA-1哈希算法计算校验和,保证数据完整性。同时,在Git数据库中,也是采用哈希值进行索引,而非采用文件名。 - 本地化操作
Git系统将整个项目的完整更改历史都保存在本地,所以即使对于提交修改,查询历史记录,版本比较等操作也可以在离线状态下完成。
工作区域及数据状态
Git中存在三个工作区域:工作目录(working directory)、缓存区(stage / index )、仓库(repository)。
- 工作目录:可以直接进行数据修改的某个版本的数据。
- 缓存区:保存下次进行提交的数据。
-
仓库:保存了项目的所有元数据。
数据状态及其转换关系
基本操作流程
- 在工作目录进行修改。
- 将修改存入缓存区。
- 将缓存区数据提交至仓库。
常用命令
创建仓库
创建仓库后,将在仓库所在目录中生成名为.git的目录,Git使用的所有版本记录等数据都将保存于该目录下。
-
新建仓库
git init
:在当前仓库中新建仓库
git init [new_repo_name]
:在创建相应名称的目录,并在其中新建仓库
-
克隆现有仓库
git clone [url]
:克隆指定url处的仓库
查看文件状态
git status
:查看所有工作区域中的文件状态
将文件加入缓存区
git add <directory/filename>
:对指定目录/文件进行跟踪(如果该文件未进行跟踪,则将该文件加入跟踪,并将文件加入缓存区)/将指定目录/文件加入缓存区(如果该文件已经进行跟踪,则将文件加入缓存区)
git add *
、git add --all
、git add .
:提交所有变化
git add --update
:仅仅提交已经跟踪的文件的变化,忽略未跟踪的文件
注意:使用该命令时,可以使用glob模式进行目录/文件匹配
glob 模式是指 shell 所使用的简化的正则表达式
星号“ * ”匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号(*) 表示匹配任意中间目录,比如a/**/z
可以匹配 a/z, a/b/z 或a/b/c/z
等
忽略文件
对于无需纳入管理的文件,可以通过设置.gitignore文件进行忽略。设置.gitignore文件后,该文件内匹配的所有文件在add时都会被自动忽略。该文件中也可以使用glob模式进行目录/文件匹配。
提交到仓库
git commit -m "提交说明"
:将缓存区的文件提交到仓库
git commit -a -m "提交说明"
:将已经跟踪的文件直接提交到仓库,跳过add环节。
移除文件
git rm <filename>
:删除文件,并移除对该文件的跟踪
git rm <directory>
:删除目录,并移除对该目录的跟踪
git rm --cached <filename>
:从仓库及缓存区删除文件,并移除对该文件的跟踪,但是该文件仍然存在于工作目录中。常用移除对于日志等文件的误跟踪
查看提交记录
git log
: 按照时间倒序显示更新记录,显示每次提交的hash值、作者、提交时间。
常用参数:
-
-p
:显示每次提交的修改。 -
-(n)
:显示前n条记录。*
撤销操作
-
重新提交
git commit --amend
:将缓存区的文件进行提交,并且覆盖掉上一次提交(上一次提交的文件及提交说明信息均被新的覆盖),最终在提交记录中只会保存此次提交,不会保存上一次提交。如果上次提交后,缓存区文件没有发生变化,则仅修改提交说明信息。
-
重置缓存区
git reset HEAD <file>
:将缓存区重置为上次提交的状态(即复制仓库中的文件替换缓存区的文件),工作目录中是文件不会被重置。该操作后,缓存区数据恢复至与仓库数据保持一致。
-
重置工作目录
git checkout -- <file>
:撤销未提交缓存的修改(即复制缓存区中的文件替换工作目录中的文件),已经加入缓存区的修改不会被重置。该操作后,工作区数据恢复至与缓存区数据保持一致。注意:该操作是不可撤销的,请谨慎使用,防止丢失未保存的数据。
版本比较
git diff [file]
:比较工作区和缓存区之间的差异。
git difff --cached
或 git diff --staged
:比较缓存区及仓库之间的差异。
git diff HEAD
:比较工作区及仓库之间的差异。ps:HEAD表示当前分支。
git diff <branch1> <branch2>
:比较两个分支之间的差异。
远程仓库
-
添加远程仓库
git remote add [shortname] [url]
:添加一个远程仓库,并将其命名为指定名称(如果没有指定shortname,默认命名为origin)。默认跟踪其所有分支。
git remote add [-t <branch>] [-m <master>]
:添加一个远程仓库,并跟踪其指定分支。
-
克隆远程仓库
git clone [url]
:克隆指定url处的仓库,并将对应的分支建立追踪关系
-
从远程仓库拉取数据
git pull [远程仓库名 远程分支名:本地分支名]
:从远程仓库拉取指定分支,并自动与本地分支合并。省略本地分支名时,表示合并到当前分支。如果本地分支与远程仓库中某一分支存在唯一的追踪关系(clone远程仓库时会自动建立该关系),则可以省略远程仓库名及远程分支名。
git fetch <远程仓库名>[/远程分支名]
:从指定远程仓库拉取数据。注意:该操作仅仅拉取数据,并不会自动将拉取的数据自动与本地的当前分支进行合并。
git merge <分支名>
:将指定分支合并到当前分支。
-
向远程仓库推送数据
git push [远程仓库名 本地分支名:远程分支名]
:将本地分支推送到远程仓库的指定分支。如果远程仓库中不存在指定分支,则自动创建。如果省略远程仓库名、本地分支名、远程分支名,则表示将当前分支推送到其追踪的远程分支。如果仅仅省略本地分支名,即为git push [远程仓库名 :远程分支名]
时,表示删除该远程分支。如果省略远程分支名,表示推送到与本地分支同名的远程分支。
-
重命名远程仓库
git remote rename <old> <new>
-
显示远程仓库
git remote
:显示已经添加的所有远程仓库名(shortname)。
git remote -v
:显示已经添加的所有远程仓库的仓库名、url。