【Git Bash】简明从零教学

news2025/1/16 1:43:37

目录

  • Git 的作用
    • 官网介绍
    • 简明概要
  • Git 下载链接
  • Git 的初始配置
    • 配置用户
    • 初始化本地库
  • Git 状态查询
  • Git 工作机制
    • 本地工作机制
    • 远端工作机制
  • Git 的本地管理操作
    • add 将修改添加至暂存区
    • commit 将暂存区提交至本地仓库
    • 日志查询
    • 版本穿梭
  • Git 分支
    • 查看分支
    • 创建与切换分支
    • 跨分支修改与合并
    • 合并冲突
  • Git 的远端操作
    • 与远端建立连接
    • SSH 秘钥协议
    • 远端的推送与拉取

Git 的作用

官网介绍

Git 作为一个免费的、开源的分布式 版本控制系统,可以高效地处理包括轻量、重量级在内的各种项目。Git 有廉价的本地库,方便的暂存区域和多个工作流分支等特性。

简明概要

同一项目 Project 在开发过程中可能出现形如 Project_20230616_byLeeProject_20230617_byMaProject_20230630_backUpProject_20230701_rollBackOn0617Project_20230701_modifiedProject_20230703_finalByMa 等多个协同开发者版本、多个备份版本、跨版本回滚修改、跨协同开发者打包拷贝的混乱情况。为避免此,我们需要利用 Git 的如下特性:

  • 管理本地(客户端)项目资源

记录文档修改内容新建项目版本号、分支(branch) 等。开发者为避免项目开发出现致命错误而无法回退到最近一次可行现场,有时会对上一可靠版本进行拷贝备份,但这样操作会开发过程中出现多个备份,占用了大量的存储空间。为此,Git 管理应运而生。

  • 将本地项目资源与远端代码托管中心(服务端)进行互联

开发者可将本地资源推送(push)上传至远端进行云备份,同时多个开发者也可对此云项目进行拷贝(copy)、下拉(pull)至本地进行异地多分支开发,经合并(merge)后推送至远端主分支。常见的远端有 GitHubTencent CODING DevOps 等。

  • 为 Windows OS 提供 Linux 系统命令行的交互终端

在 Windows cmd 下无法执行 mkdirlstouchvimcprm 等常用 Linux 指令,但在 Git Bash Terminal 的帮助下可以实现此类交互。

Git 下载链接

官方地址:https://git-scm.com/
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.

Git 的初始配置

在这里插入图片描述
定位到项目文件夹,右击鼠标在菜单栏选择 Git Bash Here,进入Terminal。并键入:

git -v
git -h

以查看已安装的 Git 版本号和帮助文档,检验是否安装成功。

在这里插入图片描述

注意,Git Terminal 的复制快捷键为 ctrl + insert ,粘贴快捷键为 shift + insert

配置用户

首先需为本台设备上的开发者配置 用户名邮箱 等信息,用于记录项目各版本下的 录入人签名 以区分不同操作者身份,以及用于后续的 远端识别

如某一项目分居实验室、寝室两地开发,我们可以将实验室设备用户名命为 my-lab,将寝室设备用户名命为 my-laptop,这样可以在改项目回滚时确定某一功能块的修改者。

  • 配置用户名
git config --global user.name "your name"
  • 配置用户邮箱
git config --global user.email "youremail@github.com"

如果读者想要在后续的远端部分使用 GitHub 作为资源库,建议用户名、邮箱与 GitHub 注册信息统一,以便管理。但二者并无必然联系。

  • 查看已配置的用户信息
cat ~/.gitconfig

在这里插入图片描述

初始化本地库

现在采用如下指令在当前项目目录下建立一个 git 本地库:

git init
ls ./.git

执行完毕后,可以看到本地的项目目录文件夹内出现了一个名为 .git 的隐藏文件夹,内部存有一些配置信息,如索引、提交记录等。

在这里插入图片描述

Git 状态查询

Git 可记录当前项目的各个版本号以及其对应的修改记录,并支持回滚。Git 目前的状态可通过如下指令进行查询:

git status

在这里插入图片描述

