Git【常见知识点速查】

文章更新时间:2020/06/17

一、基础知识点解析

Git工作流程

   以上包括一些简单而常用的命令,但是先不关心这些,先来了解下面这4个专有名词。

  • Workspace:工作区
  • Index / Stage:暂存区
  • Repository:仓库区(或本地仓库)
  • Remote:远程仓库

工作区

  程序员进行开发改动的地方,是你当前看到的,也是最新的。 平常我们开发就是拷贝远程仓库中的一个分支,基于该分支进行开发。在开发过程中就是对工作区的操作。

暂存区

  .git目录下的index文件, 暂存区会记录git add添加文件的相关信息(文件名、大小、timestamp...),不保存文件实体, 通过id指向每个文件实体。可以使用git status查看暂存区的状态。暂存区标记了你当前工作区中,哪些内容是被git管理的。 当你完成某个需求或功能后需要提交到远程仓库,那么第一步就是通过git add先提交到暂存区,被git管理。

本地仓库

  保存了对象被提交过的各个版本,比起工作区和暂存区的内容,它要更旧一些。 git commit后同步index的目录树到本地仓库,方便从下一步通过git push同步本地仓库与远程仓库的同步。

远程仓库

  远程仓库的内容可能被分布在多个地点的处于协作关系的本地仓库修改,因此它可能与本地仓库同步,也可能不同步,但是它的内容是最旧的。

小结

  • 任何对象【文件】都是在工作区中诞生和被修改;
  • 任何修改都是从进入index区【暂存区】才开始被版本控制;
  • 只有把修改commit【提交】到本地仓库,该修改才能在仓库中留下痕迹;
  • 与协作者分享本地的修改,可以把它们push【推送】到远程仓库来共享。

  下面这幅图更加直接阐述了四个区域之间的关系,可能有些命令不太清楚,没关系,下部分会详细介绍。

二、常用术语

  开局一张图:

head

   HEAD,它始终指向当前所处分支的最新的提交点。你所处的分支变化了,或者产生了新的提交点,HEAD就会跟着改变。

add

  add相关命令很简单,主要实现将工作区修改的内容提交到暂存区,交由git管理。

  • git add . 添加当前目录的所有文件到暂存区
  • git add [dir] 添加指定目录到暂存区,包括子目录
  • git add [file1] 添加指定文件到暂存区

commit

   commit相关命令也很简单,主要实现将暂存区的内容提交到本地仓库,并使得当前分支的HEAD向后移动一个提交点。

  • git commit -m [message] 提交暂存区到本地仓库,message代表说明信息
  • git commit [file1] -m [message] 提交暂存区的指定文件到本地仓库
  • git commit --amend -m [message] 使用一次新的commit,替代上一次提交

branch

  涉及到协作,自然会涉及到分支,关于分支,大概有展示分支,切换分支,创建分支,删除分支这四种操作

  • git branch 列出所有本地分支
  • git branch -r 列出所有远程分支
  • git branch -a 列出所有本地分支和远程分支
  • git branch [branch-name] 新建一个分支,但依然停留在当前分支
  • git checkout -b [branch-name] 新建一个分支,并切换到该分支
  • git branch --track [branch][remote-branch] 新建一个分支,与指定的远程分支建立追踪关系
  • git checkout [branch-name] 切换到指定分支,并更新工作区
  • git branch -d [branch-name] 删除分支
  • git push origin --delete [branch-name] 删除远程分支

三、Git标签

  为什么git标签要单独拿出来讲呢,因为git的标签【tag】与分支管理类似,但又有不同的地方,可以说是独立出来的一种版本管理方式,所以我们先简单看一下相关的概念。

  作用:通常在发布软件的时候打一个tag,tag会记录版本的commit号方便后期回溯

  常用命令:

  • git tag :列出所有的标签
  • git tag -l '关键字' :列出含有关键字的标签【例子:git tag -l 'v1.*' (查找v1.开头的标签)】
  • git tag '标签名字' :新建一个标签,并指定标签名字【例子:git tag 'v1.0'(创建一个名为v1.0的标签)】
  • git tag -a '标签名字' -m '标签备注' :新建一个标签,指定名字,并添加标签备注【例子:git tag -a 'v1.0' -m '第一版打标'
  • git tag -a '标签名字' 'commit号'  -m '标签备注' :新建一个标签,指定名字和备注,并根据commit号选定对应的commit来进行打标,此操作可以对与以前的commit进行打标 【例子:git tag -a 'v1.0' 23ed6s -m '第一版打标'
  • git show '标签名字' :查看标签详细信息,包括commit编号,备注,日期等信息【例子:git show 'v1.0'
  • git push origin '标签名字' :推送tag至远程仓库,相当于新建分支后的push操作【例子:git push origin 'v1.0'
  • git push origin --tags :推送本地所有tag至远程仓库
  • git checkout '标签名字' :操作类似于分支的检出,但不同的是,此时检出的标签不位于任何分支,处于游离状态,可以考虑基于这个tag创建一个分支【例子:git checkout 'v1.0'】
  • git tag -d '标签名字' :删除某个标签【例子:git tag -d 'v1.0'
  • git push origin :refs/tags/标签名字 :删除远端仓库的某个标签【例子:git push origin :refs/tags/v1.0

