程序员必备基础:Git 基础命令

引用捡田螺的小男孩 Git 命令全方位学习

前言#

掌握 Git 命令是每位程序员必备的基础,之前一直是用 smartGit 工具,直到看到大佬们都是在用 Git 命令操作的,回想一下,发现有些 Git 命令我都忘记了,于是写了这篇博文,复习一下~

文章目录

  • Git 是什么?

  • Git 的相关理论基础

  • 日常开发中,Git 的基本常用命令

  • Git 进阶之分支处理

  • Git 进阶之处理冲突

  • Git 进阶之撤销与回退

  • Git 进阶之标签 tag

  • Git 其他一些经典命令

Git 是什么#

在回忆 Git 是什么的话,我们先来复习这几个概念哈~

什么是版本控制?#

百度百科定义是酱紫的~

版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。

什么是集中化的版本控制系统?#

那么,集中化的版本控制系统又是什么呢,说白了,就是有一个集中管理的中央服务器,保存着所有文件的修改历史版本,而协同开发者通过客户端连接到这台服务器,从服务器上同步更新或上传自己的修改。

图片

什么是分布式版本控制系统?#

分布式版本控制系统,就是远程仓库同步所有版本信息到本地的每个用户。嘻嘻,这里分三点阐述吧:

  • 用户在本地就可以查看所有的历史版本信息,但是偶尔要从远程更新一下,因为可能别的用户有文件修改提交到远程哦。

  • 用户即使离线也可以本地提交,push 推送到远程服务器才需要联网。

  • 每个用户都保存了历史版本,所以只要有一个用户设备没问题,就可以恢复数据啦~

图片

什么是 Git?#

Git 是免费、开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。

图片

Git 的相关理论基础#

  • Git 的四大工作区域

  • Git 的工作流程

  • Git 文件的四种状态

  • 一张图解释 Git 的工作原理

Git 的四大工作区域#

先复习 Git 的几个工作区域哈:图片

  • Workspace:你电脑本地看到的文件和目录,在 Git 的版本控制下,构成了工作区。

  • Index/Stage:暂存区,一般存放在 .git 目录下,即.git/index, 它又叫待提交更新区,用于临时存放你未提交的改动。比如,你执行 git add,这些改动就添加到这个区域啦。

  • Repository:本地仓库,你执行 git clone 地址,就是把远程仓库克隆到本地仓库。它是一个存放在本地的版本库,其中 HEAD 指向最新放入仓库的版本。当你执行 git commit,文件改动就到本地仓库来了~

  • Remote:远程仓库,就是类似 github,码云等网站所提供的仓库,可以理解为远程数据交换的仓库~

Git 的工作流程#

上一小节介绍完 Git 的四大工作区域,这一小节呢,介绍 Git 的工作流程咯,把 git 的操作命令和几个工作区域结合起来,个人觉得更容易理解一些吧,哈哈,看图:

图片git 的正向工作流程一般就这样:

  • 从远程仓库拉取文件代码回来;

  • 在工作目录,增删改查文件;

  • 把改动的文件放入暂存区;

  • 将暂存区的文件提交本地仓库;

  • 将本地仓库的文件推送到远程仓库;

Git 文件的四种状态#

根据一个文件是否已加入版本控制,可以把文件状态分为:Tracked (已跟踪) 和 Untracked (未跟踪),而 tracked (已跟踪) 又包括三种工作状态:Unmodified,Modified,Staged

图片

  • Untracked: 文件还没有加入到 git 库,还没参与版本控制,即未跟踪状态。这时候的文件,通过 git add 状态,可以变为 Staged 状态

  • Unmodified:文件已经加入 git 库,但是呢,还没修改,就是说版本库中的文件快照内容与文件夹中还完全一致。Unmodified 的文件如果被修改,就会变为 Modified. 如果使用 git remove 移出版本库,则成为 Untracked 文件。

  • Modified:文件被修改了,就进入 modified 状态啦,文件这个状态通过 stage 命令可以进入 staged 状态

  • staged:暂存状态。执行 git commit 则将修改同步到库中,这时库中的文件和本地文件又变为一致,文件为 Unmodified 状态.

一张图解释 Git 的工作原理#

图片

日常开发中,Git 的基本常用命令#

  • git clone

  • git checkout -b dev

  • git add

  • git commit

  • git log

  • git diff

  • git status

  • git pull/git fetch

  • git push

