Git 初步

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)。


三种工作区域之间的关系
  • 工作目录:可以直接进行数据修改的某个版本的数据。
  • 缓存区:保存下次进行提交的数据。
  • 仓库:保存了项目的所有元数据。


    数据状态及其转换关系
基本操作流程
  1. 在工作目录进行修改。
  2. 将修改存入缓存区。
  3. 将缓存区数据提交至仓库。

常用命令

创建仓库

创建仓库后,将在仓库所在目录中生成名为.git的目录,Git使用的所有版本记录等数据都将保存于该目录下。

  • 新建仓库

git init :在当前仓库中新建仓库
git init [new_repo_name] :在创建相应名称的目录,并在其中新建仓库

  • 克隆现有仓库

git clone [url] :克隆指定url处的仓库

查看文件状态

git status:查看所有工作区域中的文件状态

将文件加入缓存区

git add :对指定目录/文件进行跟踪(如果该文件未进行跟踪,则将该文件加入跟踪,并将文件加入缓存区)/将指定目录/文件加入缓存区(如果该文件已经进行跟踪,则将文件加入缓存区)
git add *git add --allgit 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 :删除文件,并移除对该文件的跟踪
git rm :删除目录,并移除对该目录的跟踪
git rm --cached :从仓库及缓存区删除文件,并移除对该文件的跟踪,但是该文件仍然存在于工作目录中。常用移除对于日志等文件的误跟踪

查看提交记录

git log: 按照时间倒序显示更新记录,显示每次提交的hash值、作者、提交时间。
常用参数:

  • -p:显示每次提交的修改。
  • -(n):显示前n条记录。*

撤销操作

  • 重新提交

git commit --amend:将缓存区的文件进行提交,并且覆盖掉上一次提交(上一次提交的文件及提交说明信息均被新的覆盖),最终在提交记录中只会保存此次提交,不会保存上一次提交。如果上次提交后,缓存区文件没有发生变化,则仅修改提交说明信息。

  • 重置缓存区

git reset HEAD :将缓存区重置为上次提交的状态(即复制仓库中的文件替换缓存区的文件),工作目录中是文件不会被重置。该操作后,缓存区数据恢复至与仓库数据保持一致。

  • 重置工作目录

git checkout -- :撤销未提交缓存的修改(即复制缓存区中的文件替换工作目录中的文件),已经加入缓存区的修改不会被重置。该操作后,工作区数据恢复至与缓存区数据保持一致。注意:该操作是不可撤销的,请谨慎使用,防止丢失未保存的数据。

版本比较

git diff [file]:比较工作区和缓存区之间的差异。
git difff --cachedgit diff --staged:比较缓存区及仓库之间的差异。
git diff HEAD:比较工作区及仓库之间的差异。ps:HEAD表示当前分支。
git diff :比较两个分支之间的差异。

远程仓库

  • 添加远程仓库

git remote add [shortname] [url]:添加一个远程仓库,并将其命名为指定名称(如果没有指定shortname,默认命名为origin)。默认跟踪其所有分支。
git remote add [-t ] [-m ]:添加一个远程仓库,并跟踪其指定分支。

  • 克隆远程仓库

git clone [url] :克隆指定url处的仓库,并将对应的分支建立追踪关系

  • 从远程仓库拉取数据

git pull [远程仓库名 远程分支名:本地分支名]:从远程仓库拉取指定分支,并自动与本地分支合并。省略本地分支名时,表示合并到当前分支。如果本地分支与远程仓库中某一分支存在唯一的追踪关系(clone远程仓库时会自动建立该关系),则可以省略远程仓库名及远程分支名。
git fetch <远程仓库名>[/远程分支名]:从指定远程仓库拉取数据。注意:该操作仅仅拉取数据,并不会自动将拉取的数据自动与本地的当前分支进行合并。
git merge <分支名>:将指定分支合并到当前分支。

  • 向远程仓库推送数据

git push [远程仓库名 本地分支名:远程分支名]:将本地分支推送到远程仓库的指定分支。如果远程仓库中不存在指定分支,则自动创建。如果省略远程仓库名、本地分支名、远程分支名,则表示将当前分支推送到其追踪的远程分支。如果仅仅省略本地分支名,即为git push [远程仓库名 :远程分支名]时,表示删除该远程分支。如果省略远程分支名,表示推送到与本地分支同名的远程分支。

  • 重命名远程仓库

git remote rename

  • 显示远程仓库

git remote:显示已经添加的所有远程仓库名(shortname)。
git remote -v:显示已经添加的所有远程仓库的仓库名、url。

你可能感兴趣的:(Git 初步)