首页 > 其他分享 >Git常用命令详解

Git常用命令详解

时间:2024-03-16 20:00:12浏览次数:23  
标签:文件 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

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

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

git init

存到暂存区

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

git add 文件名

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

git add .

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

.gitignore文件

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

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

touch .gitignore

在 .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/

提交到本地仓库

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

语法:

git commit -m "提交信息"

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

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

提交信息指的是开发者对于一个文件修改后的说明注释,和代码注释差不多。

分支管理

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

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

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

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

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

新建分支

使用 git branch 来新建一个分支

git branch 分支名

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

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

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

touch a
git add .
git commit -m "file"

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


查看分支

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

git branch

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

切换分支

切换分支语法:

git checkout 分支名

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

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

git branch a
git branch

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

touch file1 && touch file2
git add .
git commit -m "file"

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

git checkout a
ls
rm -f ./*
touch file_a
ls

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

git add .
git commit -m "a"

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

echo "hello world" > file1
cat file1

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

git checkout a
git branch

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

rm -rf file1 && touch file1
touch file3
ls
git checkout a

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


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


合并分支

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

git merge 分支名

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

git checkout master
git merge a

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

删除分支

删除分支语法:

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

#强制删除分支
git branch -D 分支名

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

版本回滚

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

git log

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

版本回滚语法:

git reset --hard ID号

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

git reset --hard 16e33900

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

ls

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

git reset --hard 7a18ca8e

在这里插入图片描述

远程仓库管理

远程仓库顾名思义就是不在你电脑上的仓库,需要通过网络来连接它。
同样的,这些远程仓库和本地仓库一样,是通过 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 仓库地址

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

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

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

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

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

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

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

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

本地仓库关联远程仓库

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

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

git remote add 别名 远程仓库名字

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

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

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

查看已关联的远程仓库

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

git remote -v

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

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

git remote

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

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

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

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

这是个完整的 push 写法,注意看可以发现除了控的英雄可不多。而且对于射手来说,这个技能就更尤为重要了。 git push 其他的都是可选项
如果只写 git push,那么它默认的是:

git push origin master:master

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

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

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

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

拉取远程仓库

fetch

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

git fetch 别名 [远程分支名]

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

merge

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

git merge origin/master

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

fatal: refusing to merge unrelated histories

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

git merge FETCH_HEAD --allow-unrelated-history

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

pull

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

语法是:

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

完结

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

标签:文件,git,仓库,Git,本地,常用命令,远程,详解,分支
From: https://blog.csdn.net/m0_73865314/article/details/136696936

相关文章

  • Offer必备算法14_哈希表_五道力扣题详解(由易到难)
    目录①力扣1.两数之和解析代码②力扣面试题01.02.判定是否互为字符重排解析代码③力扣217.存在重复元素解析代码④力扣219.存在重复元素II解析代码⑤力扣49.字母异位词分组解析代码本篇完。①力扣1.两数之和1.两数之和难度简单给定一个整数数组 nu......
  • 详解MySQL的MVCC(ReadView部分解析C++源码)
    文章目录1.什么是MVCC2.MVCC核心组成(三大件)2.1MVCC为什么需要三大件3.隐藏字段4.undolog4.1模拟版本链数据形成过程5.ReadView5.1m_ids5.2m_creator_trx_id5.3m_low_limit_id5.4m_up_limit_id5.5可见性分析算法6.MVCC流程模拟6.1RC隔离级别6.2RR隔离......
  • Git分支策略
    【来自“文心一言”】Git分支策略是软件开发中团队协作的重要组成部分,旨在通过灵活管理代码的不同版本和特性,提高开发效率和代码质量。以下是一些常见的Git分支策略:主分支(Master):用于放置上线版本的内容。作为其他分支的基点。通常设置为保护分支,只允许管理人员或分支创建......
  • C++类模板与友元详解
    C++模板下面分四种情况分别讨论。1.函数、类、类的成员函数作为类模板的友元函数、类、类的成员函数都可以作为类模板的友元。程序示例如下:void Func1() {  }class A {  };class B{public:    void Func() { }};template <class T>class Tmpl{......
  • C++类模板与继承详解
    C++模板类模板和类模板之间、类模板和类之间可以互相继承。它们之间的派生关系有以下四种情况。1.类模板从类模板派生示例程序:template <class T1, class T2>class A{    Tl v1; T2 v2;};template <class T1, class T2>class B : public A <T2,......
  • docker-compose的下载部署与常用命令
    下载方式一:使用wget下载wgethttps://github.com/docker/compose/releases/download/v2.15.1/docker-compose-linux-x86_64方式二:使用rz命令本地上传rz#将本地docker-compose文件上传部署1将执行文件放入环境变量cp./docker-compose/usr/local/bin/docker-compose......
  • 一个现成的用python写的项目, 有GUI,https://github.com/mustafamerttunali/deep-learni
    安装该项目ENV:Win11Anaconda 1.安装Python3.7, 在Anaconda新建一个python3.7环境2.安装VC++buildtool14.0 以上版本,我从下面这个link下载的最新版是17.6.4https://visualstudio.microsoft.com/visual-cpp-build-tools/否则会遇到 3.修改一下requir......
  • Git 操作——如何删除本地分支和远程分支
     Git操作——如何删除本地分支和远程分支 引言在大多数情况下,删除Git分支很简单。这篇文章会介绍如何删除Git本地分支和远程分支。用两行命令删除分支//删除本地分支gitbranch-dlocalBranchName//删除远程分支gitpushorigin--deleteremoteBranchName......
  • git checkout 命令
     gitbranchgitbranch-a gitcheckout命令Git基本操作gitcheckout 命令用于在不同的分支之间切换、恢复文件、创建新分支等操作。注意:gitcheckout命令在Git2.23版本后引入了 gitswitch 和 gitrestore 命令,分别用于分支切换和文件恢复,以提供更清晰的......
  • WPF中轻松操控GIF动画:WpfAnimatedGif库详解
    概述:在WPF中使用`WpfAnimatedGif`库展示GIF动画,首先确保安装了该库。通过XAML设置Image控件,指定GIF路径,然后在代码中使用库提供的方法实现动画控制。这简化了在WPF应用中处理GIF图的过程,提供了方便的接口来管理动画播放和暂停。当使用 WpfAnimatedGif 库在WPF中显示GIF图动......