【git】基本操作

🌈个人主页: 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
🔥 系列专栏: https://blog.csdn.net/qinjh_/category_13026221.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=13026221&sharerefer=PC&sharesource=qinjh_&sharefrom=from_link

目录

[Git 初识](#Git 初识)

版本控制器

注意事项

[Git 安装](#Git 安装)

Linux-ubuntu

[Git 基本操作](#Git 基本操作)

[创建 Git 本地仓库](#创建 Git 本地仓库)

[配置 Git](#配置 Git)

认识⼯作区、暂存区、版本库

添加⽂件--场景一

[查看 .git ⽂件](#查看 .git ⽂件)

添加⽂件--场景⼆

修改⽂件

版本回退

撤销修改

[情况⼀:对于⼯作区的代码,还没有 add](#情况⼀:对于⼯作区的代码,还没有 add)

[情况⼆:已经 add ,但没有 commit](#情况⼆:已经 add ,但没有 commit)

[情况三:已经 add ,并且也 commit 了](#情况三:已经 add ,并且也 commit 了)

删除⽂件


前言

    💬 hello! 各位铁子们大家好哇。

今日更新了git基础操作的内容

    🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

Git 初识

我们在编写各种⽂档时,为了防⽌⽂档丢失,更改失误,失误后能恢复到原来的版本,不得不复制出⼀个副本,⽐如:

"报告-v1" "报告-v2" "报告-v3" "报告-确定版" "报告-最终版" "报告-究极进化版"

每个版本有各⾃的内容,但最终会只有⼀份报告需要被我们使⽤ 。

但在此之前的⼯作都需要这些不同版本的报告,于是每次都是复制粘贴副本,产出的⽂件就越来越 多,⽂件多不是问题,问题是:随着版本数量的不断增多,你还记得这些版本各⾃都是修改了什么 吗?

⽂档如此,我们写的项⽬代码,也是存在这个问题的!!

版本控制器

为了能够更⽅便我们管理这些不同版本的⽂件,便有了版本控制器。所谓的版本控制器,就是能让你 了解到⼀个⽂件的历史,以及它的发展过程的系统。通俗的讲就是⼀个可以记录⼯程的每⼀次改动和版本迭代的⼀个管理系统,同时也⽅便多⼈协同作业。

⽬前最主流的版本控制器就是 Git 。Git 可以控制电脑上所有格式的⽂件,例如 doc、excel、dwg、 dgn、rvt等等。对于我们开发⼈员来说,Git 最重要的就是可以帮助我们管理软件开发项⽬中的源代码 ⽂件!

注意事项

还需要再明确⼀点,所有的版本控制系统,Git 也不例外,其实只能跟踪⽂本⽂件的改动,⽐如 TXT ⽂ 件,网页,所有的程序代码等等。版本控制系统可以告诉你每次的改动,⽐如在第5⾏加了⼀个单词 "Linux",在第8⾏删了⼀个单词 "Windows"。

⽽图⽚、视频这些⼆进制⽂件,虽然也能由版本控制系统管理,但没法跟踪⽂件的变化,只能把⼆进 制⽂件每次改动串起来,也就是只知道图⽚从100KB改成了120KB,但到底改了啥,版本控制系统不 知道,也没法知道。

Git 安装

Linux-ubuntu

查看 git 安装的版本:(没安装就看不到)

git --version

安装 Git:

sudo apt-get install git -y

Git 基本操作

创建 Git 本地仓库

要提前说的是,仓库是进⾏版本控制的⼀个⽂件⽬录。我们要想对⽂件进⾏版本控制,就必须先创建 ⼀个仓库出来。

创建⼀个 Git 本地仓库对应的命令为 git init ,注意命令要在⽂件⽬录下执⾏,例如:

我们发现,当前⽬录下多了⼀个 .git 的隐藏⽂件, .git ⽬录是 Git 来跟踪管理仓库的,不要⼿动 修改这个⽬录⾥⾯的⽂件,不然改乱了,就把 Git 仓库给破坏了。

.git包含 Git 仓库的诸多细节,如下图:

配置 Git

当安装 Git 后⾸先要做的事情是设置你的 ⽤⼾名称 和 e-mail 地址,这是⾮常重要的。配置命令为:

git config --global user.name "Your Name"

git config --global user.email "email@example.com"

把 Your Name 改成你的昵称

email@example.com 改成邮箱的格式,只要格式正确即可。

其中 --global 是⼀个可选项。如果使⽤了该选项,表⽰这台机器上所有的 Git 仓库都会使⽤这个 配置。如果你希望在不同仓库中使⽤不同的 name 或 e-mail ,可以不要 --global 选项,但要 注意的是,执⾏命令时必须要在仓库⾥。

查看配置命令为:

git config -l

删除对应的配置命令为:

  1. git config --global --unset user.name
  2. git config --global --unset user.email

认识⼯作区、暂存区、版本库

  • ⼯作区:是在电脑上你要写代码或⽂件的⽬录。
  • 暂存区:英⽂叫 stage 或 index。⼀般存放在 .git ⽬录下的 index ⽂件(.git/index)中,我们 把暂存区有时也叫作索引(index)。
  • 版本库:⼜名仓库,英⽂名 repository 。⼯作区有⼀个隐藏⽬录 .git ,它不算⼯作区,⽽ 是 Git 的版本库。这个版本库⾥⾯的所有⽂件都可以被 Git 管理起来,每个⽂件的修改、删除,Git 都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以"还原"。

下⾯这个图展示了工作区、暂存区和版本库之间的关系:

  • 图中左侧为⼯作区,右侧为版本库。Git 的版本库⾥存了很多东西,其中最重要的就是暂存区。
  • 在创建 Git 版本库时,Git 会为我们⾃动创建⼀个唯⼀的 master 分⽀,以及指向 master 的⼀个指 针叫 HEAD。
  • 当对⼯作区修改(或新增)的⽂件执⾏ git add 命令时,暂存区⽬录树的⽂件索引会被更新。
  • 当执⾏提交操作 git commit 时,master 分⽀会做相应的更新,可以简单理解为暂存区的⽬录 树才会被真正写到版本库中。

由上述描述我们便能得知:通过新建或粘贴进⽬录的⽂件,并不能称之为向仓库中新增⽂件,⽽只是 在⼯作区新增了⽂件。必须要通过使⽤ git add 和 git commit 命令才能将⽂件添加到仓库中 进⾏管理!!!

添加⽂件--场景一

在包含 .git 的⽬录下新建⼀个 ReadMe ⽂件,我们可以使⽤ git add 命令可以将⽂件添加到暂存 区:

  • 添加⼀个或多个⽂件到暂存区: git add file1 file2 ...
  • 添加指定⽬录到暂存区,包括⼦⽬录: git add dir
  • 添加当前⽬录下的所有⽂件改动到暂存区: git add .

再使⽤ git commit 命令将暂存区内容添加到本地仓库中:

  • 提交暂存区全部内容到本地仓库中: git commit -m "message"
  • 提交暂存区的指定⽂件到仓库区: git commit file1 file2 ... -m "message"

注意 git commit 后⾯的 -m 选项,要跟上描述本次提交的 message,由⽤⼾⾃⼰完成,这部分内 容绝对不能省略,并要好好描述,是⽤来记录你的提交细节,是给我们⼈看的。

git commit 命令执⾏成功后会告诉我们,1个⽂件被改动(就是我们新添加的ReadMe⽂件),插 ⼊了两⾏内容(ReadMe有两⾏内容)。

我们还可以多次 add 不同的⽂件,⽽只 commit ⼀次便可以提交所有⽂件,是因为需要提交的⽂件是 通通被 add 到暂存区中,然后⼀次性 commit 暂存区的所有修改。如:

我们可以使⽤ git log 命令,来查看 下历史提交记录:

该命令显⽰从最近到最远的提交⽇志,并且可以看到我们 commit 时的⽇志消息。

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上 --pretty=oneline 参数:

需要说明的是,我们看到的⼀⼤串类似 23807c5...56eed6 的是每次提交的 commit id (版本 号),Git 的 commit id 不是1,2,3......递增的数字,⽽是⼀个 SHA1 计算出来的⼀个⾮常⼤的数 字,⽤⼗六进制表⽰

查看 .git ⽂件

.git 的⽬录结构:

  1. index 就是我们的暂存区,add 后的内容都是添加到这⾥的。
  2. HEAD 就是我们的默认指向 master 分⽀的指针:

打印的一大串数字字母是什么东西呢?保存的就是当前最新 的 commit id

objects 为 Git 的对象库,⾥⾯包含了创建的各种版本库对象及内容。当执⾏ git add 命令 时,暂存区的⽬录树被更新,同时⼯作区修改(或新增)的⽂件内容被写⼊到对象库中的⼀个新的 对象中,就位于 ".git/objects" ⽬录下,让我们来看看这些对象有何⽤处:

查找 object 时要将 commit id 分成2部分,其前2位是⽂件夹名称,后38位是⽂件名称。 找到这个⽂件之后,⼀般不能直接看到⾥⾯是什么,该类⽂件是经过 sha (安全哈希算法)加密过的 ⽂件,好在我们可以使⽤ git cat-file 命令来查看版本库对象的内容:

-p选项可以让输出看起来更美观。这就是我们最近⼀次的提交!

其中,还有⼀⾏ tree 15a37.......c7cf,我们使⽤同样的⽅ 法,看看结果:

在看 ReadMe 对应的 8d0e....425f:

这是我们对ReadMe做的修改!!被git记录了下来!

总结⼀下,在本地的 git 仓库中,有⼏个⽂件或者⽬录很特殊

  • index: 暂存区, git add 后会更新该内容。
  • HEAD: 默认指向 master 分⽀的⼀个指针。
  • refs/heads/master: ⽂件⾥保存当前 master 分⽀的最新 commit id 。
  • objects: 包含了创建的各种版本库对象及内容,可以简单理解为放了 git 维护的所有修改。

添加⽂件--场景⼆

提交后发现打印了 1 file changed, 0 insertions(+), 0 deletions(-) ,意思是只 有⼀个⽂件改变了,这时我们提出了疑问,不是新增了两个⽂件吗?

解释:git add 是将⽂件添加到暂存区, git commit 是将暂存区的内容添加到本地仓库 中。由于我们并没有使⽤ git add file5 ,file5 就不在暂存区中维护,所以我们 commit 的时候 其实只是把已经在暂存区的 file4 提交了,⽽遗漏了⼯作区的 file5。如何提交 file5 呢?很简单,再次 add , commit 即可

修改⽂件

Git 跟踪并管理的是修改,⽽⾮⽂件。

我们将 ReadMe ⽂件进⾏⼀次修改。

此时,仓库中的 ReadMe 和我们⼯作区的 ReadMe 是不同的,如何查看当前仓库的状态呢? git status 命令⽤于查看在你上次提交之后是否有对⽂件进⾏再次修改。

上⾯的结果告诉我们,ReadMe 被修改过了,但还没有完成添加与提交。

⽬前,我们只知道⽂件被修改了,如果能知道具体哪些地⽅被修改了,就更好了。有人会说,我刚 改的我知道呀!可是,你还记得你三天前写了什么代码吗?或者没写?

如上图:a/表示改之前叫ReadMe,b/表示改之后还叫ReadMe。

-1表示改动前的第一行内容,+1,2 表示,改动后第一行开始,连续两行的内容。

git diff file 命令⽤来显⽰暂存区和⼯作区⽂件的差异,显⽰的格式正是Unix通⽤的diff格 式。也可以使⽤ git diff HEAD -- file 命令来查看版本库和⼯作区⽂件的区别。

git add 之后,就没有看到上⾯ no changes added to commit (use "git add" and/or "git commit -a") 的消息了。接下来让我们继续 git commit 即可:

版本回退

Git 能够管理⽂件的历史版本,这也是版本控制器重要的能⼒。如果有⼀天你发现 之前前的⼯作做的出现了很⼤的问题,需要在某个特定的历史版本重新开始,这个时候,就需要版本 回退的功能了。

执⾏ git reset 命令⽤于回退版本,可以指定退回某⼀次提交的版本。要解释⼀下"回退"本质是 要将版本库中的内容进⾏回退,⼯作区或暂存区是否回退由命令参数决定:

git reset 命令语法格式为: git reset --soft \| --mixed \| --hard HEAD

  • --mixed 为默认选项,使⽤时可以不⽤带该参数。该参数将暂存区的内容退回为指定提交版本内 容,⼯作区⽂件保持不变。
  • --soft 参数对于⼯作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
  • --hard 参数将暂存区与⼯作区都退回到指定版本。切记⼯作区有未提交的代码时不要⽤这个命 令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重。
  • HEAD 说明:
    • 可直接写成 commit id,表⽰指定退回的版本
    • HEAD 表⽰当前版本
    • HEAD^ 上⼀个版本
    • HEAD^^ 上上⼀个版本
    • 以此类推
  • 可以使⽤ 〜数字表⽰:
    • HEAD~0 表⽰当前版本
    • HEAD~1 上⼀个版本
    • HEAD^2 上上⼀个版本
    • 以此类推...

版本1内容是git,版本2内容是git world。现在处于版本2,我们想回退到版本1,通过不同的选项,就可以决定工作区,暂存区是否回退。

如上图,如果我们回退到最开始的内容,带上--hard选项。那么之前创建的其他文件也都没了。

如果我后悔了,想再回到之前最新的版本怎么办?我们可以继续使 ⽤ git reset 命令,回退到 那个版本,但我们必须要拿到它的 commit id 去指定回退的版本。

但我们看到了 git log 并不能打印出之前的 commit id ,运⽓好的话我们可以从终端 上去找找之前的记录,运⽓不好的话 commit id 已经被我们搞丢了。

Git 还提供了⼀个 git reflog 命令能补救⼀下,该命令⽤来记录本地的每⼀次命令。

这样,你就可以很⽅便的找到你的所有操作记录了,但 999cead 这个是啥东西?这个是 某版本的 commit id 的部分。Git 版本回退的时候,也可以使⽤部分 commit id 来代表⽬标版 本。

在实际开发中,由于⻓时间的开发了,导致 commit id 早就找 不到了,可突然某⼀天,我⼜想回退到 某个版本,那该如何操作呢?貌似现在不可能了。

值得说的是,Git 的版本回退速度⾮常快,因为 Git 在内部有个指向当前分⽀(此处是master)的 HEAD 指针, refs/heads/master ⽂件⾥保存当前 master 分⽀的最新 commit id 。当我们 在回退版本的时候,Git 仅仅是给 refs/heads/master 中存储⼀个特定的version,可以简单理解 成如下⽰意图:

撤销修改

如果我们在我们的⼯作区写了很⻓时间代码,越写越写不下去,想恢复到 上⼀个版本

情况⼀:对于⼯作区的代码,还没有 add

当然可以直接删掉你⽬前在⼯作区新增的代码,通过vim等。

⾟亏我们⼯作效率不⾼,才写了⼀⾏代码就发现不⾏了,要是你写了3天,⼀直都没有提交,该怎么删 掉呢?你⾃⼰都忘了⾃⼰新增过哪些,如果git diff xxx ⼀下,看看差别在删, 那肯定⼜要花3天时间删代码了,并且很⼤的概率还会改出bug。⼀周过去了,怎么向⽼板交 代呢?

Git 为我们提供了更好的⽅式,我们可以使⽤ git checkout -- file 命令让⼯作区的 ⽂件回到最近⼀次 add 或 commit 时的状态。 要注意 git checkout -- file 命令中的 -- 很重要,切记不要省略,⼀旦省略,该命令就变为其他意思了。⽰例如下:

情况⼆:已经 add ,但没有 commit

git reset回退命令,该命令如果使⽤ --mixed 参数,可以将暂存区 的内容退回为指定的版本内容,但⼯作区⽂件保持不变。那我们就可以回退下暂存区的内容了!

⽤ git status 查看⼀下,发现现在暂存区是⼲净的,⼯作区有修改。接着再用git checkout -- file 命令即可。

情况三:已经 add ,并且也 commit 了

我们可以 git reset --hard HEAD^ 回退到上⼀个版本!不过,这是有条件的,就是 你还没有把⾃⼰的本地版本库推送到远程。⼀旦你推送到远程版本库,你就真的惨了......

前提条件:commit之后没有push

删除⽂件

在 Git 中,删除也是⼀个修改操作, 如果要删除 file5 ⽂件,怎么搞呢?

直接删除是没有⽤的, 此时,⼯作区和版本库就不⼀致了,要删⽂件,⽬前除了要删⼯作区的⽂件,还要清除版本库的⽂ 件。

可以用 git rm 将⽂ 件从暂存区和⼯作区中删除,并且 commit 。这样,⽂件就从版本库中被删除了

相关推荐
fengyehongWorld3 小时前
Git 认证凭据管理
git
暮云星影11 小时前
git版本发布
git·gitee·github·gitea
乌夷11 小时前
Git Flow 分支模型
git
独隅12 小时前
VS Code Git 工作树多分支并行开发实战评测
git
暮云星影17 小时前
git仓库分支管理
git·gitee·github·gitea
互联网中的一颗神经元2 天前
ZZ — Git 速查表
大数据·git·elasticsearch
早安试言2 天前
git使用
git
燐妤2 天前
梦绘片场 ProjectDream故事总纲场景剧本篇:从项目到成片的 AI 漫剧工作台
人工智能·git·ai·项目开发
JackieDYH2 天前
Git 与 GitHub 新电脑配置指南(从零开始)
git·github·工具·使用教程
Jeanyia3 天前
GitLab 配套 Git 常用命令
git·gitlab