当前位置:   article > 正文

Git常用命令详解_git所有命令详解

git所有命令详解

前言

我之前虽然已经学过git,但也只是会add,commit,push。
于是乎,我又真儿八经的学了遍git,这篇文章也算是对我学习的一个归纳整理。

虽然 git 是作为一个开发工具出现的,但我认为普通人学习 git 也是个不错的选择,
对于非开发者的普通人而言,它可以对你的文件进行很好的管理

比如以下场景(括号里是专业词):

  • 在同一目录下只显示你想要的文件,文件夹(分支管理)
  • 对任意误操作进行撤销(版本回滚)
  • 把文件备份到云端(远程仓库管理)
  • 把云端文件下载到本地管理,再上传到云端(远程仓库管理)

操作环境

Ubuntu22.04
git2.44.0

准备工作

Linux

必须会基本的 Linux 命令

安装git

#update apt sources
sudo apt update && sudo apt upgrade

#install git
sudo apt install -y git
  • 1
  • 2
  • 3
  • 4
  • 5

git简介

git是一个版本控制系统,顾名思义它是用来控制代码的版本,目前被很多企业,公司以及个人广泛使用,是目前最流行的版本控制系统。

本地控制

几乎所有的操作都是在本地进行的,这意味着你可以脱机完成 git 的版本控制。

保证完整性

git采用哈希值来效验数据的完整性,在存储数据前,会先计算效验和,然后以校验和来引用。在Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

Git 一般只添加数据

在 git 中你所做的操作几乎都是在 git 中添加数据,而不是删除,这意味着 git 几乎不会执行任何可能导致文件不可恢复的操作。

git大致流程

熟悉 git 的结构对后面命令的使用有很大的帮助。
在这里插入图片描述

可以看到分为四个部分:

  • 工作区:最原始的工作目录,此时目录下的所有文件和目录都和 git 没有关系。

  • 暂存区:使用 git add 命令可以对工作区的文件进行 git 追踪,存入暂存区,被追踪的文件可以被 git 所控制。以后所有的代码管理和版本控制都是基于被追踪的情况下操作。

  • 本地仓库:当我们把文件添加到暂存区后,需要通过 git commit 命令将暂存区的文件提交到本地仓库。

  • 远程仓库:把本地仓库的文件提交到其他电脑上的 git 仓库或者代码托管平台(GitHub,Gitee,GitLab等)。

本地仓库管理

初始化git仓库

首先我们需要新建一个普通的目录来演示。

mkdir test
cd test
  • 1
  • 2

我们可以使用 git init 目录来把当前的目录初始化为一个 git 仓库。执行后,在该目录下会生成一个 .git 目录
.git 用于记录你所有的 git 操作以及所有的 git 相关配置信息等。它是 git 的核心,代表当前目录是一个 git 仓库,后续所有操作均基于它。

git init
  • 1

存到暂存区

前面我们说过可以使用 git add 命令把文件交给 git 管理,他的语法如下:

git add 文件名
  • 1

不过我们有时候希望 add 所有的文件,而一个个 add 文件名太过麻烦,所以 git 也支持通配符,可以使用点来表示所有的文件;

git add .
  • 1

Note:git add . 追踪的是被修改过的文件,而不包括之前已经被 add 且没被修改过的文件

.gitignore文件

有时候我们希望使用 git add .目录来追踪所有文件,但不希望追踪某些特定扩展名或目录下的文件。
此时可以使用 .gitignore来指定哪些文件不应该被追踪(像IDEA生成的.idea,java编译的文件等,包括公司内部的开发文档等,这些我们通常都不希望被追踪)。

首先需要在 git 仓库的根目录新建一个 .gitignore 文件:

touch .gitignore
  • 1

在 .gitignore 中语法如下:

  • 所有空行或者以 # 开头的行都会被 Git 忽略

  • ! 表示不忽略文件

  • 匹配模式可以以(/)开头只匹配当前目录下的匹配文件夹,可以防止递归

  • 匹配模式可以以(/)结尾表示当前匹配是一个目录

以下是个 .gitignore 文件的例子:

HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

提交到本地仓库

在我们把文件添加到暂存区后,可以使用 git commit 命令把暂存区的文件提交到本地仓库。

语法:

git commit -m "提交信息"
  • 1

也可以不用加 -m 参数,如果不加,则使用 git 默认的文本编辑器打开一个文档,不用管里面是什么,直接输入提交信息就行。

如果不写任何东西,git 将自动给暂存区的文件添加提交信息。

提交信息指的是开发者对于一个文件修改后的说明注释,和代码注释差不多。
在首次使用 git来进行 commit 的时候会提示:

Author identity unknown

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got 'Administrator@Student0010.(none)')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

