git 基础入门

Git基础入门

Git是一个分布式 版本管理系统,用于跟踪文件的变化和协同开发。
版本管理:理解成档案馆,记录开发阶段各个版本

分布式&集中式
分布式每个人都有一个档案馆,集中式只有一个档案馆。分布式每人可以管理自己的档案馆,当自己觉得代码完成,可以提交自己的档案馆与他人的进行合并

github、gitlab、gitee都是基于git工具做的托管平台。

1.安装与配置

1.1 下载与安装

下载网址:https://git-scm.com/download/

安装
window可以默认安装
linux:sudo apt-get install git

Microsoft提供的安装教程

1.2配置

打开终端window需要右键打开git bush输入命令

MAC和linux可以通过终端直接输入命令
$ git config --global user.name “你的昵称”
$ git config --global user.email 邮箱@example.com

注:配置只是说明性的,做一个标记并不等于之后的注册与登陆。

1.3 GUI

常用git gui可以见git官网
推荐:[Gitkraken]、[SourceTree]、[TortoiseGit]

2. git命令

2.1 命令总览

git bush输入命令行git

start a working area (see also: git help tutorial)
   clone             Clone a repository into a new directory
   init              Create an empty Git repository or reinitialize an existing one

work on the current change (see also: git help everyday)
   add               Add file contents to the index
   mv                Move or rename a file, a directory, or a symlink
   restore           Restore working tree files
   rm                Remove files from the working tree and from the index
   sparse-checkout   Initialize and modify the sparse-checkout

examine the history and state (see also: git help revisions)
   bisect            Use binary search to find the commit that introduced a bug
   diff              Show changes between commits, commit and working tree, etc
   grep              Print lines matching a pattern
   log               Show commit logs
   show              Show various types of objects
   status            Show the working tree status

grow, mark and tweak your common history
   branch            List, create, or delete branches
   commit            Record changes to the repository
   merge             Join two or more development histories together
   rebase            Reapply commits on top of another base tip
   reset             Reset current HEAD to the specified state
   switch            Switch branches
   tag               Create, list, delete or verify a tag object signed with GPG

collaborate (see also: git help workflows)
   fetch             Download objects and refs from another repository
   pull              Fetch from and integrate with another repository or a local branch
   push              Update remote refs along with associated objects

2.2常用命令

2.2.1 帮助命令

命令作用
git help [command]帮助命令

2.2.2 创建仓库

命令作用
git init创建⼀个git本地仓库,⽣成⼀个.git⽬录,其他⽬录不变
git clone拷⻉⼀份远程仓库(类似 svn checkout)

2.2.3 修改和提交

命令作用
git status查看本地仓库当前的状态,显⽰有变更的⽂件
git add添加⽂件到本地仓库
git commit提交暂存区到本地仓库
git rm删除⼯作区⽂件
git mv移动或重命名⼯作区⽂件
git diff⽐较⽂件的不同
git reset回退版本

2.2.4 提交日志

命令作用
git log查看历史提交记录
git reflog看所有分⽀的所有操作记录(包括提交、回退、已删除的提交操作记录等)

2.2.5 分支管理

命令作用
git checkout切换或者新建分⽀
git merge合并分⽀
git rebase变基
git branch分支管理

2.2.6 远程管理

命令作用
git remote远程仓库操作
git fetch从远程获取代码库
git pull下载远程代码并合并
git push上传远程代码并合并

2.2.7 标签

命令作用
git tag管理标签

3.文件与提交

3.1 git原理

Workspace:⼯作区,就是在电脑能看到的⽬录
Index / Stage:暂存区,存放在.git⽬录下的index⽂件中
Repository:仓库区(或本地仓库),⼯作区有⼀个隐藏⽬录 .git,这个不算⼯作区,⽽是 Git 的版本库
Remote:远程仓库,著名的如github和gitee
git原理.png

3.2本地仓库

新建git仓库时文件处于未跟踪状态(clone的代码仓库里文件处于未修改状态),可以通过git add .将文件夹下所有文件添加至暂存区,再通过git commit -m "this is first submit"(“引号内可自定义”)提交至仓库区,此时文件处于已追踪未修改的的状态。后续修改文件都会被git追踪,修改完成后重复git addgit commit
git文件追踪.png

3.2 撤销提交

git reset head~ --soft命令,但是无法撤销第一次提交
git reset三个参数--soft --mix hard的区别

工作区暂存区
–soft保留保留
–mix保留丢弃
–hard丢弃丢弃

查看暂存区文件指令git ls_files

3.3远程仓库

3.3.1 添加远程仓库

git remote add origin https://xxxxxxxx
推送本地代码git push origin master

