长达万字的git常用指令总结!!!适合小白及在工作中想要对git基本指令有所了解的人群(建议收藏)

本文最后更新于:2022年2月18日 中午

大家好,我是Smooth,一名大二的前端爱好者,目标成为一名高级前端开发工程师

本篇文章将对git在工作和学习中需要用到的大部分常用指令作详细解答

本文总结自廖雪峰老师的文档


1.git的初步认识

2.git add与git commit

3.git status和git diff

4.版本回退git reset与查看日志git log/git relog

5.撤销修改git checkout及git reset(再提及)

6.删除文件

7.分支管理 branch与switch

8.标签的使用 git tag与git show

9.远程仓库的连接

10.与Github或Gitee建立文件传输机制





1.git的初步认识

首先,Git在本地中具有工作区、暂存区与本地仓库区
平时我们修改代码时叫做工作区,当你完成项目到某个进度想保存时,那么便可将代码存到暂存区,暂存区类似于word文件中的自动保存功能,当你确认暂存区中的代码没问题要保存时,便可将代码由暂存区转到本地仓库区

那么对于一个目录,如何将它变成Git可以管理的仓库呢?(本地仓库,还不是远程仓库)
答案是:在当前目录下运行git init指令创建一个版本库,然后这个目录里面的所有文件就可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了,如果你没有看到.git目录,那是因为这个目录默认是隐藏的。

在这里插入图片描述

2.git add与git commit

由于Github使用面更广,后续演示都是针对Github来展开

总体来说,把一个文件放到本地Git仓库只需要两步。

  • 第一步,用命令git add告诉Git,把某个文件从工作区添加到暂存区。

  • git add <file>

    1
    $ git add readme.txt//将readme.txt文件添加到暂存区

    执行上面的命令,如果没有任何显示,代表正确运行。
    在这里插入图片描述

  • 第二步,用命令git commit告诉Git,将暂存区中所有文件一次性从暂存区添加到本地仓库区。

  • git commit -m <message>

    1
    $ git commit -m "wrote a readme file"//将readme.txt文件添加到本地仓库

    在这里插入图片描述

:boom:详解:boom:
.
简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。git commit命令执行成功后会告诉你,1 file changed:1个文件被改动(我们新添加的readme.txt文件);2 insertions:插入了两行内容(readme.txt有两行内容)。

为什么Git添加文件需要addcommit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:

1
2
3
$ git add file1.txt
$ git add file2.txt file3.txt//一次add命令可以有多个文件,用空格分隔
$ git commit -m "add 3 files."



3.git status和git diff

git status命令能查看当前目录中所有文件的代码状态,如果文件是红色那说明文件被修改过但还没将此次修改提交。
git diff命令顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,git diff后面跟文件名称是是查看工作区(working tree)与暂存区(index)的差别的



4.版本回退git reset与查看日志git log/git relog

你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失,这就是版本回退。

假设对于readme.txt文件,我已经提交了三个版本的修改,而对于git commit -m <message>,-m后面输入的本次提交说明如下:

版本1:wrote a readme file
版本2:add distributed
版本3:append GPL(最新版本)

  • git log
    当然,在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统Git干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    $ git log
    commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master)//最新的一次修改
    Author: Michael Liao <askxuefeng@gmail.com>
    Date: Fri May 18 21:06:15 2018 +0800

    append GPL

    commit e475afc93c209a690c39c13a46716e8fa000c366
    Author: Michael Liao <askxuefeng@gmail.com>
    Date: Fri May 18 21:03:36 2018 +0800

    add distributed

    commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
    Author: Michael Liao <askxuefeng@gmail.com>
    Date: Fri May 18 20:59:18 2018 +0800

    wrote a readme file
    如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数
    1
    2
    3
    4
    $ git log --pretty=oneline
    1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL//最新的一次修改
    e475afc93c209a690c39c13a46716e8fa000c366 add distributed
    eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file

:boom:友情提示:你看到的一大串类似1094adb…的是commit id(版本号),你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。版本号没必要写全,前几位就可以了,Git会自动去找



