Git基础整理

273 阅读5分钟

Git是平常软件开发中经常使用的版本控制系统,本文对git的原理、基础和配置方式进行了介绍,同时总结了平时使用过程中常见的git操作。

1. 概念

  1. 集中式版本控制系统:有一个单一的集中管理的服务器,开发人员都可以连接到这台服务器,进行协同工作。
  • 优点是系统容易管理和维护
  • 缺点是如果中央服务器出现故障,工作将不能进行
  1. 分布式版本控制系统:不是只提取最新版本的文件快照,而是将整个代码仓库拷贝到本地,即使服务器故障也能通过本地仓库进行完整的恢复。

2. 基础

  • git保存数据是保存整个文件系统的一个快照

    git-snapshot

  • 其他大部分系统保存的是文件的变更信息

    delta

  • git大部分操作都是在本地完成的,因此速度很快。即使没有网络,也可以提交文件,之后再上传

  • git通过SHA-1(哈希)计算校验和,由40个十六进制数组成的字符串。git数据库中保存的信息都是通过文件内容的hash值进行索引的而不是文件名。

  • git的三个工作区域

    • git仓库:用来保存项目的数据以及数据库,当从其他地方clone项目时,拷贝的就是这里面的数据。
    • 工作目录:存放的是项目某个版本的内容,存放于磁盘可供修改等操作,来源于git仓库中的压缩数据库。
    • 暂存区域: 是一个文件,保存了将提交的文件信息。
  • git工作流程

    • 在工作目录中修改文件(modified)
    • 将修改的文件暂存在暂存区域(staged)
    • 提交更新,将暂存区的文件存储到git仓库中(commited)

3. git配置

git config

  • --system:系统上所有用户及仓库的通用配置
  • --global:针对当前用户的配置
  • --config:针对当前仓库的配置

上述配置具有优先级,由上往下递增,高优先级的覆盖低优先级的配置。

第一次使用时会配置个人信息 $ git config --global user.name yourname $ git config --global user.email your@email.com 这些信息会写入每一次提交中,该配置只需配置一次。若想对某个项目使用特定的用户信息,通过git config来配置。 可通过git config --list查看所有配置信息,也可通过如git config user.name来查看用户名

4. git基础操作

4.1 创建git仓库

  • 在已有项目中创建git仓库:通过$ git init命令创建一个.git子目录,里面存储了git仓库初始化时的必须文件,但不包括项目文件。
  • 克隆仓库:通过$ git clone theUrlYouWantToClone,会克隆该仓库的所有版本的文件而不是最新版本的文件。执行该操作后会在当前目录下创建一个与该仓库同名的目录,并在该目录下初始化一个.git文件夹,将远程仓库中的数据拉取到该文件夹,并从中读取最新版本的项目文件,拷贝至其同级目录。
  • 可通过$ git clone theUrlYouWantToClone myProjectName修改仓库名称theUrlYouWantToClone,可支持多种协议,git中常用到的是https、git和SSH协议。

4.2 文件状态

文件具有两种状态已跟踪未跟踪

  • 已跟踪的文件指的是已被纳入版本控制的文件,它们可能处于未修改已修改已暂存等状态。
  • 将文件从git中移除、新建立一个文件等操作产生的文件都会处于未跟踪状态。 git版本控制下文件的生命周期
    life-cycle

4.3 git add命令

4.3.1 跟踪新文件

通过$ git add filename$ git add pathname可分别跟踪某个文件和某个路径下的所有文件,或者通过$ git add .来跟踪所有文件。

4.3.2 暂存已修改文件

与上述方法相同

因此,git add具有多种功能,可理解为向下次提交中添加内容

4.4 git status命令

该命令用于查看文件状态 也可通过$ git status -s或者$ git status --short查看简写的文件状态。

$ git status -s
M README
MM Rakefile
A  lib/git.rb
M  lib/simplegit.rb
?? LICENSE.txt

各种记号的解释如下:

  • ??:未跟踪文件
  • A:新添加到暂存区的文件
  • _M:文件被修改但未添加到暂存区
  • M_:文件被修改且已添加到暂存区
  • MM:文件被修改且已添加到暂存区后又被修改

4.5 .gitignore文件

忽略文件的具体格式可见忽略文件

4.6 git diff命令

git diff命令用于查看文件的修改,与git status相比可以具体显示修改的内容。

  • $ git diff显示的是已修改但未暂存的文件内容
  • $ git diff --cached$ git diff --staged查看已暂存但未提交的内容