截至目前,由于文件夹内没有增删文件、修改文件内容的操作发生,所以 Terminal 自然会显示 no commits yet。我们现在创建一个新的文档并命名为 test.txt,作为轻量级的项目示例。(如果读者已经拥有现成项目并知悉项目变动,可跳转至下一小节。)

在这里插入图片描述
创建好 test.txt 后,再次执行状态查询指令,我们发现 Terminal 中输出了未被追踪文件(Untracked files),并被标记为了红色。

test.txt 作为新建的文件,与 Git 中记录中 版本历史仓库 出现的文件目录,和当前的 暂存区 中出现的文件目录存在冲突,所以被标记为了红色。后续开发者需要将 test.txt 添加(add)至 暂存区 并提交(commit)至 版本历史仓库,才可在 Git 中完成记录。后面的章节会提到其工作机制以及操作细节。

Git 工作机制

Git 的工作流如图所示,框内部分为本地工作机制,框外传递部分为面向远端的工作机制:
git 的工作流

本地工作机制

在项目的当前 工作目录(Workspace) 下,开发者进行编写、新建、删除文件或文件内容。对于已修改的文件目录或者文件内容,开发者可以将其添加(add)至 暂存区(stage),在所有标红提示的 未被追踪文件 完成添加后,我们再一并将它们提交(commit)至 本地的版本历史仓库(Local Repository) 中。

远端工作机制

如第一节中提到的 Git 作用,开发者可以将 本地仓库 推送(push)到位于 GitHub 的 远端仓库(Remote Repository) 作为代码托管;将 远程仓库 的分支最新内容完全拉取(pull)至本地 工作目录 并与当前本地分支直接合并,或将 远程仓库 的分支最新内容拿取(fetch)至 本地仓库 但不做合并。

Git 的本地管理操作

如状态查询和工作机制章节中提到的情景,我们需要做出一些操作,来使得 Git 记录下本地的所有修改。同时需支持对修改记录的日志进行查询,以完成项目的版本穿梭。

以下是一些常用的 Git 本地管理相关命令:

指令作用
1git add <pathspec>将文件 pathspec 添加至暂存区
2git commit -m <message>提交本次修改并做 message 批注
3git reflog查看各提交的引用日志
4git log查看各提交的日志
5git reset --hard <reflog>穿梭(回滚)到 reflog 对应的项目版本

add 将修改添加至暂存区

通过指令 git add <pathspec>,我们可以添加 git status 中被标红的 未被追踪文件 至暂存区,如:

git add test.txt
git status

再次查看 git status,可以发现该文件已被标记为绿色。

在这里插入图片描述

键入 tab 可自动补全子目录名。

commit 将暂存区提交至本地仓库

通过指令 git commit -m <message>,我们可以提交暂存区内容至本地仓库,如:

git commit -m "This is my first commit, and a new file is created." test.txt

在这里插入图片描述
现在我们来模拟版本迭代的情况:

在这里插入图片描述

如图所示,当 commit 完成后,我们又对 test.txt 的文件内容进行了修改,添加了两行文字。当同一文件被提交后再次被修改,查看 git status 依然会标记该文件为 未被追踪文件。此时我们需要将该文件再次 add 至暂存区,并进行二次 commit,以完成记录:

git status
git add test.txt
git status
git commit -m "This is my second commit, and the file is modified." test.txt
git status

在这里插入图片描述
操作完成后可发现文件内容修改已被记录,目前的工作区是干净的。

日志查询

  • 命令 git reflog 用于查看当前仓库的引用日志(Reference log):引用日志记录了仓库中分支、标签和 HEAD 移动的历史记录。
  • 命令 git log 用于查看 Git 仓库的提交日志:它显示了每个提交的作者、提交时间、提交信息等。
git reflog
git log

在这里插入图片描述

版本穿梭

Git HEAD 默认指向提交后的最新的版本,通过以下指令修改 Git HEAD 指向的引用版本号,可以进行本地仓库回滚,同时本地工作区也会同步回滚

git reset --hard <reflog>
  • 穿梭到 test.txt 为空时的 the first commit 版本:
    在这里插入图片描述
  • 穿梭到 test.txt 有内容时的 the second commit 版本:
    在这里插入图片描述
    同理,此指令支持多文件项目的版本回滚。