这是因为在提交时 git 需要确定你的身份信息,此时需要在 commit 之前配置你的信息
按照以下格式来配置你的身份信息:

git config --global user.name "用户名"
git config --global user.email "邮箱地址"
  • 1
  • 2

这是配置用于在你后面提交到 远程仓库 时会显示你的这些信息。
现在只需要知道是配置你的个人信息就行了
模版:

git config --global user.name "cancerai"
git config --global user.email "cancerai@163.com"
  • 1
  • 2

分支管理

至此,些本地仓库的基本操作已经讲解完。

实际上,在实际团队开发中需要很多人管理同一个仓库,这时候就需要用到分支。

首先我们要知道在初始化完一个 git 仓库后,会自动创建一个主分支,名叫 master。
我们之前所有的操作都是在 master 分支下完成的。

当然我们还可以自己创建分支。

Tip:我们通常不会在本地使用多个分支,不过在后面牵扯到远程仓库时,会经常用到分支。

新建分支

使用 git branch 来新建一个分支

git branch 分支名
  • 1

如果你是 git init 来初始化一个 git 仓库的,并且你没有过任何提交,那么在创建分支的时候会报错,如下:

fatal: Not a valid object name: 'master'.
  • 1

它的意思是:无效的对象名称:“master”。这是因为分支的指针要指向提交的,只有进行了提交,才有指针指向该分支,才算是真正的建立了分支,成为一个有效的对象。
解决方法:随便创个文件,然后 commit 提交一下,比如这样:

touch a
git add .
git commit -m "file"
  • 1
  • 2
  • 3

这个时候就可以去对分支进行一些操作


查看分支

查看分支的命令非常简单,只需要输入 git branch 即可:

git branch
  • 1

可以观察到,在某一个分支名前面有星号,它代表是当前分支,像这样:
在这里插入图片描述

切换分支

切换分支语法:

git checkout 分支名
  • 1

像这样:
在这里插入图片描述
Note: 在切换分支的时候,未被提交的文件依然会在 工作区,这时候切换分支不仅会在 工作区 显示该分支下的文件,也会显示上一个分支未被提交的文件。所以为避免文件 混乱,一般一个本地 git 仓库下只存在一个分支

如果懒得看例子,在我在后面有总结,可以直接到后面去看
举个例子:
现在有 master 和 a 两个分支:

git branch a
git branch
  • 1
  • 2

在这里插入图片描述
在 master 下创建两个文件,file1 和 file2,并全部把他们提交。

touch file1 && touch file2
git add .
git commit -m "file"
  • 1
  • 2
  • 3

在这里插入图片描述
再切换到 a 分支,发现里面也是包含 master 里面的东西,不用管它,都删了,加点其他东西进去。