这个图只是模拟一下 git 基本命令使用的大概流程哈~图片

git clone#

当我们要进行开发,第一步就是克隆远程版本库到本地呢

git clone url  克隆远程版本库

图片

git checkout -b dev#

克隆完之后呢,开发新需求的话,我们需要新建一个开发分支,比如新建开发分支 dev

创建分支:

git checkout -b dev   创建开发分支dev,并切换到该分支下

图片

git add#

git add 的使用格式:

git add .    添加当前目录的所有文件到暂存区

有了开发分支 dev 之后,我们就可以开始开发啦,假设我们开发完 HelloWorld.java,可以把它加到暂存区,命令如下

git add Hello.java  把HelloWorld.java文件添加到暂存区去

图片

git commit#

git commit 的使用格式:

git commit -m [message] 提交暂存区到仓库区,message为说明信息

把 HelloWorld.java 文件加到暂存区后,我们接着可以提交到本地仓库啦~

git commit -m 'helloworld开发'

图片

git status#

git status, 表示查看工作区状态,使用命令格式:

git status  查看当前工作区暂存区变动

当你忘记是否已把代码文件添加到暂存区或者是否提交到本地仓库,都可以用 git status 看看哦~图片

git log#

git log,这个命令用得应该比较多,表示查看提交历史 / 提交日志~

git log  查看提交历史

嘻嘻,看看 dev 分支上的提交历史吧要回滚代码就经常用它喵喵提交历史图片

git diff#

git diff 显示暂存区和工作区的差异

如果你想对比一下你改了哪些内容,可以用 git diff 对比一下文件修改差异哦图片

git pull/git fetch#

git pull  拉取远程仓库所有分支更新并合并到本地分支。

我们一般都会用 git pull 拉取最新代码看看的,解决一下冲突,再推送代码到远程仓库的。

图片

有些伙伴可能对使用 git pull 还是 git fetch 有点疑惑,其实 git pull = git fetch+ git merge。pull 的话,拉取远程分支并与本地分支合并,fetch 只是拉远程分支,怎么合并,可以自己再做选择。

git push#

git push 可以推送本地分支、标签到远程仓库,也可以删除远程分支哦。

git push origin master 将本地分支的更新全部推送到远程仓库master分支。

如果我们在 dev 开发完,或者就想把文件推送到远程仓库,给别的伙伴看看,就可以使用 git push origin dev~图片

Git 进阶之分支处理#

Git 一般都是存在多个分支的,开发分支,回归测试分支以及主干分支等,所以 Git 分支处理的命令也需要很熟悉的呀~

  • git branch

  • git checkout

  • git merge

git branch#

git branch 用处多多呢,比如新建分支、查看分支、删除分支等等

新建分支:

git checkout -b dev2  新建一个分支,并且切换到新的分支dev2

图片

查看分支:

git branch    查看本地所有的分支

图片

删除分支:

git branch -D <branchname>  删除本地branchname分支

图片

git checkout#

切换分支:

git checkout master 切换到master分支

图片

git merge#

我们在开发分支 dev 开发、测试完成在发布之前,我们一般需要把开发分支 dev 代码合并到 master,所以 git merge 也是程序员必备的一个命令。

git merge master  在当前分支上合并master分支过来

比如,你开发完需求后,发版需要把代码合到主干 master 分支,如下:图片

Git 进阶之处理冲突#

Git 版本控制,是多个人一起搞的,多个分支并存的,这就难免会有冲突出现~

Git 合并分支,冲突出现#

同一个文件,在合并分支的时候,如果同一行被多个分支或者不同人都修改了,合并的时候就会出现冲突。

举个粟子吧,我们现在在 dev 分支,修改 HelloWorld.java 文件,假设修改了第三行,并且 commit 提交到本地仓库,修改内容如下:

public class HelloWorld {

我们切回到 master 分支,也修改 HelloWorld.java 同一位置内容,如下:

public class HelloWorld {

再然后呢,我们提交一下 master 分支的这个改动,并把 dev 分支合并过下,就出现冲突啦,如图所示:

图片

Git 解决冲突#

Git 解决冲突步骤如下:

  • 查看冲突文件内容

  • 确定冲突内容保留哪些部分,修改文件