Git 分支

Git 分支(branch) 是一种用于在开发过程中并行工作的功能。它允许开发人员在不影响主分支的同时,与其他人合作开发新的功能或解决问题。在 Git 中,可以创建,切换和合并分支。分支的底层管理逻辑由指针完成,当前视角 HEAD 指向当前分支。
在这里插入图片描述

  • 分支可使得多个开发者 同时且并行 推进各功能开发,提高开发效率;
  • 各分支的修改与开发 不影响已经提交 的代码(如 主分支 master);
  • 各分支的修改内容 可以出现重叠,但提交后合并时需经过冲突判定,并由开发者操作选择最终保留部分;
  • 某一分支出现崩溃或开发失败,不会对其他分支有任何影响,仅在出现问题的分支上做版本穿梭回滚即可。

读者可以跳转至 A successful Git branching model 查看各较为成熟的分支团队开发模型,如在 主分支(master) 可分出 热补丁(hotfix)发布版(release)开发版(develop)特性(feature) 分支供团队各职能部门开发。此文章剩余部分仅对学生常见的多人开发、多地开发场景做示例(如小组作业合作、实验室与寝室跨地开发)。
在这里插入图片描述

以下是一些常用的 Git 分支相关命令:

指令作用
1git branch -v查看各分支
2git branch <new-branch>创建名为 new-branch 的新分支
3git checkout <branch>切换到名为 branch 的分支
4git checkout -b <branch>创建并切换到名为 branch 的分支
5git merge <branch>将名为 branch 的分支合并到 当前 分支上
6git branch -d <branch>删除名为 branch 的分支

查看分支

我们可以使用如下指令来查看本地仓库中包含的 所有开发分支,目前所处的分支将会被 标记为绿色,且在绝对路径后的 括号内 会有当前分支对应的名称标识:

git branch -v

在这里插入图片描述

可以看到当前项目的本地仓库内仅包含一个 主分支(master),我们位于主分支上,且其被标记为了绿色。

创建与切换分支

我们使用如下指令创建一个名为 dev 的新分支,并将视角切换到该分支上:

git branch dev
git checkout dev
git brach -v

此时,当前所处分支 dev 被标记为了绿色,且括号内展示了当前分支的名称标识 (dev)
在这里插入图片描述

跨分支修改与合并

接下来我们在 dev 分支上对 text.txt 的文件内容进行异步修改,将修改结果添加到暂存库,并提交至对应的仓库分支:

此处为了方便演示,修改文本内容可以使用 vim editor,教程可访问 https://www.openvim.com/。我们也可直接在 txt 中进行修改。

git checkout dev
vim test.txt
cat test.txt
git status
git add test.txt
git commit -m "The first commit on branch dev: contents modified."

在这里插入图片描述
在这里插入图片描述

可以发现 dev 分支上的文件内容已发生改变。现在我们将视角切换到主分支 master 上:

git checkout master
cat test.txt

在这里插入图片描述

由于 分支之间的开发进度在合并之前互不影响,可以发现文件内容 又回到了修改之前的状态(the second commit on branch ‘master’)。现在我们将分支 dev 上的修改内容合并到主分支(当前分支):

git checkout master
git merge dev
cat test.txt
git status
git branch -v
git reflog

在这里插入图片描述

至此我们才可以在主分支内看到合并过来的 dev 分支上的修改内容。

注意,dev 分支虽然已经合并到了 master 分支上,但是 dev 分支本身依然存在。修改 master 的内容如果 正确 add 并 commit,则 不会dev 进行 随动修改,同样地,切换到 dev 分支上后进行修改 并正确 add 且 commitmaster 的内容也 不会随动修改。如果 没有提交 commit 随即切换了分支,那么我们将会看到另一分支的 内容被随动修改(因为所有改动依然停留在工作区而没有上传至 Git 管理系统)。

合并冲突

在重量级项目的分支开发中,往往会合并时出现同一文件的同一位置(如某一行)对应了两种不同修改内容,自动合并产生了歧义。为了演示这一现象,我们又从主分支创建了分支 dev2创建分支后 对二者做了如下面的修改内容,add 至暂存区并 commit:

git checkout dev2
vim test.txt
git add test.txt
git commit -m "Merge conflict test on dev2."

git checkout master
vim test.txt
git add test.txt
git commit -m "Merge conflict test on master."

在这里插入图片描述
在这里插入图片描述

此时两分支内都对文档的后几行进行的修改,但修改内容不同。所以在主分支上,dev2 合并过来时出现了冲突现象(Merge conflict in test.txtUnmerged paths: both modified):

git reflog 
git merge dev2
git status
cat test.txt

在这里插入图片描述

其中冲突部分,<<<<<<< HEAD======= 之间对应的为当前分支的文档内容,=======>>>>>>> dev 之间对应的为 dev 分支的文档内容。 手动删除多余内容,保留兴趣内容后,add 至暂存区并提交,即可解决冲突:

vim test.txt
cat test.txt
git status
git add test.txt
git commit -m "merge after conflict"
git status
git branch -v
git reflog
cat test.txt

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看到括号内提示的主分支合并中 (master|MERGING) 状态改为了正常 master

Git 的远端操作

结合本地管理操作与分支的运用,我们可以将本地的项目内容向远端的代码托管中心进行交互了。此处的远端仓库以 GitHub 为例,创建一个私有仓库(不开源)并命名为 GitProject

在这里插入图片描述
常见的远端交互指令如下:

指令作用
1git remote -v查看当前所有远端仓库的地址及别名
2git remote add <name> <url>添加一个新的远端仓库 url 并命名为别名 name
3git push <name> <branch>将本地分支 branch 推送到远端仓库 name
4git push <name> -d <remote-branch>将远端仓库 name 上的 remote-branch 分支删除
5git clone <repo>将远端仓库 repo 的所有内容拷贝下来到本地当前目录
6git pull <repo> <remote-branch>将远端仓库 repo 上的 remote-branch 分支下拉到本地并与当前本地分支直接合并
7git fetch <repo>将远端仓库 repo 上的所有分支拿取到本地并但不合并
8git fetch <repo> <remote-branch>将远端仓库 repo 上的 remote-branch 分支拿取到本地并但不合并

clone,pull,与 fetch 的区别如图;其中 fetch 仅将远端仓库的分支副本拿取下来,但工作区的工作目录并不会发生改变,而 pull 则是对分支副本与仓库资源内容均做了下拉,工作区的工作目录内容会发生改变:

在这里插入图片描述

与远端建立连接

以前面在 GitHub 上的创建的 GitProject 为例,我们需要先获取其 ssh 地址并为其创建别名:

git remote add github-ssh "git@github.com:Sycamore-Ma/GitProject.git" 
git remote -v

远端仓库对应的 SSH 地址可在如图位置找到。
在这里插入图片描述
在这里插入图片描述

SSH 秘钥协议

由于远端仓库受 SSH 秘钥保护,所以本地在向远端进行推送或拉取时,需要事先使用如下指令(默认回车)生成本计算机的公共秘钥,找到在本地计算机的秘钥文本存储位置,并将其粘贴至远端仓库的协议中:

ssh-keygen

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

具体操作流程读者可访问链接:如何解决 git@github.com permission denied (publickey). fatal could not read from remote repository。

如果未能解决 SSH 秘钥问题,在向远端私有仓库推送或拉取时,识别秘钥会出现 git@github.com: Permission denied (publickey).fatal: Could not read from remote repository. 等错误。

同样地,GitHub 上可以邀请其他成员使用 Git 管理系统进行协同开发,读者可移步至 Git&GitHub 团队协作 了解详情。
在这里插入图片描述

远端的推送与拉取

通过以下指令,我们可以将本地的 master 分支推送至 github-ssh 别名对应的远端仓库:

git push github-ssh master

在这里插入图片描述

可以看到 GitHub 代码托管已经出现了新内容,远端分支为 master,与本地 master 分支一致。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

