【Git教程】(二)入门 ——关于工作区与版本库、版本提交、查看信息、克隆、推送与拉回的简单介绍 ~

Git教程 · 入门

  • 1️⃣ 准备Git 环境
      • 1.1 创建版本库
      • 1.2 首次提交
      • 1.3 显示历史
  • 2️⃣ Git 的协作功能
      • 2.1 克隆版本库
      • 2.2 从另一版本库中获取修改
      • 2.3 从任意版本库中取回修改
      • 2.4 创建共享版本库
      • 2.5 用 push 命令上载修改
      • 2.6 Pull 命令:取回修改
  • 🌾 总结

如果你想试着用一下 Git 的话,那么下面就可以开始了。本节将会带领你创建自己的第一个项目。我会演示那些用于提交修改版本、查看历史和与其他开发者交换版本的命令。

在这里插入图片描述


1️⃣ 准备Git 环境

首先,我们需要安装 Git 。你可以在 Git 的官网上找到你所需要的一切:
Git - downloads

Git 是一个高可配置软件。首先,我们可以用config 命令配置一下用户名和用户邮箱:

> git config --global user.name "xiaoshan"
> git config --global user.email "xiaoshan@163.com"

1.1 创建版本库

在这里,建议最好能为接下来的 Git 测试单独开辟一个项目。总之应先从一个简单的小
项目开始。在我的这个小小的示例项目中,first-steps 目录下只有两个文本文件,如图所示。

在这里插入图片描述
在开始弄这个项目之前,建议最好先做一个备份。尽管在Git 中,想要造成永久性的删除或破坏也不是件容易的事情,而且每当你要做某些“危险”动作的时候, Git 通常也会发出相应的警告消息。但是,有备无患总是好的。

接下来,我们首先需要创建一个版本库,用于存储该项目本身及其历史。为此,我们需要在该项目目录中使用 init 命令。对于一个带版本库的项目目录,我们通常称之为工作区

> cd D:\IdeaProjects\first-steps\
> git init
Initialized empty Git repository in D:/IdeaProjects/first-steps/.git/

init 命令会在上述目录中创建一个名为 .git 的隐藏目录,并在其中创建一个版本库。但请注意,该目录在 Windows 资源管理器或 Mac Finder中可能是不可见的。

1.2 首次提交

接下来,我们需要将 foo.txt 和 bar.txt 这两个文件添加到版本库中去。在 Git 中,我们通 常将项目的一个版本称之为一次提交,但这要分两个步骤来实现。第一步,我们要先用 add 命令来确定哪些文件应被包含在下次提交中。第二步,再用 commit 命令将修改传送到版本库中,并赋予该提交一个散列值以便标识这次新提交。在这里,我们的散列值为 842d9f2, 实际中可能会有所不同,因为该值取决于文件内容。

> git add foo.txt bar.txt
> git commit --message "Sample project imported."
[master (root-commit) 842d9f2] Sample project imported.2 files changed, 0 insertions(+), 0 deletions(-)create mode 100644 bar.txtcreate mode 100644 foo.txt

现在,我们来修改一下 foo.txt 文件的内容,先删除 bar.txt文件,再添加一个名为 bar.html 的新文件。然后, status命令就会显示出该项目自上次提交以来所发生的所有修改。请注意, 新文件 bar.html 在这里被标示成了未跟踪状态,这是因为我们还没有用add 命令将其注册到 版本库。

>git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)deleted:    bar.txtChanges not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified:   foo.txtUntracked files:(use "git add <file>..." to include in what will be committed)bar.html

如果我们还想看到更多细节性的内容,也可以通过 diff 命令来显示其每个被修改的行。 当然。有很多人可能会觉得 diff 的输出是个非常难读的东西。幸运的是,在这一领域,我们有许多工具和开发环境可用,它们可以将这一切显示得更为清晰(见下图)。

在这里插入图片描述
使用diff 命令:

> git  diff foo.txt
diff --git a/foo.txt b/foo.txt
index e69de29..9a18bc6 100644
--- a/foo.txt
+++ b/foo.txt
@@ -0,0 +1 @@
+sdnasfgasfhasgsa
\ No newline at end of file

接下来,所有的修改都必须要先被归档成一次新的提交。我们要对修改过的文件和新文 件执行 add 命令,并对要删除的文件使用 rm 命令。

> git add foo.txt bar.html
> git rm bar.txt
fatal: pathspec 'bar.txt' did not match any files

现在再次调用status 命令,我们会看到所有的修改已经被纳入了下一次提交中。