打算把readme.txt回退到上一个版本,也就是add distributed的那个版本,怎么做呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb…(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

  • git reset

现在,我们要把当前版本append GPL回退到上一个版本add distributed,就可以使用git reset

1
2
$ git reset --hard HEAD^//去上一个版本
HEAD is now at e475afc add distributed

也可以指定某个commit版本进行还原

1
2
$ git reset --hard 1094a//指定commit版本前五位数为1094a的进行还原
HEAD is now at 83b0afe append GPL

如果你忘记了commit版本号,可以通过git reflog来找,git reflog记录了你的每一次命令

1
2
3
4
5
$ git reflog
e475afc HEAD@{1}: reset: moving to HEAD^
1094adb (HEAD -> master) HEAD@{2}: commit: append GPL
e475afc HEAD@{3}: commit: add distributed
eaadf4e HEAD@{4}: commit (initial): wrote a readme file

:boom:过程图示:
在这里插入图片描述
总结:

  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令
    git reset --hard commit_id
  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。



5.撤销修改git checkout及git reset(再提及)

  • 撤销工作区的修改

当你对工作区文件完成修改时,你可以选择git add提交到暂存区,也可以选择git checkout撤销此次修改

1
2
3
4
5
6
7
8
9
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,
这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到上次提交到暂存区后的状态。
总之,就是让这个文件回到最近一次git commitgit add时的状态。

  • 撤销暂存区的修改

当你对工作区文件完成修改且已经提交到了暂存区,你可以选择git commit提交到本地仓库区,也可以选择git reset把暂存区的修改撤销掉

1
2
3
$ git reset HEAD readme.txt//前文讲过,HEAD代表当前最新版本的文件
Unstaged changes after reset:
M readme.txt

可知,git reset命令既可以回退版本,也可以把暂存区的修改撤销到工作区。

  • 撤销本地仓库区的修改

什么时候需要撤销本地仓库区的修改呢?那便是已经git commit到本地仓库了,那便回到前文的版本回退章节进行查阅,git reset --hard 指定版本即可



6.删除文件

在Git中,删除也是一个修改操作
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm <file>命令删了

1
$ rm test.txt

这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了

  • 如果你只是误删文件,那么可以通过git checkout指令恢复(撤销本次修改)
    1
    $ git checkout -- test.txt
  • 如果你确实要从版本库中删除该文件,那就用命令git rm删掉,再git commit提交本次修改
    1
    2
    3
    4
    5
    6
    7
    $ git rm test.txt
    rm 'test.txt'

    $ git commit -m "remove test.txt"
    [master d46f35e] remove test.txt
    1 file changed, 1 deletion(-)
    delete mode 100644 test.txt
    小提示:先手动删除文件,然后使用git rm 和git add效果是一样的。



7.分支管理 branch与switch

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险
现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。


:boom:branch系列指令进行分支相关操作

  • 查看分支

git branch命令列出本地仓库中所有分支,当前分支前面会标一个*

1
2
3
$ git branch
* dev
master
  • 创建与合并分支
  • 创建

git branch dev创建dev分支
git checkout dev将HEAD指针切换到dev分支

1
2
3
$ git branch dev
$ git checkout dev
Switched to branch 'dev'

git checkout -b dev git checkout命令加上-b参数表示创建并切换,相当于上面两条命令
先创建dev分支,然后切换到dev分支

1
2
$ git checkout -b dev
Switched to a new branch 'dev'



  • 合并

当你在dev分支上对readme.txt文件进行修改后,想将该修改合并到master主分支上时,两步:

git checkout 分支名切换到master分支

1
2
$ git checkout master
Switched to branch 'master'

git merge 需要被合并的分支名合并dev分支

1
2
3
4
5
$ git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)

合并完成后,就可以删除dev分支了,相较于git checkout dev添加分支,加个参数-d代表delete

1
2
$ git branch -d dev
Deleted branch dev (was b17d20e).




:boom:switch系列指令进行分支相关操作

注意到切换分支使用git checkout <branch>,而前面讲过的撤销修改则是git checkout -- <file>,同一个命令,有两种作用,确实有点令人迷惑。

实际上,切换分支这个动作,用switch更容易理解。因此,最新版本的Git提供了新的git switch命令来切换分支:

创建并切换到新的dev分支,可以使用:

1
$ git switch -c dev//代替git checkout -b dev

直接切换到已有的master分支,可以使用:

1
$ git switch master//代替git branch dev




:boom:总结:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>或者git switch <name>

创建+切换分支:git checkout -b <name>或者git switch -c <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>





8.标签的使用 git tag与git show

前言:为什么要使用标签?

发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的commit版本,就是把那个打标签的时刻的历史版本取出来。所以,标签也是版本库的一个快照。
Git有commit版本号,为什么还要引入tag?
因为commit版本是类似6a5819e...的一大串字符,不好找、辨别
如果将6a5819e...变成v1.2,就容易了很多
所以,tag就是一个让人容易记住的有意义的名字,它跟某个commit版本号绑在一起。




创建标签

git tag <tagname>
git tag -a <tagname> -m "blablabla..."


  • 给整个分支打标签
    首先,git branch切换到需要打标签的分支上

    1
    2
    3
    4
    5
    $ git branch
    * dev
    master
    $ git checkout master
    Switched to branch 'master'

    然后git tag <tagname>打标签即可

    1
    $ git tag v1.0
  • 给过去的某个commit版本打标签
    git tag <tagname> <commid id>

默认标签是打在最新提交的commit上的,历史的找到历史提交的commit id,然后打上就可以了

比方说要对add merge这次提交打标签,它对应的commit id是f52c633