同样地我们可以在另外一台设备上测试拉取(该设备秘钥已经达成协议,此处不赘述),我们创建一个新的空文件夹,并在其路径上 Bash,完成前面章节的 初始化 与远端连接工作,执行远端拉取:

git init
git remote add github-ssh "git@github.com:Sycamore-Ma/GitProject.git" 
git remote -v
git pull github-ssh master

git status 
git branch -v
git reflog

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看到,另外一台设备也分布式地获取了远端代码托管中心的所有资源,可用于后续的协同修改、合并、推送。这样跨地开发的需求就达成了。

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

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

相关文章

变压器绝缘油介质损耗因素测试

试验目的 变压器油又称绝缘油&#xff0c;是一种电介质&#xff0c;是能够耐受电应力的绝缘体。当对介质油施加交流电压时&#xff0c;所通过的电流与其两端的电压相位差并不是90度角&#xff0c;而是比90度角要小一个δ角的&#xff0c;此δ角称为油的介质损耗角。变压器油的…

微服务集成spring cloud sentinel

目录 1. sentinel使用场景 2. sentinel组成 3. sentinel dashboard搭建 4. sentinel客户端详细使用 4.1 引入依赖 4.2 application.properties增加dashboard注册地址 4.3 手动增加限流配置类 4.4 rest接口及service类 4.5 通过dashboard动态配置限流规则 1. sentinel使…

Linux 系统下 GDB 调试器的使用

文章目录 简介GDB 的介绍GDB 的使用 GDB 常用命令及示例查看相关操作断点相关操作运行相关操作变量相关操作分隔窗口操作 简介 GDB 的介绍 GDB 是 GNU 调试程序&#xff0c;是用来调试 C 和 C 程序的调试器。它可以让程序开发者在程序运行时观察程序的内部结构和内存的使用情况…

大数据时代,个人信息数据库保护的挑战及其对策

挑战&#xff1a; 数据泄露&#xff1a;大数据时代&#xff0c;个人信息数据库面临被黑客攻击、内部员工滥用权限等风险&#xff0c;导致个人信息泄露的风险增加。 隐私保护&#xff1a;随着大数据的快速发展&#xff0c;个人信息的采集和分析变得更加广泛和深入。但是&#xf…

初级工程师职称评定条件及流程是什么呢?初级作用是什么?

现在全国统一的助理&#xff08;初级&#xff09;工程师是由人社部颁发的初级工程师证也就是大家说的初级职称。人社部备案&#xff0c;正规可靠&#xff0c;国家认可&#xff0c;评审表、红头文件齐全&#xff0c;可以用于应聘、在职、上岗、加薪、评级、评职称或者企业升资质…

indexDB入门到精通

前言 由于开发3D可视化项目经常用到模型&#xff0c;而一个模型通常是几m甚至是几十m的大小对于一般的服务器来讲加载速度真的十分的慢&#xff0c;为了解决这个加载速度的问题&#xff0c;我想到了几个本地存储的。 首先是cookie,cookie肯定是不行的&#xff0c;因为最多以只…

MPP 还是主流架构吗

MPP 架构&#xff1a; MPP 架构的产品&#xff1a; Impala ClickHouse Druid Doris 很多 OLAP 引擎都采用了 MPP 架构 批处理系统 - 使用场景分钟级、小时级以上的任务&#xff0c;目前很多大型互联网公司都大规模运行这样的系统&#xff0c;稳定可靠&#xff0c;低成本。…

9.1 功率放大电路概述

在实用电路中&#xff0c;往往要求放大电路的末级&#xff08;即输出级&#xff09;输出一定的功率&#xff0c;以驱动负载。能够向负载提供足够信号功率的放大电路称为功率放大电路&#xff0c;简称功放。从能量控制和转换的角度看&#xff0c;功率放大电路与其它放大电路在本…

c++ qt--信号与槽(二) (第四部分)

c qt–信号与槽(二) &#xff08;第四部分&#xff09; 一.信号与槽的关系 1.一对一 2.一对多 3.多对一 4.多对多 还可以进行传递 信号->信号->槽 一个信号控制多个槽的例子&#xff08;通过水平滑块控制两个组件&#xff09; 1.应用的组件 注意这里最下面的组件…

MongoDB快速上手