> git status
On branch master
Changes to be committed:(use "git restore --staged <file>..." to unstage)renamed:    bar.txt -> bar.htmlmodified:   foo.txt

然后用commit 命令提交这些修改。

>git commit --message "Some changes."
[master 015d049] Some changes.2 files changed, 1 insertion(+)rename bar.txt => bar.html (100%)

1.3 显示历史

log 命令可用来显示项目的历史,所有提交都会按时间顺序被降序排列出来。

> git  log
commit 015d0496a7f33345944800ea68c7c995869c17e7 (HEAD -> master)
Author: xiaoshan <xiaoshan>
Date:   Wed Feb 7 10:07:02 2024 +0800Some changes.commit 842d9f29afd7678c6a725a54c3fcfee9544ac843
Author: xiaoshan <xiaoshan>
Date:   Wed Feb 7 09:52:23 2024 +0800Sample project imported.

2️⃣ Git 的协作功能

现在,我们已经有了一个存放项目文件的工作区,以及一个存放项目历史的版本库。在 一个像 CVS 和 Subversion 这样传统的集中式版本系统中,尽管每个开发者也都有属于他/她自己的工作区,但所有人都共享了一个通用的版本库。而在 Git 中,每个开发者拥有的是一个 属于他/她自己的、自带独立版本库的工作区,因此这已经是一个不依赖于中央服务器的、完整的版本控制系统了。开发者们可以通过交换各自版本库中的提交来实现项目合作。下面我们就来做个试验,先创建一个新的工作区,以便我们模拟第二位开发者的活动。

2.1 克隆版本库

我们的这位新开发者首先要有一个属于他/她自己的版本库副本(也称为克隆体)。该副本
中包含了所有的原始信息与整个项目的历史信息。下面。我们用 clone 命令来创建一个克隆体。

> git clone D:\IdeaProjects\first-steps D:\IdeaProjects\first-steps-clone
Cloning into 'D:\IdeaProjects\first-steps-clone'...
done.

现在,该项目结构如图所示。

在这里插入图片描述

2.2 从另一版本库中获取修改

下面,我们来修改一下 first-steps/foo.txt 文件,并执行以下操作来创建一次新提交。

> cd D:\IdeaProjects\first-steps
> git add foo.txt
> git commit --message "A change in the original."
[master 6823f87] A change in the original.1 file changed, 3 insertions(+), 1 deletion(-)

现在,新的提交已经被存入了我们原来的 first-steps 版本库中,但其克隆版本库 (first-steps-clone) 中依然缺失这次提交。为了更好地理解这一情况,我们来看一下 first-steps 的日志。

> git  log  --oneline
6823f87 (HEAD -> master) A change in the original.
015d049 Some changes.
842d9f2 Sample project imported.

在接下来的步骤中,我们再来修改克隆版本库中的 first-steps-clone/bar.html 文件,并执行以下操作。

> cd D:\IdeaProjects\first-steps-clone
> git add bar.html
> git commit --message "A change in the clone."
[master e72c85b] A change in the clone.1 file changed, 3 insertions(+)> git log --oneline
e72c85b (HEAD -> master) A change in the clone.
015d049 (origin/master, origin/HEAD) Some changes.
842d9f2 Sample project imported.

现在,我们在两个版本库中各做了一次新的提交。接下来,我们要用 pull 命令将原版本库中的新提交传递给它的克隆体。由于之前我们在创建克隆版本库时,原版本库的路径就已经被存储在了它的克隆体中,因此 pull 命令知道该从哪里去取回新的提交。

> cd D:\IdeaProjects\first-steps-clone
> git pull
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 276 bytes | 39.00 KiB/s, done.
From D:\IdeaProjects\first-steps015d049..6823f87  master     -> origin/master
Merge made by the 'ort' strategy.foo.txt | 4 +++-1 file changed, 3 insertions(+), 1 deletion(-)

如上所示,pull 命令从原版本库中取回了新的修改,将它们与克隆体中的本地修改进行了对比,并在工作区中合并了两边的修改,创建了一次新的提交。这个过程就是所谓的合并(merge)。

请注意!合并过程在某些情况下可能会带来冲突。 一旦遇到了这种情况,Git 中就不能进行自动化的版本合并了。在这种情况下,我们就必须要手动清理一些文件,然后再确认要提交哪些修改。
在拉回 (pull) 、合并(merge)的过程完成之后,我们可以用一个新的 log 命令来查看结果。 这次是日志的图形化版本。

