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

news2024/12/23 3:20:08

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.txt
 create 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.txt

Changes 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.txt

Untracked 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.html
        modified:   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 +0800

    Some changes.

commit 842d9f29afd7678c6a725a54c3fcfee9544ac843
Author: xiaoshan <xiaoshan>
Date:   Wed Feb 7 09:52:23 2024 +0800

    Sample 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-steps
   015d049..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 842d9f29afd7678c6a725a54c3fcfee9544ac843
  Author: lvsongtao <lst5201225>
  Date:   Wed Feb 7 09:52:23 2024 +0800

      Sample 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-forward
 bar.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.git
   db12e17..4e318e6  master -> master

在这里插入图片描述

2.6 Pull 命令:取回修改

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

> cd D:\IdeaProjects\first-steps-clone
> git pull D:\IdeaProjects\first-steps-bare.git master

From 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.coloradmin.cn/o/1461207.html

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

相关文章

GitHub使用记录

1.创建仓库 2.删除仓库 翻到最下面 3.将本地文件同步到云端库上 Github——git本地仓库建立与远程连接&#xff08;最详细清晰版本&#xff01;附简化步骤与常见错误&#xff09;_将本地仓库与远程仓库关联-CSDN博客 第三步参考&#xff1a;Github——git本地仓库建立与远程连…

聚道云软件连接器:高科技企业财务自动化,提升效率准确性!

客户介绍&#xff1a; 某互联信息技术有限公司是一家专业从事信息技术服务的高科技企业&#xff0c;在业内享有较高的知名度和影响力。近年来&#xff0c;公司业务快速发展&#xff0c;对信息化建设提出了更高的要求。 客户痛点&#xff1a; 在传统情况下&#xff0c;该公司的…

XML Map 端口进阶篇——常用关键字和格式化器详解

XML Map 端口是用于在不同XML之间建立关系映射的工具&#xff0c;允许通过拖拽操作实现源XML和目标 XML之间的数据字段映射&#xff0c;除此之外&#xff0c;XML Map 端口还提供了其它丰富多彩的功能&#xff0c;使用户能够更加灵活和高效的处理XML 数据映射任务&#xff0c;让…

Ubuntu20.04安装Carla0.9.15

文章目录 环境要求下载Carla解压Carla运行Carla测试官方用例创建python环境安装依赖包案例&#xff1a;生成车辆案例&#xff1a;测试自动驾驶 参考链接 环境要求 系统配置要求&#xff1a; 至少3G显存的GPU&#xff0c;推荐3060及以上的显卡进行Carla拟真。预留足够的硬盘空…

Maxwell - 增量数据同步工具

前言 今天来学习一个新的大数据小工具 Maxwell &#xff0c;它和 Sqoop 很像。Sqoop主要用于在 Hadoop &#xff08;比如 HDFS、Hive、HBase 等&#xff09;和关系型数据库之间进行数据的批量导入和导出&#xff0c;而 Maxwell 则主要用于监控数据库的变化&#xff08;通过监控…

Linux内核解读

来自鹅厂架构师 作者&#xff1a;aurelianliu 工作过程中遇到的调度、内存、文件、网络等可以参考。 1.os运行态 X86架构&#xff0c;用户态运行在ring3&#xff0c;内核态运行在ring0&#xff0c;两个特权等级。 &#xff08;1&#xff09;内核、一些特权指令&#xff0c;例…

【实战 JS逆向+python模拟获取+Redis token会话更新】实战模拟测试 某巴批发网 仅供学习

逆向日期&#xff1a;2024.02.20 使用工具&#xff1a;Node.js、python、Redis 加密方法&#xff1a;md5标准库 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 AES解密处理&#xff08;直接解密即可&#xff09;&#xff08;crypto-js.js 标…

旧物回收小程序开发,开启绿色生活新篇章

随着科技的发展和人们生活水平的提高&#xff0c;物质生活的丰富带来了大量的废弃物。如何合理处理这些废弃物&#xff0c;实现资源的再利用&#xff0c;已成为社会关注的焦点。旧物回收小程序的开发与应用&#xff0c;为这一问题提供了有效的解决方案。本文将探讨旧物回收小程…

Python学习笔记——自定义函数(基础知识)

自定义函数非常简洁有效地实现了代码的复用&#xff0c;让程序编写、阅读、测试和修改变得更加容易。 下面记录Python自定义函数的使用。 1、定义函数&#xff1a; def describe_pet(pet_name,animal_typedog):显示宠物的信息print(f"\nI have a {animal_type}.")…

