Git知识

204 阅读6分钟

一、前言

记录Git的更深层的学习~

二、Git 日常使用

在工作中,平常使用Git的操作:

1. 从远程仓库(gitlab/github)拉取分支

git clone XXXX # gitlab/github 项目地址

2. 拉取远程分支后,查看分支git branch, 新建需求分支,或切换到某个分支

git checkout 本地分支名 # 切换分支
git checkout -b 新分支 # 以当前分支为模板新建分支

3. 在当前分支,新增/编辑/删除代码文件

4. 提交修改到本地仓库

git add . # 提交修改
git status # 查看修改文件目清单
git commit -m "修改说明" --verify # 提交修改到本地仓库

5. 提交到远程分支之前先拉取,可以是远程任意一分支

git pull origin 远程分支名

6. 如果有冲突,则在本地处理冲突,冲突解决后仍要再次回到第 4

7. 将代码推到远程仓库,此时的远程分支名与当前本地分支同名

git push origin 远程分支名

8. 当然,如果在当前分支的代码提交到远程仓库后,可能需要回滚代码到前面提交的某个版本

git reset --hard commit-id # 回滚到指定提交版本

以上便是我当前对Git的了解及使用,比较粗浅。总的来说,当前对Git的认识:

  • 熟悉Git的工作流程
  • 知道Git有两个仓库,远程仓库和本地仓库 下面来深入学习 Git

三、Git学习记录

1. Git 工作流程

从上面对Git的日常使用情况来看,只是熟悉Git的工作流程。那Git具体工作流程是怎么样的呢?借助 菜鸟教程 的一个总结,这个流程还是很到位的

image.png

首先创建仓库,有两种方式:

git init      # 方式一,创建本地仓库,会在当前目录下生成一个 .git 目录
git clone xxx # 方式二,克隆远程仓库

2. 基本概念

2.1 本地仓库

本地仓库有三个概念

(1)工作区:就是我们在电脑上能看到的项目目录,后面我们就是在这个目录下进行修改的;

(2)暂存区:用于存放临时的修改,英文名称叫 state/index,一般存放在 .git 目录下的 index 文件(.git/index)中,所以也把暂存区叫做索引(index);

(3)版本库:工作区有一个隐藏的目录 .git(将项目目录的隐藏项目开启可看到),就是版本库;

image.png

结合 工作流程 来看下他们之前的具体关系:

(1)首先在 工作区 进行修改(添加/编辑/删除);

(2)修改完成后,执行 git add 命令将文件添加到暂存区,在该命令执行后暂存区的目录树被更新,同时工作区修改的文件内容被写入到 对象库(.git/objects) 中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中;

(3)执行 gti commit 命令,将暂存区内容添加到本地仓库中,暂存区域的目录树写到版本库中,所在分支会做相应的更新。即所在分支指向的目录树就是提交时暂存区的目录树;

(4)当执行 git reset HEAD 命令回退到某次提交的版本(也可指定某文件回退到某提交的版本)时,暂存区 的目录树会被重写,被当前分支指向的目录树所替换,但是工作区是不受影响的(因为该命令只是从版本库拉取文件到暂存区, 如果想要更新到工作区,则需要执行git checkout命令);

  • 该命令适用场景:当把工作区的某个文件弄乱了,可以使用 git reset HEAD 来回退,将版本库的代码拉到暂存区,然后再通过 git checkout 命令将暂存区代码拉到工作区
  • 记录上述操作示例:
git reset HEAD^ # 回退到上一个提交版本(从版本库拉到暂存区)
会发现工作区,有显示修改状态
使用 git status 查看当前仓库状态(判断的是暂存区和版本库的文件内容差异)

image.png

发现有暂存区(代码是git reset后得到的)和工作区(工作区的代码还是最新的代码,不受回退的影响)中,当前版本库不一样。
这就说明我们成功的将上一次提交版本的代码从代码库里拉取到了暂存区。

执行 git checkout . 命令将暂存区的代码拉到工作区,此时,暂存区和工作区的文件内容是一样的,从而也就实现从代码库到暂存区,再有暂存区到工作区的转变。 image.png

(5)当执行 git rm --cached <file> 命令时,会直接从暂存区删除文件,工作区则不做出改变。

(6)当执行 git checkout . 或者 git checkout -- <file> 命令时,会用暂存区全部或指定的文件替换工作区的文件。

  • git checkout . 命令很危险,会将工作区的所有文件的内容恢复到暂存区状态,会清除工作区中未添加到暂存区中的改动。
  • git checkout -- <file> 命令,只是将指定文件的内容恢复到暂存区状态
  • 注意,执行 git checkout 命令(checkout后不加任何参数),表示检查工作区相对于版本库修改过的文件

(7)当执行 git checkout HEAD . 或者 git checkout HEAD <file> 命令时,会用 HEAD 指向的分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极危险的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动,即将暂存区和工作区的文件内容被 HEAD 指向的分支内容替换掉。

(8)使用 git diff 命令可查看所有工作区和暂存区的差异。

2.2 远程仓库

  1. git pull origin 分支名 命令,会将远程分支代码拉取到本地,与本地分支合并,然后暂存区和工作区的代码也会更代码库保持一致
  2. git push origin 分支名 命令,将本地分支推到远程分支上

2.3 操作图示

image.png

3. 命令总结

  1. git init # 初始化本地 Git 仓库,执行命令后,会在当前文件生成一个 .git 目录
  2. git clone # 克隆远程仓库
  3. git add # 将工作区内容提交到暂存区
  4. git commit # 将暂存区提交到版本库(执行后,暂存区就是"干净的")
  5. git checkout # 切换分支; 将暂存区内容拉取到工作区
  6. git reset # 版本回退,更改的是分支的 HEAD 指针
  7. git pull # 拉取远程分支到本地分支(版本库),同时暂存区和工作区内容与其合并
  8. git push # 将本地分支(版本库)推到远程
  9. git diff # 查看修改的内容

四、最后

自动化提交本地更改到远程仓库,参考笔者文章: 使用 shell 编写 git 自动化处理脚本