> git  log --graph
*   commit db12e177db250443c84dec9d7f2397bd93160411 (HEAD -> master)
|\  Merge: e72c85b 6823f87
| | Author: lvsongtao <lst5201225>
| | Date:   Wed Feb 7 10:49:07 2024 +0800
| |
| |     Merge branch 'master' of D:\IdeaProjects\first-steps
| |
| * commit 6823f872128baa976e87ea700c367cfc97f198a8 (origin/master, origin/HEAD)
| | Author: lvsongtao <lst5201225>
| | Date:   Wed Feb 7 10:43:58 2024 +0800
| |
| |     A change in the original.
| |
* | commit e72c85b1a29db75ffef45668be19078803b81b50
|/  Author: lvsongtao <lst5201225>
|   Date:   Wed Feb 7 10:47:44 2024 +0800
|
|       A change in the clone.
|
* commit 015d0496a7f33345944800ea68c7c995869c17e7
| Author: lvsongtao <lst5201225>
| Date:   Wed Feb 7 10:07:02 2024 +0800
|
|     Some changes.
|
* commit 842d9f29afd7678c6a725a54c3fcfee9544ac843Author: lvsongtao <lst5201225>Date:   Wed Feb 7 09:52:23 2024 +0800Sample project imported.

这一次,历史记录不再是一条直线了。在上面的日志中,我们可以很清晰地看到并行开
发的过程(即中间的两次提交), 以及之后用于合并分支的那次合并提交(即顶部的那次提交)。

2.3 从任意版本库中取回修改

在没有参数的情况下, pull 命令只在克隆版本库中能发挥作用,因为只有该克隆体中有 默认的原版本库的连接。当我们执行 pull 操作时,也可以用参数来指定任意版本库的路径, 以便从某一特定开发分支中提取相关修改。

现在,让我们将克隆体中的修改 pull 到原版本库中吧。

> cd D:\IdeaProjects\first-steps
> git pull D:\IdeaProjects\first-steps-clone master
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (8/8), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), 547 bytes | 49.00 KiB/s, done.
From D:\IdeaProjects\first-steps-clone* branch            master     -> FETCH_HEAD
Updating 6823f87..db12e17
Fast-forwardbar.html | 3 +++1 file changed, 3 insertions(+)

2.4 创建共享版本库

除了可以用 pull 命令从其他版本库中取回相关提交外,我们也可以用 push 命令将提交传送给其他版本库。只不过, push 命令只适用于那些没有开发者在上面开展具体工作的版本库。最好的方法就是创建一个不带工作区的版本库,我们称之为裸版本库 (bare repository)。 你可以使用clone 命令的 -bare 选项来创建一个裸版本库。

> git clone --bare D:\IdeaProjects\first-steps D:\IdeaProjects\first-steps-bare.git
Cloning into bare repository 'D:\IdeaProjects\first-steps-bare.git'...
done.

裸版本库通常可被用来充当开发者们传递提交(使用push 命令)的汇聚点,以便其他人可以从中拉回他们所做的修改。下面我们来看一个裸版本库(见图)。

在这里插入图片描述


2.5 用 push 命令上载修改

为了演示 push 命令的使用,我们需要再次修改一下 first-steps/foo.txt 文件,并执行以下操作来创建一次新的提交。

> cd D:\IdeaProjects\first-steps
> git add foo.txt
> git commit --message "More changes in the original."
[master 4e318e6] More changes in the original.1 file changed, 3 insertions(+), 1 deletion(-)

接下来,我们就可以用 push 命令向共享版本库传送该提交了。该指令的参数要求与 pull 命令相同,我们需要指定目标版本库的路径及其分支。

> git push D:\IdeaProjects\first-steps-bare.git master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 308 bytes | 308.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To D:\IdeaProjects\first-steps-bare.gitdb12e17..4e318e6  master -> master

在这里插入图片描述

2.6 Pull 命令:取回修改

现在,为了让克隆版本库也得到相应的修改,我们需要在执行 pull 命令时配置参数指向
共享版本库的路径参数。

> cd D:\IdeaProjects\first-steps-clone
> git pull D:\IdeaProjects\first-steps-bare.git masterFrom D:\IdeaProjects\first-steps-bare        * branch            master     -> FETCH_HEAD
Already up to date.

请注意!如果另一个开发者在我们之前已经做过一次 push 操作,此次 push 命令就会被 拒绝传送提交。这时候,我们必须要先做一次 pull 操作,将其他人新上载的更新取回,并在本地合并。