备战蓝桥杯---数学之矩阵快速幂基础

我们先不妨看一道题&#xff1a; 看见n的数据范围就知道直接按以前的递归写肯定狗带&#xff0c;那我们有什么其他的方法吗&#xff1f; 下面是分析&#xff1a; 我们就拿斐波那契数列试试手吧&#xff1a; 下面是AC代码&#xff0c;可以当作模板记&#xff1a; #include<b…

Android 基础技术——Framework

笔者希望做一个系列&#xff0c;整理 Android 基础技术&#xff0c;本章是关于 Framework 简述 Android 系统启动流程 当按电源键触发开机&#xff0c;首先会从 ROM 中预定义的地方加载引导程序 BootLoader 到 RAM 中&#xff0c;并执行 BootLoader 程序启动 Linux Kernel&…

2.20 Qt day1

一. 思维导图 二. 消化常用类的使用&#xff0c;以及常用成员函数对应的功能 按钮类QPushButton&#xff1a; mywidget.h&#xff1a; #ifndef MYWIDGET_H #define MYWIDGET_H#include <QWidget> #include<QPushButton>//按钮类 #include<QIcon>class MyW…

vscode 插件 Marp for VS Code 制作 ppt

话不多说&#xff0c;直接上图 用它来写幻灯片&#xff0c;简直不要太好用&#xff0c;如果你一直使用 markdown 语法写笔记的话&#xff0c;那么做 ppt 对你来说简直就是喝水&#xff1b; 在vscode 上面直接装一个Marp for VS Code插件就可以了 基本使用方法步骤 crtl win …

Flutter自定义tabbar任意样式

场景描述 最近在使用遇到几组需要自定义的tabbar或者类似组件&#xff0c;在百度查询资料中通常&#xff0c;需要自定义 TabIndicator extends Decoration 比如上图中的带圆角的指示器这样实现 就很麻烦&#xff0c; 搜出来的相关也是在此之处上自己画&#xff0c;主要再遇…

OpenLDAP接入NineData SSO

本文面向使用 OpenLDAP 管理人员账户信息的企业&#xff0c;提供将 OpenLDAP 接入单点登录&#xff08;SSO&#xff09;的最佳实践指南&#xff0c;以实现统一认证和授权管理。通过集成 OpenLDAP、phpLDAPadmin、Keycloak&#xff0c;您可以轻松通过 SSO 功能登录 NineData。 …

Android13 编译ninja failed with: exit status 137

描述 现象很奇怪&#xff0c;主机是ubuntu 18.04&#xff0c; 内存有32G&#xff0c;并且系统中有两份Android13代码&#xff0c; 有一份编译正常&#xff0c;另外一份编译不正常&#xff0c;一度以为是因为下载源码不齐全导致&#xff0c;后面仔细看日志&#xff0c;原来是内…

压缩感知(Compressed Sensing)的MATLAB仿真实现

在前一篇文章&#xff1a;正交匹配追踪&#xff08;Orthogonal Matching Pursuit, OMP&#xff09;的MATLAB实现中&#xff0c;我们介绍了针对稀疏信号进行压缩感知的MATLAB仿真。 本篇我们介绍一下针对的是原始的非稀疏信号&#xff0c;看看如何进行处理。 本文中&#xff0c;…

uniapp运动课程健身打卡系统微信小程序

考虑到实际生活中在我来运动管理方面的需要以及对该系统认真的分析,将系统分为小程序端模块和后台管理员模块&#xff0c;权限按管理员和用户这两类涉及用户划分。 (a) 管理员&#xff1b;管理员使用本系统涉到的功能主要有&#xff1a;首页、个人中心、用户管理、课程类别管理…

计算机设计大赛 深度学习动物识别 - 卷积神经网络 机器视觉 图像识别

文章目录 0 前言1 背景2 算法原理2.1 动物识别方法概况2.2 常用的网络模型2.2.1 B-CNN2.2.2 SSD 3 SSD动物目标检测流程4 实现效果5 部分相关代码5.1 数据预处理5.2 构建卷积神经网络5.3 tensorflow计算图可视化5.4 网络模型训练5.5 对猫狗图像进行2分类 6 最后 0 前言 &#…

静态时序分析:保持时间分析

相关阅读 静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html?spm1001.2014.3001.5482 在静态时序分析中&#xff0c;保持时间检查约束了触发器时钟引脚&#xff08;时钟路径&#xff09;和输入数据引脚&#xff08;数据路径&#xff09;之间的时序关…