  • 重新提交,done

1. 查看冲突文件内容#

git merge 提示冲突后,我们切换到对应文件,看看冲突内容哈,,如下:图片

2. 确定冲突内容保留哪些部分,修改文件#

  • Git 用 <<<<<<<,=======,>>>>>>> 标记出不同分支的内容,

  • <<<<<<<HEAD 是指主分支修改的内容,>>>>>>> dev 是指 dev 分支上修改的内容

所以呢,我们确定到底保留哪个分支内容,还是两个分支内容都保留呢,然后再去修改文件冲突内容~

3. 修改完冲突文件内容,我们重新提交,冲突 done#

图片

Git 进阶之撤销与回退#

Git 的撤销与回退,在日常工作中使用的比较频繁。比如我们想将某个修改后的文件撤销到上一个版本,或者想撤销某次多余的提交,都要用到 git 的撤销和回退操作。

代码在 Git 的每个工作区域都是用哪些命令撤销或者回退的呢,如下图所示:图片

有关于 Git 的撤销与回退,一般就以下几个核心命令

  • git checkout

  • git reset

  • git revert

git checkout#

如果文件还在工作区,还没添加到暂存区,可以使用 git checkout 撤销

git checkout [file]  丢弃某个文件file

以下 demo,使用 git checkout – test.txt 撤销了 test.txt 的修改图片

git reset#

git reset 的理解#

git reset 的作用是修改 HEAD 的位置,即将 HEAD 指向的位置改变为之前存在的某个版本.

为了更好地理解 git reset,我们来回顾一下,Git 的版本管理及 HEAD 的理解

Git 的所有提交,会连成一条时间轴线,这就是分支。如果当前分支是 master,HEAD 指针一般指向当前分支,如下:

图片

假设执行 git reset,回退到版本二之后,版本三不见了哦,如下:

图片

git reset 的使用#

Git Reset 的几种使用模式图片

git reset HEAD --file

先看一个粟子 demo 吧,代码 git add 到暂存区,并未 commit 提交 , 可以酱紫回退,如下:

git reset HEAD file 取消暂存

图片

再看另外一个粟子吧,代码已经 git commit 了,但是还没有 push:

git log  获取到想要回退的commit_id

图片

如果代码已经 push 到远程仓库了呢,也可以使用 reset 回滚哦 (这里大家可以自己操作实践一下哦)~

git log

git revert#

与 git reset 不同的是,revert 复制了那个想要回退到的历史版本,将它加在当前分支的最前端。

revert 之前:图片revert 之后:图片

当然,如果代码已经推送到远程的话,还可以考虑 revert 回滚呢

git log  得到你需要回退一次提交的commit id

图片

Git 进阶之标签 tag#

打 tag 就是对发布的版本标注一个版本号,如果版本发布有问题,就把该版本拉取出来,修复 bug,再合回去。

git tag  列出所有tag

图片

Git 其他一些经典命令#

git rebase#

rebase 又称为衍合,是合并的另外一种选择。

假设有两个分支 master 和 test

      D---E test
      /
 A---B---C---F--- master

执行 git merge test 得到的结果

        D--------E
      /          \
 A---B---C---F----G---   test, master

执行 git rebase test,得到的结果

A---B---D---E---C---F---   test, master

rebase 好处是: 获得更优雅的提交树,可以线性的看到每一次提交,并且没有增加提交节点。所以很多时候,看到有些伙伴都是这个命令拉代码:git pull –rebase,就是因为想更优雅,哈哈

git stash#

stash 命令可用于临时保存和恢复修改

git stash  把当前的工作隐藏起来 等以后恢复现场后继续工作
git stash list 显示保存的工作进度列表
git stash pop stash@{num} 恢复工作进度到工作区
git stash show :显示做了哪些改动
git stash drop stash@{num} :删除一条保存的工作进度
git stash clear 删除所有缓存的stash。

git reflog#

显示当前分支的最近几次提交

程序员必备基础:Git

git blame filepath#

git blame 记录了某个文件的更改历史和更改人,可以查看背锅人

程序员必备基础:Git

git remote#

git remote   查看关联的远程仓库的名称
git remote add url   添加一个远程仓库
git remote show [remote] 显示某个远程仓库的信息
本作品采用《CC 协议》,转载必须注明作者和本文链接