MongoDB快速上手 MongoDB用起来-快速上手&集群和安全系列 课程目标&#xff1a; 理解MongoDB的业务场景、熟悉MongoDB的简介、特点和体系结构、数据类型等能够在windows和linux下安装和启动MongoDB、图形化管理界面Compass的安装使用掌握MongoDB基本常用命令实现数据的C…

mysql 、sql server 临时表、表变量、

sql server 临时表 、表变量 mysql 临时表 创建临时表 create temporary table 表名 select 字段 [&#xff0c;字段2…&#xff0c;字段n] from 表

项目解决问题

红外 没接收到红外信号时&#xff0c; 会有杂波干扰 STC单片机 STC的串口要用一个定时器作为波特率发生器 开定时器2需要 开定时器0 1 要ET0 1 ET11打开 串口有时候和定时器有冲突 串口发送函数放定时器中断函数中&#xff0c;时间太少可能会导致一直卡在定时器中AUXR | 0x…

精彩回顾 | 风丘科技亮相2023中国汽车测试及质量监控博览会

2023年8月9-11日&#xff0c;风丘科技携手德国Softing、德国IPETRONIK亮相中国汽车测试及质量监控博览会&#xff08;2023 Testing Expo&#xff09;&#xff0c;为大家呈现了在汽车测试、车辆诊断领域里专业的研发测试工具及创新解决方案&#xff0c;吸引了众多客户驻足洽谈。…

MySQL基础篇(四)

多表查询 概述&#xff1a;多表查询就是多张表之间的查询。 回顾&#xff1a;SELECT * FROM table_name 多表查询 from 后面就得跟多张表。如&#xff1a;select * from emp,dept 笛卡尔积&#xff1a;笛卡尔积在数学中&#xff0c;表示两个集合&#xff0c;集合 A 和集合 B…

解决`idea`中`database`工具查询起别名乱码问题

文章目录 解决idea中database工具查询起别名乱码问题场景复现如何解决方式一 设置编码方式二&#xff1a;修改字体 原因说明 解决idea中database工具查询起别名乱码问题 场景复现 使用Idea做查询的并且起别名出现了中文乱码 如何解决 方式一 设置编码 settings->输入框输…

算法-滑动窗口-串联所有单词的子串

算法-滑动窗口-串联所有单词的子串 1 题目概述 1.1 题目出处 https://leetcode.cn/problems/substring-with-concatenation-of-all-words/ 1.2 题目描述 2 滑动窗口Hash表 2.1 解题思路 构建一个大小为串联子串的总长的滑动窗口为每个words中的子串创建一个hash表, <子…

BTP Integration Suite学习笔记 - (Unit4) Developing with SAP Integration Suite

详细指导还是要看官方文档 4. 云集成管理 4.1 云集成介绍 什么是云集成&#xff1f; 前三章讲了很多内容&#xff0c;但都不是最核心的&#xff0c;通常我们用CPI是让他实现原来PI/PO的功能的&#xff0c;是用来做集成的。这章才刚开始。 云集成有以下几个特性&#xff1a;…

web基础http与apache

一、http相关概念&#xff1a; http概述&#xff1a; HTTP 是一种用作获取诸如 HTML 文档这类资源的协议。它是 Web 上进行任何数据交换的基础&#xff0c;同时&#xff0c;也是一种客户端—服务器&#xff08;client-server&#xff09;协议 为解决"用什么样的网络协…

添加了.gitignore 文件,git status 的时候还是显示修改文件

1. 用IAR 软件编译STM32 工程&#xff0c;IAR 会生成很多中间文件&#xff0c;这些文件是不需要加入到git 版本管理里面的 2. .gitignore 文件位置需要放对应目录才会起作用&#xff0c;递归起作用的 3. 如果 .gitignore文件中指定的文件或目录仍然显示在git status的输出中&a…

考研C语言进阶题库——更新41-50题

目录 41.编写程序要求输出整数a和b若a和b的平方和大于100&#xff0c;则输出a和b的平方和&#xff0c;否则输出a和b的和 42.现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的&#xff1a;第一项是1/1&#xff0c;第二项是是…