Git概念介绍,常用命令与工作流程整理 配图

news2024/11/27 1:57:54

首先附一张Git的cheat sheet 作为开始,方便查阅:https://education.github.com/git-cheat-sheet-education.pdf

Git简介

Git大家肯定都不陌生了,象征性地再介绍一下:Git是一个版本控制系统,换句话说,它可以在整个开发过程中对我们的代码库进行命名快照(即保存),并且在出现问题时,我们可以轻松地回滚到任何此类保存的状态。如果我们写了错误地代码,在没有Git的情况下,我们需要找出我们改变了什么并手动恢复,这既耗费时间又容易出错。有了Git,如果我们在代码运行正常的时候进行了保存,我们可以用一条命令就恢复到那个状态。我们也可以为彼此逐步记录我们的工作。Git还有一些与协作相关的功能,如分支管理,可以很好的用于新feature的开发以及bug fix等。

Git的workflow与常用命令:

首先我们要来一张图,彻底弄清楚我们系统上装的Git和GitHub是什么关系,我们通过各个命令分别是代表着把代码从哪里送到哪里。接下来介绍各个概念和命令的时候请对着这个图来参照,就很清楚我们每一步都在做什么了。

概念:

Git Repository:Git仓库(Git Repository)是一个包含文件及其历史版本的数据库。在上面图中,我们在Local(本地计算机)上有一个仓库localrepo,它将存储在 .git 目录中(这个目录你在本地git init后就会自动生成,如果你看不见可能是被隐藏了,因为其实你也并不需要直接操作它)。在Remote远程或在线存储的仓库remote repo(例如在 GitHub 上)被称为远程仓库。我们的git push和git pull就发生在本地仓库和远程仓库之间。

Working directory:工作目录就是你当前通过git check到的分支下的最新代码,也就是上图的最左边,你的IDE中显示的文件内容。

Staging area: 暂存区是在创建一个Git提交commit之前,我们把希望包含在提交中的文件放在暂存区。相当于做了一个“缓冲”,不是任何修改都commit。

常用命令:

git clone <远程仓库链接> :把一个代码从远程仓库复制到本地,此时我们本地工作目录就有了全部代码,并且和这个远程仓库建立了连接。

git add <文件名1>:把变动的文件加到暂存区(对应着上面图中来理解)。

git commit -m “<提交信息>”:把暂存区里的东西提交到本地仓库。提交会自带一个提交id以及提交信息,提交信息由你来自定义,用来描述这次的修改和变化。

进行git commit时,要尽量对单一的修改分别commit,要经常及时的commit并附上简介清晰明了的提交信息,避免把大量的修改都并到一个commit里,那样会难以追踪和理解。然后就是一些自动生成的文件不要提交,比如npm install生成的node_modules文件夹,mvn site生成的target文件夹等,可以写一个.gitignore文件把不需要被git追踪的文件放进去。

git status: 显示哪些文件已被更改以及哪些文件在暂存区。

git log:显示所有的提交信息等。

git branch “<分支名称>” 创建一个名为<分支名称>的新分支。

git checkout <分支名称>切换到<分支名称>的分支。通过git checkout -b <分支名称> 命令,如果相关分支不存在,会直接创建并且切换过去。

git push :将本地修改提交到远程仓库。

git pull: 获取远程仓库的更新并尝试合并到本地工作目录。

团队协作中的workflow

fork 与 pull request

Fork可以理解成复制一个项目到你自己的账号下,让你可以自由修改这个项目,而不会影响原项目。Fork出来的新项目与原项目之间保持一种链接关系。这种方式非常适合你希望在一个现有的项目基础上进行新的开发,或者你想为一个你没有写权限的项目做贡献。

Pull Request(拉取请求): 当你在Fork的项目中做了修改,觉得这些修改对原项目有帮助,你可以发起一个Pull Request。这是向原项目的维护者提出,希望他们将你的修改合并到原项目中。原项目维护者在接到Pull Request后,可以查看修改内容,进行评论和讨论,然后决定是否接受这些修改。在团队协作中,使用分支和Pull Request可以使团队成员各自在不同的任务上工作,而不会相互干扰。当各自的任务完成后,可以通过Pull Request将各个分支的更改合并,这样就可以集中管理和审查所有的更改。