四、常用命令详解

merge【合并】

#从某分支合并到当前分支【推荐使用小乌龟git,图形化界面操作更方便~】
git merge  需要合并到当前分支的名称

  作用:合并其他分支的代码到当前分支。

  merge命令主要是用来实现从一个分支合并到当前分支的功能,假如平时我们在dev分支开发业务功能,等到上线的时候就需要合并到master分支进行上线,那么我们需要以下步骤:

  • 1、本地分支切换到dev分支,并拉取代码,保证代码为最新版本
  • 2、本地分支切换到master分支,同样保证代码为最新版本
  • 3、选择merge分支为dev分支
  • 4、merge完成后,解决冲突
  • 5、冲突解决后,把本地的master分支push到远端,merge流程完成

  需要注意的是,merge有两种类型的合并:

  • fast-forward:当本地分支相对于合并分支没有新的提交时,默认采用这种形式
  • no-fast-forward:当本地分支相对于合并分支有新提交时,采用这种

图示:

 

Rebase【变基】

#从某分支变基更新的代码到当前分支【推荐使用小乌龟git,图形化界面操作更方便~git rebase 需要变基到当前分支的名称

  作用:把新代码和本地代码进行合并,解决冲突。

  变基操作主要应用在我们本地代码需要获取其他分支或者当前分支的最新代码时会用到,rebase是一个线性操作,不去校验冲突,对于已存在的文件总是会选择最新的版本,一般本地操作分为以下几个步骤:

  • 1、从远端fetch到最新的代码到本地
  • 2、对当前分支进行rebase,把本地分支的代码更新为最新的

  PS:若从不同分支直接rebase过来时,类似于merge操作,但是一般来说,merge需要经过冲突文件的解决,而rebase对于同一个文件,总是会选择最新的版本。

图示:

  还有一种变基方式为交互式变基,如果有不想提交的代码本地commit了的时候,可以对此次commit进行修改,常用到的命令有以下几种:

  • reword:修改提交信息
  • edit:修改此提交
  • squash:将提交融合到前一个提交中
  • fixup:将提交融合到前一个提交中,不保留该提交的日志消息
  • exec:在每个提交上运行我们想要 rebase 的命令
  • drop:移除该提交

图示:

Reset【重置】

  作用:恢复分支代码到一个特定的版本。

  重置命令一般使用在进行了一个不想要的提交,那么除了交互式变基我们还可以使用这种方式去快乐的玩耍~,重置也分两种,软重置和硬重置:

#软重置
git reset --sorrt  需要恢复到的commit版本

#硬重置
git reset --hard  需要恢复到的commit版本

概念理解一下:  

  • 软重置一般发生在我们想回到原来的提交进行审查,但是又想保留之后提交的文件时,会采用这种方式。
  • 硬重置一般发生在我们想回到原来的提交,而后面的提交不想要了,就用这种方式。

图示:

Revert【还原】

  作用:还原代码。

  这个命令就好理解了,比如我们本地改了一堆东西,发现改错了,直接revert就可以了~

  又或者有这种场景,在某个分支上提交了一个文件,但是后面我们又不想要这个文件了,可以revert这次commit【只还原当次commit,同时会增加一个还原操作的新commit】

  下图演示了这么一个场景:假设 ec5be 添加了一个 index.js 文件。但之后我们发现其实我们再也不需要由这个提交引入的修改了,就可以还原一波,并且增加了一个还原操作的新commit:9e78i。

Cherry-pick【拣选/选樱桃~】

  作用:拣选需要的commit到当前分支

  这个操作的名称翻译过来有点意思,选樱桃~,字面理解就是选取精华的东西,那在项目中实际上应用的场景是:

  • 1、dev分支对于master分支多出了一个commit1,和commit2
  • 2、master分支只想要dev分支的commit2而已,不想整个dev分支合并过来
  • 3、那我们可以使用这个命令来选择单个commit复制到master分支上

图示:

图中演示了master分支把带有index.js文件的commit(76d12)拣选到master分支上的过程。

Fetch【取回】

  作用:取回当前分支最新的代码,不对本地分支进行数据修改,只是下载新的代码

  fetch操作主要是用于获取远程最新资源的命令,仅仅是下载新的数据而已,而不对本地代码做操作。

图示:

Pull【拉取】

  作用:拉取远端最新的代码到本地,并且合并,同时需要解决冲突【相当于Pull = Fecth + rebase】

图示:

Reflog【查看操作记录】

  git reflog 可以展示已经执行过的所有动作的日志。包括合并、重置、还原,基本上包含你对你的分支所做的任何修改。

  图示:

  有了操作记录以后,我们可以针对某个操作记录进行处理,比如说我想恢复到某个节点的commit,可以类似于图下的操作流程:

  如上图,我们先通过git reflog查看了当前分支的提交记录,然后选取了HEAD@{1}这个版本进行reset,就可以恢复到对应的版本了。【reset命令也可以使用对应版本号来指向,不一定要用head的形式】

原文地址:https://www.cnblogs.com/riches/p/12780115.html