4.7 git commit命令

通过git commit命令可将暂存区内的文件进行提交,而未暂存的文件则不会被提交。 可用$ git commit命令按提示完成提交或直接通过$ git commit -m "yourComments"进行提交说明并提交。 若想对所有已暂存和未暂存的文件进行提交可使用$ git commit -a -m "yourComments"进行提交,这样可简化操作步骤。

4.8 移除文件

移除文件需要git remove操作。

  • 通过$ git rm fileName即可将文件移出git版本控制并同时删除工作区中的文件,之后执行commit操作提交即可。
  • 若是直接手动将文件删除,此时文件将会处于未暂存状态,通过git add或git rm操作便可进入已暂存状态,之后执行commit操作即可。
  • 若文件进过修改并送入暂存区,需要用$ git rm -f fileName才能强制删除或通过上述第一种方式删除。
  • 若是要将文件从git版本控制中删除但又不想从工作区中删除,则可通过$ git rm --cached fileName命令来实现。

4.9 移动文件

移动文件操作通过$ git mv fileFrom fileTo来实现,该操作执行过程实际上是执行了删除fileFrom文件之后添加fileTo文件。

4.10 撤销操作

  1. 修改提交文件
  • 若提交后发现漏掉其他文件,可通过$ git commit --amend操作将当前暂存区的文件加入上次提交中,相当于只存在一次提交。
  • 若是想修改提交文件的提交信息,可通过$ git commit --amend -m "newComments"
  1. 取消暂存文件
  • 通过$ git reset HEAD fileName可将文件从暂存区中移除,进入未暂存状态。
  1. 取消已修改文件
  • 通过$ git checkout -- fileName将已修改的文件还原至上一次未修改时的状态。

4.11 远程仓库

git项目的协作时会用到远程仓库,当克隆一个项目时,会有一个默认的名为origin的远程仓库。

  • 可通过$ git remote查看所有远程仓库或$ git remote -v查看所有远程仓库的具体信息。通过$ git remote show remoteName查看指定远程仓库的详细信息。
  • 通过$ git remote add shortNameForTheRemoteRepository RepositoryUrl
  • 通过$ git fetch shortName可获取该远程仓库中的所有信息,但不会合并或修改当前工作区的文件
  • 通过$ git pull命令获取远程仓库的数据并合并到当前分支,默认情况下,本地的master分支会跟踪远程仓库的master分支。
  • 通过$ git push remoteName branchName将当前分支推送到指定远程仓库的指定分支上。
  • 重命名远程仓库可使用$ git remote rename originalName currentName
  • 删除远程仓库可使用$ git remote rm repositoryName

5. git分支

使用分支可以将开发工作从主线上进行分离,git的默认分支是master分支。git使用HEAD指针指向当前分支,可看做当前分支的一个别名。

5.1 创建分支

创建分支实际上就是创建了一个指向当前项目的指针,通过$ git branch命令可以查看当前分支,$ git branch branchName用于创建分支。

5.2 切换分支

命令$ git checkout branchName用于切换分支,切换分支后当前的工作区的文件也会随之改变。 git分支是以提交的文件为基础的,一般情况下在修改文件后只有当提交了文件才能切换到另一个分支,但也有特殊情况,以branch1和branch2两个分支为例,若在branch1中添加了新文件,此时切换到branch2分支可以看到该文件,若此时提交则该文件属于branch2分支,再次切回branch1中不会保留该文件

5.3 删除分支

通过$ git branch -d branchName可以删除该分支

5.4 分支合并

首先通过$ git checkout branchName切换到某一分支,如master分支,接下来执行$ git merge branchName将对应分支合并到master中。 合并过程中如果两个分支对同一个文件进行了操作,则会产生冲突,需要手动解决,产生冲突的内容会在工作区中的相应文件中被标记出来,需要自己去判断保留哪一份修改,之后执行提交即可。

5.5 跟踪远程分支

若想跟踪远程分支可以通过$ git checkout --track remoteRepository/remoteBranch,也可通过$ git checkout -b branchName remoteRepository/remoteBranch新建分支并跟踪远程分支,两者的不同点只是新建分支的名字不同。 若本地已有分支,则可通过$ git branch -u remoteRepository/remoteBranch添加或修改跟踪。 通过$ git branch -vv命令可以查看远程分支的跟踪信息。

5.6 删除远程分支

命令$ git push remoteRepository --delete remoteBranch可用于删除远程分支。