解决冲突 merge conflicts

当你准备接收一个pull request,但Github通知你遇到了合并冲突conflict,这通常意味着你的分支包含了一个与你要合并进去的分支中的同一处改变。如果冲突足够简单,你通常可以通过点击pull request页面上的"Resolve Conflicts"在网页编辑器中解决它。

一旦你打开了文件,你应该可以看到一些像">>>>>branch1"和"<<<<<branch2"这样的冲突标记在你的冲突文件中。你可以通过删除冲突标记和你想要舍弃的改变来手动修复冲突,一旦你解决了所有的合并冲突,你可以点击"Mark as resolved"继续进行pull request。

通过实践学习:

这是一个可视化练习操作git的在线网页:Learn Git Branching

这个网页大概长这样,会从git的入门开始指导你Git操作,你可以一边操作一边看到当前的分支变化,涉及最基础的commit,branch等,也有一系列高阶操作。

接下来我们输入一些常用命令,来看看它们实际对于分支是如何显示的。

git commit

注意这里的箭头并没有指反,c2作为最新的提交变化,它“指向”旧的状态。Git就是通过这种方式somehow完成回溯的。

 git branch newImage, git checkout newImage

 由于当前还在master分支,所以此时git commit会把master继续推进。要想推进newImage,应该是先checkout到newImage然后再commit。

Merge和Rebase

git mergegit rebase 都是 Git 中用来合并分支的两种方式,但它们的方式和结果有所不同。

git merge

git merge 命令会创建一个新的提交,这个提交会包含两个父提交:一个是你当前所在分支的最新提交,另一个是你想要合并的分支的最新提交。这个新的提交称为“合并提交”。合并的优点是它会保留完整的提交历史和分支的上下文。不过,这种方式也可能导致提交历史变得复杂,尤其是在活跃的代码库中。

git rebase

git rebase 命令会把一个分支的提交移到另一个分支上。首先,Git 找到这两个分支最近的公共祖先,然后获取当前分支自那时以来的所有提交。这些提交被称为“补丁”。然后,Git 会检出你想要把这些补丁应用到的分支,并逐个应用这些补丁。使用 rebase 的优点是它可以创建一个更线性的项目历史,这样就更容易理解。不过,这种方式也会丢失一些上下文信息(因为改变了提交的原有顺序),并且在公共分支上进行 rebase 可能会导致问题,因为它会改变提交历史。

Reset和Revert

git resetgit revert都是Git中用来撤销更改的命令,但它们的工作方式和目的有所不同。

 git reset

git reset命令用于撤销对本地仓库的更改,相当于删除你刚刚的commit。git reset是一个危险的命令,因为它会改变你的Git历史。如果你已经把更改推送到远程仓库,那么使用git reset可能会引发问题。如果和远程仓库有连接,就不要用这个命令了。

git revert

git revert命令用于撤销已经提交到Git历史的更改。这个命令会创建一个新的commit,这个commit会把指定的历史commit中的更改反转过来。git revert的优点是它不会改变现有的Git历史,因此它是一个更安全的选项,特别是当你需要撤销已经推送到远程仓库的更改时。

 git cherry-pick

cherry-pick允许你选取任何存在的commit,并将其应用到当前的工作分支上。比如你正在你的feature分支上工作,但是有人对main分支做了个bugFix,你就可以通过cherry-pick把bugFix应用到你自己的分支上。在上图中,master就把另一个分支中的两个commit的变化应用到了自己身上。

需要特别强调的是:图里的一个个commit节点记录的是变化,而不是当前最新代码状态,因此我们可以随意地使用cherry-pick选出那些我们要应用的变化。同样的道理,之前的git revert其实也就是提交一个和上一次commit完全相反的“变化”作为一个新的commit。

小结:

这篇文章介绍了Git这个强大的版本控制系统,介绍了一些基本概念命令、解决冲突方法以及通过实践和插图的方式理解了一些操作步骤的具体含义。弄清楚这些基本知识对于日常学习工作来说是基本够用了。其他Git更深层原理和高级操作有机会再探索吧~

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

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

相关文章

TypeError: makedirs() got an unexpected keyword argument ‘exist_ok‘

背景&#xff1a; 自己在使用pyinstaller打包一个基于pyqt5的gan网络手写数字生成的项目的时候&#xff0c;打包过程中出现这个错误导致打包失败。 图示&#xff1a; 问题分析&#xff1a; 复制这个错误在百度上搜看到很多答案说是python版本的原因。2.7版本的python不支持…

Redis如何存储一个Java对象【内涵案例】

目录 Java原生序列化示例 GSON示例 使用fastjson存储Java对象到Redis时 Redis并不能直接存储Java对象&#xff0c;需要进行序列化或者转换成字符串等格式才可以进行存储。以下介绍两种常见的将Java对象存储到Redis的方案。 对象序列化&#xff0c;存储二进制数据 将对象进…

使用Chatglm-6b微调催收问答对的尝试

1.工作目录&#xff0c;如&#xff1a;mnt/d/work&#xff0c;下载源代码&#xff0c;并安装依赖 git clone https://github.com/THUDM/ChatGLM-6B cd ChatGLM-6B pip install -r requirement.txt 2. 从拥抱脸下载chatglm-6b-int4-qe到本地&#xff08;GPU环境搭建参考浪潮服…

线性结构-栈

栈是Stack一个后进先出Last In First Out,LIFO的线性表&#xff0c;他要求只在表尾对数据执行删除和插入等操作。 栈就是一个线性表&#xff0c;可以是数组、也可以是链表。但它的操作有别于一般的线性表。栈的元素必须先进后出&#xff0c;也就是先进入栈的元素必须后出栈。而…

金三银四好像消失了,IT行业何时复苏

疫情时候不敢离职&#xff0c;以为熬过来疫情了&#xff0c;行情会好一些&#xff0c;可是疫情结束了&#xff0c;反而行情更差了&#xff0c; 这是要哪样 我心中不由一万个 草泥&#x1f434; 路过 我心中不惊有了很多疑惑和感叹 接着上一篇 一个28岁程序员入行自述和感受 自…

3年外包测试走进字节,真的泪目了.....

一提及外包测试&#xff0c;大部分人的第一印象就是&#xff1a;工作强度大&#xff0c;技术含量低&#xff0c;没有归属感&#xff01;外包工作三年总体感受就是这份工作缺乏归属感&#xff0c;心里总有一种落差&#xff0c;进步空间不大&#xff0c;接触不到核心技术&#xf…

零基础如何学习项目管理?

零基础如何学习项目管理&#xff1f;我们可以从项目管理的思维、能力、工具、书籍阅读四个方面入手—— 1.项目管理的思维 &#xff08;1&#xff09;系统思考 项目管理需要从一个系统的角度来看待问题&#xff0c;将复杂的项目分解为小的部分进行管理&#xff0c;从而达到更…

Power BI 数据模型设计及搭建——星型模型雪花模型

前言 之前的笔记提到了《Power BI 数据模型的核心概念》&#xff0c;本文继续深入讨论数据模型的设计架构&#xff0c;同时介绍两种常用的数据模型&#xff1a;星型模型和雪花模型 BI 的数据模型和数仓模型有什么不同&#xff1f; 数据仓库和Power BI中使用的数据架构模型有一…

seaborn load_dataset报错的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

6000+字讲透ElasticSearch 索引设计

ElasticSearch 索引设计 在MySQL中数据库设计非常重要&#xff0c;同样在ES中数据库设计也是非常重要的 概述 我们创建索引就像创建表结构一样&#xff0c;必须非常慎重的&#xff0c;索引如果创建不好后面会出现各种各样的问题 索引设计的重要性 索引创建后&#xff0c;索引的…