3.3.2 SSH

github ssh配置参考
在实际开发过程中会因为开发新功能、修复bug或者多人协同开发需要创建分支。

4.分支

4.1 branch

git branch创建分支,但是没有切换分支
git switch切换分支,在git -v2.23版本后支持。之前版本可以使用git checkout命令切换分支,在分支名和文件名一样时git checkout存在歧义,会默认切换分支。
在这里插入图片描述

4.2 merge

git merge xxx将xxx分支内容的更改合并到当前分支上。
例如创建两个分支,master分支存main.txt,dev分支存dev.txt文件,当我们需要将dev分支合并到master分支时,需要确保当前分支是master分支可以使用git switch master切换当前分支,执行git merge dev将dev分支上内容合并到主分支上,如下图所示:
`
**加粗样式**

4.3 rebase

git rebase xxx将xxx分支内容的更改变基到当前分支上。以下图分支说明
在这里插入图片描述

图4.1 例程

变基指令会先寻找分支的祖先节点,例程中是main:3节点,若当前分支是master分支,执行git rebase dev则会将当前分支的mian:4 节点移到dev分支的后面,如下图所示:
在这里插入图片描述

图4.2 git rebase dev后状态

若当前分支是dev分支,执行git rebase master则会将当前分支的dev:1 dev:2 节点移到master分支的后面,如下图所示。

在这里插入图片描述

图4.3 git rebase master后状态

rebase会导致篡改历史,图4.3为例dev:1的基变成了main:4。在rebase前图4.1所示,dev:1的基是main:3。

4.3 merge VS rebase

mergerebase
优点不会破坏历史,方便回溯与查看不新增提交记录,形成线性历史
缺点会产生额外提交节点,分支图复杂会改变提交历史,改变branch out节点

4.3分支冲突

当两个分支进行不兼容操作时则会产生分支冲突。例如:若master分支和feat分支都对同一个文件的同一行进行修改。
step1:先新建一个feat分支然后修改main1.txt的内容,如图所示:(图片后续切回去截的)
在这里插入图片描述

step2:然后切回master分支,刚刚的修改内容消失,因为切回master最后状态,修改同一行内容,然后提交,结果如图。
在这里插入图片描述

step3:当我们执行代码合并时则会显示分支冲突
在这里插入图片描述

step4:使用git diff命令查看具体冲突。👉图也显示文件中显示了具体冲突。
在这里插入图片描述
step 5:删除<<<<<<< ======= >>>>>>> feat1,修改冲突
在这里插入图片描述
step 6:再执行git add .git commit命令完成分支合并
在这里插入图片描述

总结:手动解决分支冲突:使用git diff命令查找冲突文件,选择保留原有或者变更代码。修改后执行git add保存变更文件,再执行git merge或者git rebase --continue操作继续合并代码。

借助第三方工具提供UI界面:
可以二选一或者两个都选择。
在这里插入图片描述
然后写入commit点击提交按钮即可,这比手动修改便捷一些。
在这里插入图片描述

终止合并或者变基:
执行git merge --abort或者git rebase --abort取消合并。

5.git提交规范

常见的提交规范叫做"Conventional Commits"
消息结构:

每个提交消息包含一个简短的提交类型(type),可选的作用域(scope)以及详细的提交描述(description)。
各部分之间用冒号(:)分隔,细节描述与前面的部分用空格分隔。
例如:feat(user): add login functionality

提交类型(type):

feat: 新功能(feature)
fix: 修复问题(bug fix)
docs: 文档更新
style: 代码风格调整,不涉及功能性变动
refactor: 重构代码
test: 添加或修改测试代码
chore: 其他不涉及代码修改的任务

作用域(scope)(可选):
表示变更的范围或影响的组件/模块。可以是文件路径、模块名、功能域等。

提交描述(description):
提供详细的提交说明,描述变更的具体内容。

示例:

feat(user): add login functionality

- Added login form and validation
- Implemented authentication API integration
- Updated user profile page

5.1工作流: gitflow模型

git分支.png
master:可直接发布生产的分支。只接受hotfix和release的请求合并,不允许直接修改。(主要分支)
hot fixes:解决线上问题,修复后合并回main分支。命名规则 hotfix-#issueid-desc。
release:版本发布分支,永久分支用于发布前测试和验证。
develop:开发分支。(主要分支)
feature:功能分支,从开发分支分离开发新功能。命名规则:feature-pdbus-function

适用与开发水平适中有一定开发流程和规范的团队。

5.2 工作流:github flow模型

pPJh0H0.png
master:长期存在的主分支,主分支上代码可以直接发布生产,禁止团队成员直接在主分支上提交
featurn:团队成员在feature上开发,结束后提交合并,由代码功能评审团队评审后合并到master分支。

参考

GeekHour
30分钟弄懂所有工作Git必备操作 / Git 入门教程

附录1:GIT与SVN

来源chatgpt
Git和SVN是两种常用的版本控制系统,用于管理项目的源代码和跟踪文件的变化。下面是Git和SVN之间的一些区别:

分布式 vs 集中式:Git是一种分布式版本控制系统,每个开发者都可以拥有完整的代码仓库副本,并且可以在不联网的情况下进行提交和查看历史记录。SVN是一种集中式版本控制系统,所有代码都存储在中央仓库中,开发者需要联网才能进行提交和查看历史记录。

分支和合并:Git具有强大的分支和合并功能,可以轻松创建和管理多个分支,用于同时进行多个功能的开发或修复。Git的分支操作非常快速和轻量级。SVN也支持分支和合并,但相对复杂和耗时。

历史记录:Git的历史记录是基于文件内容的快照,每次提交都会创建一个新的快照。SVN的历史记录是基于文件的差异,每次提交都会记录文件变化的差异。因此,在Git中查看历史记录更快。

版本号:Git使用SHA-1哈希作为版本号,确保每个版本都具有唯一的标识符。SVN使用递增的版本号,例如1、2、3等。

分布式开发:由于Git是分布式的,开发者可以在本地进行提交和分支操作,而不受中央服务器的限制。这在团队分散和无网络连接的情况下非常有用。SVN在没有网络连接时,无法进行提交和分支操作。

冲突解决:Git具有更强大的冲突解决功能,开发者可以手动解决冲突并进行提交。SVN的冲突解决相对较弱,较常见的情况是手动编辑冲突文件并使用特定命令解决。

需要注意的是,Git和SVN适用于不同的项目和团队,选择哪种版本控制系统取决于具体需求和团队偏好。 Git更适合分布式开发、速度快、分支管理灵活等场景,而SVN适合集中式开发、简单易用等场景。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一文速学-让神经网络不再神秘,一天速学神经网络基础-前向传播(三)

前言 思索了很久到底要不要出深度学习内容&#xff0c;毕竟在数学建模专栏里边的机器学习内容还有一大半算法没有更新&#xff0c;很多坑都没有填满&#xff0c;而且现在深度学习的文章和学习课程都十分的多&#xff0c;我考虑了很久决定还是得出神经网络系列文章&#xff0c;…

——滑动窗口

滑动窗口 所谓滑动窗口&#xff0c;就是不断的调节子序列的起始位置和终止位置&#xff0c;从而得出我们要想的结果。也可以理解为一种双指针的做法。 leetcode76 class Solution {public String minWindow(String s, String t) {char[] schars s.toCharArray();char[] tc…

服务器部署前后端项目-SQL Father为例

hello~大家好哇&#xff0c;好久没更新博客了。现在来更新一波hhh 现在更新一下部署上的一些东西&#xff0c;因为其实有很多小伙伴跟我之前一样&#xff0c;很多时候只是开发了&#xff0c;本地前后端都能调通&#xff0c;也能用&#xff0c;但是没有部署到服务器试过&#x…

如果你觉得自己很失败,请观看此内容 视频学习

目录 什么是成功&#xff1f;​​​​​​​ How can we succeed in such an unfair world? 我们如何在这个不公平的地球上获得成功&#xff1f; 如何去找到自己的不公平优势呢&#xff1f; 最开始也有常有人跟她说你做视频是赚不到钱的 你做了&#xff0c;并不代表你做…

Spring版本与JDK版本演变

Java各版本变更核心API Java8 lambada表达式函数式接口方法引用默认方法Stream API 对元素流进行函数式操作Optional 解决NullPointerExceptionDate Time API重复注解 RepeatableBase64使用元空间Metaspace代替持久代&#xff08;PermGen space&#xff09; Java7 switch 支…

day3 c++d对话框及事件处理机制

1.文本编辑器 2.自由移动的球

手把手教你写出第一个C语言程序

Hello, World! 1. 前言2. 准备知识2.1 环境2.2 文件的分类2.3 注释2.3.1 注释的作用2.3.2 注释的两种风格2.3.2.1 C语言的注释风格2.3.2.2 C的注释风格 2.3.3 VS中注释和取消注释的快捷键 3. 开始演示3.1 创建项目3.2 创建源文件3.3 写代码3.4 编译链接运行 4. 代码解释4.1 写主…

QT DAY4

一、对话框 消息对话框、字体对话框、颜色对话框、文件对话框 1.1消息对话框 主要分为这四类对话及一种NoIcon无图标对话 而对话框也分为两种实现方式&#xff0c;一种为基于属性分开初始化的方式&#xff0c;这种方式更灵活&#xff0c;更多元&#xff0c;需要对exec的返回值…

SQLPro Studio for Mac:强大的SQL开发和管理工具

SQLPro Studio for Mac是一款强大的Mac上使用的SQL开发和管理工具&#xff0c;它支持各种数据库&#xff0c;包括MySQL&#xff0c;PostgreSQL&#xff0c;SQLite等。使用 SQLPro Studio&#xff0c;您可以轻松地连接和管理您的数据库&#xff0c;执行SQL查询和脚本&#xff0c…

c++11 标准模板(STL)(std::basic_ostringstream)(一)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_ostringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::allo…

Windows安装Nginx及部署vue前端项目操作

先在nginx官网下载windows下安装的包&#xff0c;并解压&#xff0c;到ngnix目录下 双击nginx.exe,会有黑窗闪过。 用cmd命令窗口&#xff0c;cd 到nginx解压目录&#xff0c;./nginx启动。 在浏览器中访问http://localhost:80,出现以下界面说明启动成功(由于笔者电脑80端口被…

【核心复现】基于改进灰狼算法的并网交流微电网经济优化调度(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Nano编辑器安装使用指南

关于nano Nano编辑器是一个命令行文本编辑器&#xff0c;具有简单易用的界面和一些基本功能。 Nano小巧友好&#xff0c;提供许多额外的特性&#xff0c;例如交互式的查找和替换、定位到指定的行列、自动缩进、特性切换、国际化支持、文件名标记完成等。 Nano是为了代替闭源的…

【0901作业】QTday3 对话框、发布软件、事件处理机制,使用文件相关操作完成记事本的保存功能、处理键盘事件完成圆形的移动

目录 一、思维导图 二、作业 2.1 使用文件相关操作完成记事本的保存功能 2.2 处理键盘事件完成圆形的移动 一、思维导图 二、作业 2.1 使用文件相关操作完成记事本的保存功能 void Widget::on_saveBtn_clicked() {QString filename QFileDialog::getSaveFileName(this,&…

DVWA失效的访问控制

失效的访问控制&#xff0c;可以认为是系统对一些功能进行了访问或权限限制&#xff0c;但因为种种原因&#xff0c;限制并没有生效&#xff0c;造成失效的访问控制漏洞,比如越权等 这里以DVWA为例&#xff0c;先访问低难度的命令执行并抓包 删除cookie&#xff0c;并在请求头…

堆的基本存储(Java 实例代码)

堆的基本存储 一、概念及其介绍 堆(Heap)是计算机科学中一类特殊的数据结构的统称。 堆通常是一个可以被看做一棵完全二叉树的数组对象。 堆满足下列性质&#xff1a; 堆中某个节点的值总是不大于或不小于其父节点的值。堆总是一棵完全二叉树。 二、适用说明 堆是利用完…

【防火墙】防火墙NAT Server的配置

Web举例&#xff1a;公网用户通过NAT Server访问内部服务器 介绍公网用户通过NAT Server访问内部服务器的配置举例。 组网需求 某公司在网络边界处部署了FW作为安全网关。为了使私网Web服务器和FTP服务器能够对外提供服务&#xff0c;需要在FW上配置NAT Server功能。除了公网…

java八股文面试[多线程]——进程与线程的区别

定义 1、进程&#xff1a;进程是一个具有独立功能的程序关于某个数据集合的以此运行活动。 是系统进行资源分配和调度的独立单位&#xff0c;也是基本的执行单元。是一个动态的概念&#xff0c;是一个活动的实体。它不只是程序的代码&#xff0c;还包括当前的活动。 进程结构…

RunnerGo:提升性能测试效率的强大利器

在现代软件开发中&#xff0c;性能测试是确保应用程序在真实负载下正常运行的关键环节。为了满足不断增长的用户需求和保证应用程序的性能稳定性&#xff0c;这里给大家介绍RunnerGo&#xff0c;这是一款功能强大、易于使用的性能测试平台&#xff0c;能够极大地提升性能测试的…

NoSQL数据库介绍+Redis部署

目录 一、NoSQL概述 1、数据的高并发读写 2、海量数据的高效率存储和访问 3、数据库的高扩展和高可用 二、NoSQL的类别 1、键值存储数据库 2、列存储数据库 3、文档型数据库 4、图形化数据库 三、分布式数据库中的CAP原理 1、传统的ACID 1&#xff09;、A--原子性 …