🌾 总结

  • 工作区与版本库:工作区是一个包含.git 子目录(内含版本库)中的目录。我们可以用 init 命令在当前目录中创建版本库。
  • 版本提交:一次版本提交通常定义了版本库中所有文件的一个版本,它详细说明了该版本是由何人在何时何地创建的。当然,我们需要用add 命令来确定哪些文件将被纳入下一次提交,然后再用 commit 命令创建新的版本提交。
  • 查看信息:通过status命令,我们可以查看哪些文件已被本地修改,以及哪些修改将被纳入下次提交。另外, log 命令可用来显示提交历史。diff 命令可用来显示两个版本文件之间的差异。
  • 克隆:对于用 clone 命令创建某一个版本库的副本,我们称之为该版本库的克隆体。 在一般情况下,每个开发者都会拥有整个项目版本库的完整克隆体,他/她的工作区中将会包含完整的项目历史。这使他们可以各自独立开展工作,无需连接服务器。
  • 推送与拉回:pushpull 命令可用于在本地和远程版本库之间共享版本提交。


温习回顾上一篇(点击跳转)
《【Git教程】(一)基本概念 ——工作流、分布式版本控制、版本库 ~》

继续阅读下一篇(点击跳转)《》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跳表是一种什么样的数据结构

跳表是有序集合的底层数据结构&#xff0c;它其实是链表的一种进化体。正常链表是一个接着一个用指针连起来的&#xff0c;但这样查找效率低只有O(n)&#xff0c;为了解决这个问题&#xff0c;提出了跳表&#xff0c;实际上就是增加了高级索引。朴素的跳表指针是单向的并且元素…

ArcgisForJS如何访问Arcgis Server?

文章目录 0.引言1.准备ArcGIS相关工具2.创建含有ArcSDE地理数据库的MXD文件3.注册ArcSDE地理数据库4.发布数据到Arcgis Server5.ArcgisForJS访问ArcGIS Server数据 0.引言 ArcGIS API for JavaScript 是一个用于在Web和移动应用程序中创建交互式地图和地理空间分析应用的库。它…

解决MobaXterm网络错误连接超时问题

报错页面&#xff1a; 报错原因&#xff1a; ①网络断开了 ②网络端口&#xff0c;端口号改变 解决办法&#xff1a; ①重新连接网络按R ②固定端口号 第一步&#xff1a;编辑------>虚拟机网络编辑器&#xff08;我的Linux在虚拟机里&#xff09; 第二步&#xff1a;用…

抽象工厂模式 Abstract Factory

1.模式定义: 提供一个创建一系列相关或互相依赖对象的接口&#xff0c;而无需指定它们具体的类 2. 应用场景: 程序需要处理不同系列的相关产品&#xff0c;但是您不希望它依赖于这些产品的 具体类时&#xff0c; 可以使用抽象工厂 3.优点: 1.可以确信你从工厂得到的产品彼…

Chrome插件精选 — 缓存清理

Chrome实现同一功能的插件往往有多款产品&#xff0c;逐一去安装试用耗时又费力&#xff0c;在此为某一类型插件挑选出比较好用的一款或几款&#xff0c;尽量满足界面精致、功能齐全、设置选项丰富的使用要求&#xff0c;便于节省一个个去尝试的时间和精力。 1. Chrome清理大师…

Elasticsearch:使用 ELSER v2 进行语义搜索

在我之前的文章 “Elasticsearch&#xff1a;使用 ELSER 进行语义搜索”&#xff0c;我们展示了如何使用 ELESR v1 来进行语义搜索。在使用 ELSER 之前&#xff0c;我们必须注意的是&#xff1a; 重要&#xff1a;虽然 ELSER V2 已正式发布&#xff0c;但 ELSER V1 仍处于 [预览…

【算法 - 动态规划】最长回文子序列

上篇文章中&#xff0c;我们学习一个新的模型&#xff1a; 样本对应模型&#xff0c;该模型的套路就是&#xff1a;以结尾位置为出发点&#xff0c;思考两个样本的结尾都会产生哪些可能性 。 而前篇文章中的 纸牌博弈问题 属于 [L , R]上范围尝试模型。该模型给定一个范围&…

C 嵌入式系统设计模式 08:硬件代理模式

本书的原著为&#xff1a;《Design Patterns for Embedded Systems in C ——An Embedded Software Engineering Toolkit 》&#xff0c;讲解的是嵌入式系统设计模式&#xff0c;是一本不可多得的好书。 本系列描述我对书中内容的理解。本文章描述访问硬件的设计模式之一&…

【C++语法基础】3.常用数学运算和位运算技巧(✨新手推荐阅读)