Mac使用svn全教程(安装+命令操作项目)

Mac使用svn&#xff0c;包括安装以及命令检出项目提交项目&#xff0c;下面直接进入正题&#xff1a; 1.安装svn 首先Mac需要安装brew #安装brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"图1: 图2: 图3: 如…

java数组排序,升序和降序

文章目录 前言基本数据类型排序升序降序排列 基本数据类型包装类升序降序 对象排序升序降序 前言 对于数组的排序一直很疑惑&#xff0c;尤其是如何对数组进行降序排列&#xff0c;例如要对int[]类型的数组降序排列&#xff0c;这里来进行说明 基本数据类型排序 升序 int[]…

缓存失效的三大祸害:穿透、击穿、雪崩及应对策略详解

1、概述 缓存穿透、缓存击穿和缓存雪崩都是常见的缓存问题&#xff0c;下面分别介绍它们的定义和解决方法&#xff1a; 1&#xff09;缓存穿透 缓存穿透指的是恶意用户或攻击者通过请求不存在于缓存和后端存储中的数据来使得所有请求都落到后端存储上&#xff0c;导致系统瘫痪…

【数据库复习】第五章 数据库编程1

存储过程和触发器 PL/SQL &#xff1a; SQL的扩展 增加了过程化语句功能 基本结构是块 块之间可以互相嵌套 每个块完成一个逻辑操作 1.定义部分 DECLARE ------变量、常量、游标、异常等 定义的变量、常量等只能在该基本块中使用 当基本块执行结束时&#…

OpenCL编程指南-3.1OpenCL平台与设备

OpenCL平台 在2.1中讨论过&#xff0c;OpenCL应用的第一步是查询OpenCL平台集合&#xff0c;选择其中一个或多个平台在应用中使用。与平台关联有一个简档 (profile)&#xff0c;描述所支持的特定OpenCL版本的功能。简档可以是完全简档&#xff0c;涵盖定义为核心规范的所有功能…

超好用!免费使用的Sketch在线版真香!

在设计领域中&#xff0c;Sketch是一款非常受欢迎的矢量绘图设计软件&#xff0c;但它只支持Mac系统&#xff0c;这对于Windows用户来说是一个很大的限制。虽然有人称之为Sketch在线版&#xff0c;但实际上并不存在这样的工具。不过&#xff0c;现在有一款全新的在线协同设计工…

SpringBoot整合Mybaties增删改查

文章目录 1、填写pom.xml2、填写application.properties3、User实体4、Springboot主类5、UserMapper6、UserServise层7、UserServiseImpl8、Controller类测试 使用 Java 开发或者学习过程中&#xff0c;最避免不了的是连接和操作数据库&#xff0c;此次&#xff0c;学习如何在S…

Java之单例模式

目录 一.上节内容 1.什么是线程安全 2.线程不安全的原因 3.JMM(Java内存模型) 4.synchronized锁 5.锁对象 6.volatile关键字 7.wait()和notify() 8.Java中线程安全的类 二.单例模式 1.什么是单例 2.怎么设计一个单例 1.口头约定 2.使用编程语言的特性 三.饿汉模式…

文心一言没有体验上,看看讯飞星火认知大模型

目录 前言 正文 1.简单对话环节 1.1什么是讯飞星火认知大模型 1.2你都可以干一些什么 1.3你的训练数据库还在持续更新么 1.4今天是哪一天 1.5宇宙中有哪些目前认为可能存在生命的星球 2.辅助学习对话 2.1我想完成一篇关于CT检测技术的论文综述&#xff0c;你有什么好的…

Elasticsearch - 聚合获取原始数据并分页排序模糊查询

文章目录 概述第一步 &#xff1a; 聚合获取原始数据并分页知识点&#xff1a;bucket_sort实现分页知识点&#xff1a;获取 total -----> cardinality 去重 小结第二步 分页并支持模糊查询方式一 query 方式方式二&#xff1a; 脚本cardinality 的 script 概述 ES版本&…