1
$ git tag v0.9 f52c633




还可以创建带有说明的标签,用-a指定标签名,-m指定说明文字
git tag -a <tagname> -m "blablabla..." <commit id>

1
$ git tag -a v0.1 -m "version 0.1 released" 1094adb





查看标签

git tag
可以用命令git tag查看所有标签

1
2
$ git tag
v1.0

git show <tagname>
标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息:

1
2
3
4
5
6
7
8
9
$ git show v0.9
commit f52c63349bc3c1593499807e5c8e972b82c8f286 (tag: v0.9)
Author: Michael Liao <askxuefeng@gmail.com>
Date: Fri May 18 21:56:54 2018 +0800

add merge

diff --git a/readme.txt b/readme.txt
...





删除标签

  • 命令git tag -d <tagname>可以删除一个本地标签;

  • 命令git push origin :refs/tags/<tagname>可以删除一个远程标签。



推送标签到远程库

  • 命令git push origin <tagname>可以推送一个本地标签;

  • 命令git push origin --tags可以推送全部未推送过的本地标签;





9.远程仓库的连接

目前广为人知的两个远程仓库有Github和Gitee(码云)

Github:人气最高,人们普遍使用的一个国际化代码管理平台

Gitee:使用GitHub时,国内的用户经常遇到的问题是访问速度太慢,有时候还会出现无法连接的情况
如果我们希望体验Git飞一般的速度,可以使用国内的Git托管服务——Gitee(gitee.com)

目标:
在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步。



与远程库建立连接

git remote add 远程仓库名字 git@github.com:远程仓库路径//远程仓库路径如下图

1
$ git remote add origin git@github.com:michaelliao/learngit.git

在这里插入图片描述
建立好连接后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。


向远程库输出本地库中的文件

git push -u 远程仓库名称 要推送的本地分支名称

1
2
3
4
5
6
7
8
9
10
$ git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:michaelliao/learngit.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。

从现在起,只要本地作了提交,就可以通过命令:

1
$ git push origin master//origin依旧为远程库名称,master为要推送的分支名称





删除远程库

在删除前,建议先用git remote -v查看远程库信息

1
2
3
$ git remote -v
origin git@github.com:michaelliao/learn-git.git (fetch)
origin git@github.com:michaelliao/learn-git.git (push)

git remote rm <name> 删除远程库,name为远程库名称
比如删除前文创建的名为origin的远程库

1
$ git remote rm origin




温馨提示:此处的“删除”其实是解除了本地和远程的绑定关系,并不是物理上删除了远程库。远程库本身并没有任何改动。要真正删除远程库,需要登录到GitHub,在后台页面找到删除按钮再删除。



:boom:总结:

  • 要关联一个远程库,使用命令git remote add 远程仓库名字 git@github.com:远程仓库路径

  • 关联一个远程库时必须给远程库指定一个名字,origin是默认习惯命名;

  • 关联后,使用命令git push -u 远程仓库名称 要推送的本地分支名称 第一次推送master分支的所有内容;

  • 此后,每次本地提交后,只要有必要,就可以使用命令git push -u 远程仓库名称 要推送的本地分支名称推送最新修改;





10.与Github或Gitee建立文件传输机制

你的本地Git仓库和GitHub仓库之间的传输方式有两种,一种是通过https,另一种是通过SSH加密的

HTTPS:使用https url克隆对初学者来说会比较方便,复制https url然后到git Bash里面直接用clone命令克隆到本地就好了,但是每次fetch和push代码都需要输入账号和密码,这也是https方式的麻烦之处(发现了https免密登录的方式)。

SSH:使用SSH url克隆却需要在克隆之前先配置和添加好SSH key,因此,如果你想要使用SSH url克隆的话,你必须是这个项目的拥有者或管理员,否则你是无法添加SSH key的。另外ssh默认是每次fetch和push代码都不需要输入账号和密码



至于如何将本机与Github和Gitee建立SSH连接,方便推送不用输入邮箱密码,请参考下面链接:





这是我的第一篇万字博客!希望大家能够喜欢并从中收获到知识

以上便是这篇文章的全部内容啦

最后

最后,我叫Smooth,在今年2022年我也会尽自己所能书写更多前端教程~

掘金:https://juejin.cn/user/1302297507801358

CSDN:https://i.csdn.net/#/user-center/profilehttp://blog.zhangjiancong.top)

最近发文计划为 Webpack 以及 性能优化 知识体系

同时也可扫码关注我的公众号,公众号同步更新


作者:Smooth

文章链接:http://example.com/2022/02/12/%E9%95%BF%E8%BE%BE%E4%B8%87%E5%AD%97%E7%9A%84git%E5%B8%B8%E7%94%A8%E6%8C%87%E4%BB%A4%E6%80%BB%E7%BB%93/

版权说明:本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!