git checkout a
ls
rm -f ./*
touch file_a
ls
  • 1
  • 2
  • 3
  • 4
  • 5

在这里插入图片描述
这个时候我们再次提交 a 分支下的东西

git add .
git commit -m "a"
  • 1
  • 2

在这里插入图片描述
现在的情况是分支 a 下有 file_a 文件,分支 master 下有 file1 和 file2 文件,并且他们都已经提交到本地仓库
所以他们互不干扰,可以来验证下:
在这里插入图片描述
可以发现两个分支的内容是相互独立的,这是各分支的文件都提交的情况。
然后来看看一个分支下的文件没有提交会怎么样,我们在 master 下修改 file1 文件内容。

echo "hello world" > file1
cat file1
  • 1
  • 2

在这里插入图片描述
此时不提交直接切换到分支 a:

git checkout a
git branch
  • 1
  • 2

在这里插入图片描述
可以发现切换失败,还是在原来的 master 分支上,这是 git 防止文件冲突的一个防护吧。
那我们恢复原状,直接在 master 下创建一个文件再切换分支:

rm -rf file1 && touch file1
touch file3
ls
git checkout a
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
可以发现,创建了文件还是可以切换分支的,并且使用会发现在分支 a 里面多了个 file3
因为 master 中的 file3 未被提交,仍然在工作区中。
在这里插入图片描述


总结:
在所有文件都被提交时,可以顺利切换分支,各分支间的文件不受影响
修改了文件没被提交时,无法切换分支
新建或删除文件没被提交时,可以顺利切换分支,切换后的分支会保留未被提交的文件


合并分支

合并分支用于将两个分支的文件进行合并,语法:

git merge 分支名
  • 1

它代表的意思是把 merge 指定的分支名合并到当前分支,
例如我把 a 分支合并到 master 分支上,则应该进行如下操作:

git checkout master
git merge a
  • 1
  • 2

在这里插入图片描述
在执行 git merge时,会弹出一个文本编辑器,不用关它,按照提示关闭就行(ctrl + x)。

删除分支

删除分支语法:

#删除分支
git branch -d 分支名

#强制删除分支
git branch -D 分支名
  • 1
  • 2
  • 3
  • 4
  • 5

像这样:
在这里插入图片描述
Note: 无法删除当前所在的分支,如需删除,需要先切换到其他分支。

版本回滚

有时候我们执行一个操作的时候发现后悔了,其实这还是有办法的。
可以利用版本回滚来回滚到以前的一个指定版本。
利用 git log 命令来查看历史记录。

git log
  • 1

在这里插入图片描述
如果历史记录多,终端会放不下,出现像我这样的现象,按上下方向键可以上下滚动屏幕,按 q 键可以退出。
在这个 log 日至里面我们可以很清除的看到我们有过哪些操作,提交的人,提交时间等信息。
在每个操作中都会看到很长一段字符串,那个就是你每次操作的 ID 号,通过这个 ID 就可以实现版本回滚。

版本回滚语法:

git reset --hard ID号
  • 1

值得注意的是,我们不需要把完整的 ID 复制下来,每个 ID 都是唯一的,我们通常只需要使用前几位 ID git就可以判断出来是哪一个操作。
像这样:

git reset --hard 16e33900
  • 1

在这里插入图片描述
可以看到,我会滚到了合并之前的操作。此时仓库里面是 ID 为 16e33900 的东西。

ls
  • 1

在这里插入图片描述
同时我们还可以回滚到合并时的那时候,不过需要知道那时候的 ID。
也就是说 git reset 回滚不仅可以滚到以前的任意版本,也可以再滚回来。
像这样,我又滚到合并时的地方:

git reset --hard 7a18ca8e
  • 1

在这里插入图片描述

远程仓库管理

远程仓库顾名思义就是不在你电脑上的仓库,需要通过网络来连接它。
同样的,这些远程仓库和本地仓库一样,是通过 git 来管理。不过不能直接在远程仓库上进行 git 操作。
我们会先把远程仓库下载到本地,在进行 git 管理。

第三方远程仓库

可以按照官网教程自己搭建 git 服务器,但这里不讲解。我们直接来认识下第三方的一些 git 远程仓库。
准确来说,应该是叫 代码托管平台,它可以让开发者把本地仓库的代码提交到远程仓库。

常见的代码托管平台有 gitee,github,gitlab等
其中 gitee 是我们国内最大的代码托管平台,里面有很多开发者上传的代码,所以代码托管平台也叫开源平台。
github也是个开源平台,它是全球最大的开源平台,不过它是在国外的,国内访问经常发神经,可以挂个梯子来提高访问速度。

我们以下教程均以 gitee 为例演示,其他的 github 等平台也是差不多的。

Gitee

注册账号

通过浏览器我们可以访问到 gitee 的官网:https://gitee.com/
在这里插入图片描述

在右上角有登陆和注册的选项,如果没有账号就去注册个。
在注册时有个人空间地址的一项,不知道什么意思的旁边有个问号,把鼠标移动到上面就知道了。
在这里插入图片描述注册完之后登陆进你的账号。

创建仓库

因为是新创建的用户,所以在你的用户下是没有任何仓库的。
我们需要在 gitee 上创建一个远程仓库。
在右上角有个加号,里面点击新建仓库(手机版没这些东西,需要在手机上切换到电脑版网页)
在这里插入图片描述在新打开的页面中填写的仓库名称,还有路径等信息,这里解释下一些东西。

  • 仓库名名称:你给仓库起的名字。
  • 路径:你访问你的仓库的地址,gitee的网址结构是 https://gitee.com/用户名/仓库名。
    这里你填写的仓库地址对应网址里的仓库名 ,例如你的仓库地址写的是 test,且用户名是 cancerai。
    则可以通过网址 https://gitee.com/cancerai/test 来访问到你的仓库。
  • 开源:你的这个仓库是公开的,任何人都可以通过 仓库的地址来访问到你的仓库。
  • 私有:你的仓库只有该仓库的成员可见,如果别人访问你的私有仓库需要登陆,
    如果这个人不属于这个仓库的成员,则无法访问。

剩下的三个 初始化仓库 / 设置模板 / 选择分支模型就不说了,这些可以理解为系统帮你自动完成一些事,当然,也可以在创建完仓库后手动去做这些事。

在这里插入图片描述创建完应该是长这样的
在这里插入图片描述可以看到里面也提示了一些 git 的操作,这些不用管它,后面我也会讲。

克隆仓库

我们已经创建好了一个远程仓库,前面说过,我们不能直接在远程仓库中使用 git 来操作,需要把远程仓库下载到本地来进行管理。

我们所说的下载,说的专业些就等同于克隆。克隆的命令非常简单,语法如下:

git clone 仓库地址
  • 1

仓库地址就是 https://gitee.com/仓库归属者/仓库路径
这在创建仓库的时候都有定义。
例如我的用户名是 cancerai,仓库路径是 test,则:

git clone https://gitee.com/cancerai/test
  • 1

在这里插入图片描述
可以看到它爆出来一个 warning,意思是说你克隆了一个空的仓库。
Tip: 如果在创建仓库i时,选择了私有,那么在克隆的时候会要求你输入账号和密码来验证

除了使用 git clone 仓库地址外,在后面还可以加上一个参数,像这样:

git clone 仓库地址 克隆到本地时的仓库名字
  • 1

在之前的克隆中可以发现,克隆到本地的仓库名字和远程仓库名一样。
如果想要克隆到本地的仓库名可以自定义就可以加上这个参数,例如:

git clone https://gitee.com/cancerai/test test01
  • 1

当然你不加这个参数,克隆到本地再用 mv 去重命名也是一模一样的。

本地仓库关联远程仓库

之前我们已经学习了如何从远程克隆一个仓库,除此之外,我们还可以把本地现有的仓库关联到本地。
以之前教程中 git init 的本地仓库为例,首先进入仓库:
在这里插入图片描述
怎么样,熟不熟悉这个仓库。眼尖的可能注意到我这个本地仓库为什么变成 test1 了。
因为我在上一步演示克隆的时候远程仓库也是叫 test,直接克隆下来,会和我这个本地的名字冲突导致失败,所以我改了个名字。

这些都不影响哈,那么怎么把本地仓库和远程的产生关联呢,语法也不能难:

git remote add 别名 远程仓库名字
  • 1

这里别名指的是对你远程仓库起的一个名字,因为远程仓库是一长串的 url 地址,写起来很麻烦。
不过这里别名有个不成文的规定,我们通常都把他写为 origin,像这样:

git remote add origin https://gitee.com/cancerai/test
  • 1

输入完如果没有任何提示就算成功了。
在这里插入图片描述

查看已关联的远程仓库

当我们添加好远程仓库的时候,可以使用命令来查看,如下:

git remote -v
  • 1

在这里插入图片描述
会发现有两个一样的 url,但旁边一个是 fetch,一个是 push,这个不用管它。
目前只需要关心前面的 别名 和 远程 url地址就行了。

同时还有个命令,它可以查看当前本地仓库关联的远程仓库的别名。

git remote
  • 1

在这里插入图片描述
这样看起来比较直观,只有一个 origin。

把本地仓库提交到远程仓库

当我们在本地 commit 完了后,可以把他提交到远程仓库上。
语法如下:

git push [远程仓库别名] [本地分支名]:[远程分支名]
  • 1

这是个完整的 push 写法。可以发现很多都是可选项,
如果只写 git push,那么它默认的是:

git push origin master:master
  • 1

这个 push 的语法应该很好理解,就不多说了。

值得注意的是,git push 它有个参数是 -f,它表示为强制把本地仓库的内容推到远程上去:

git push -f [远程仓库别名] [本地分支名]:[远程分支名]
  • 1

不过在团队中不建议这样做,因为这是危险的,通常我们会先把远程合并到本地,解决完一些冲突问题再 push 到远程。

拉取远程仓库

fetch

在拉取远程仓库的时候,我们可以使用 fetch 来先把远程仓库上的最新代码下载到本地,注意使用 fetch 仅仅是拉到本地来,而不会与本地代码合并。如果需要合并需要使用 merge 来合并,fetch 语法如下:

git fetch 别名 [远程分支名]
  • 1

像这样:
在这里插入图片描述
可以从输出的最后一行发现,是从远程仓库的 master 分支下载到本地的 origin/master 分支下。

merge

在之前的 fetch 过后,在本地会有个 origin/master 分支,我们可以对拉下来的这个分支合并到本地。

git merge origin/master
  • 1

在这里插入图片描述
如果前面 fetch 的不是 origin,而是其他的远程仓库,那么在 merge 的时候会报错,如下:

fatal: refusing to merge unrelated histories
  • 1

意思是拒绝合并不相关的历史。
如需合并,需要在后面加上 --allow-unrelated-history

git merge FETCH_HEAD --allow-unrelated-history
  • 1

其中 FETCH_HEAD 是你远程拉过来的分支名

pull

pull其实是两个命令的结合体。
pull = fetch + merge

语法是:

git pull [别名] [远程分支名]
  • 1

完结

关于 git 的所有基本使用到这里就结束了,如果有任何不正确的地方,欢迎大家在评论区指正。
喜欢的小伙伴给个点赞 + 收藏 + 关注呦 !

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/453854
推荐阅读
相关标签
  

闽ICP备14008679号