前言 在C编程中&#xff0c;数学运算是非常基础和常用的功能。C提供了多种数学运算符和函数&#xff0c;用于执行基本的数学计算&#xff0c;如加减乘除、取模运算以及位运算等。 一、加减乘除四则运算 C中的基本算术运算符包括加法()、减法(-)、乘法(*)、除法(/)。这些运算…

Chrome关闭时出现弹窗runtime error c++R6052,且无法关闭

环境&#xff1a; Chrome 版本121 Win10专业版 问题描述&#xff1a; Chrome关闭时出现弹窗runtime error cR6052&#xff0c;且无法关闭 解决方案&#xff1a; 1.任务管理器打开&#xff0c;强制结束进程 2.再次打开谷歌浏览器&#xff0c;打开设置关于Chrome&#xff0…

IO进程线程day5作业

1、使用多线程完成两个文件的拷贝&#xff0c;第一个线程拷贝前一半&#xff0c;第二个线程拷贝后一半&#xff0c;主线程回收两个线程的资源 代码&#xff1a; #include<myhead.h>//定义文件拷贝函数 int copy_file(int start,int len) {int srcfd,destfd;//以只读的形…

Vue3之ref与reactive的基本使用

ref可以创建基本类型、对象类型的响应式数据 reactive只可以创建对象类型的响应式数据 接下来让我为大家介绍一下吧&#xff01; 在Vue3中&#xff0c;我们想让数据变成响应式数据&#xff0c;我们需要借助到ref与reactive 先为大家介绍一下ref如何使用还有什么注意点 我们需…

解决弹性布局父元素设置高自动换行,子元素均分高度问题(align-content: flex-start)

案例&#xff1a; <view class"abc"><view class"abc-item" v-for"(item,index) in 8" :key"index">看我</view> </view> <style lang"less">.abc{height: 100px;display: flex;flex-wrap: …

Web基础②nginx搭建与配置

目录 一.Nginx概述 1.定义 2.Nginx模块作用 &#xff08;1&#xff09;main模块 &#xff08;2&#xff09;stream服务模块 &#xff08;3&#xff09;邮件服务模块 &#xff08;4&#xff09;第三方模块 &#xff08;5&#xff09;events模块 &#xff08;6&#xff…

Python 进阶语法:JSON

1 什么是 JSON&#xff1f; 1.1 JSON 的定义 JSON 是 JavaScript Object Notation 的简写&#xff0c;字面上的意思是 JavaScript 对象标记。本质上&#xff0c;JSON 是轻量级的文本数据交换格式。轻量级&#xff0c;是拿它与另一种数据交换格式XML进行比较&#xff0c;相当轻…

Sora--首个大型视频生成模型

Sora--首个大型视频生成模型 胡锡进于2024年2月20日认为&#xff1a;台当局怂了 新的改变世界模拟器视觉数据转换视频压缩时空补丁&#xff08;Spacetime Laten Patches&#xff09;视频生成扩展变压器算法和模型架构结语 胡锡进于2024年2月20日认为&#xff1a;台当局怂了 **T…

六大设计原则 (SOLID)

一、设计原则概述 古人云: 有道无术,术可求.有术无道,止于术. 而设计模式通常需要遵循一些设计原则,在设计原则的基础之上衍生出了各种各样的设计模式。设计原则是设计要求,设计模式是设计方案,使用设计模式的代码则是具体的实现。 设计模式中主要有六大设计原则,简称为SOL…

【云原生】持续集成持续部署

本文主要总结CI/CD的流程&#xff0c;不会详细介绍每个知识点。 啥是集成&#xff1f;啥是部署&#xff1f; 集成&#xff0c;就是把应用程序、相关环境、配置全局打包放在一个容器中的操作。部署就不解释了。 CI/CD 如果是自己手动部署的话&#xff0c;流程应该是这样的&am…

Global Gamers Challenge | 与 Flutter 一起保护地球

作者 / Kelvin Boateng 我们知道 Flutter 开发者热爱挑战&#xff0c;因此我们很高兴地宣布&#xff0c;新一轮的 Flutter 挑战赛来了&#xff01; 挑战https://flutter.cn/events/puzzle-hack Global Gamers Challenge 是一项为期 8 周的比赛&#xff0c;参赛者需要设计、构建…

零到大师:嵌入式Linux学习书单分享

大家好&#xff0c;我是知微&#xff01; 上一篇推荐的书单嵌入式软件必读10本书_单片机篇&#xff0c;收到反响很好。再推荐一篇嵌入式Linux相关的书单。 《鸟哥的Linux私房菜》 鸟哥的Linux系列适合零基础小伙伴&#xff0c;从电脑基础到文件系统、shell脚本等等&#xff…