git必会的知识点

news2024/12/29 14:24:42

注:本文参考https://www.liaoxuefeng.com/wiki/896043488029600

原文非常值得一读,作者学识渊博,补充了很多有意思的知识。我仅仅是拾人牙慧。

请添加图片描述

git是最先进的分布式版本控制系统。

版本控制系统——自动记录系统中文件的改动情况,还可以多人协同编辑。

请添加图片描述

一、git诞生历史及背景

git是Linux创始人Linus用C语言编写的,起初用于管理Linux社区提交的代码,后来GitHub网站上线后,为开源软件提供Git存储。

1.1 分布式vs集中式

版本控制器有分布式和集中式,集中式是使用一台中央服务器为其他用户进行版本控制,需要联网所以上传速度慢,如果服务器挂了,所有人都没法工作了。分布式是每个用户都有一个完整的版本库,无需联网,多人协同时仅需共享各自修改的部分。但分布式通常也有一台充当中央服务器的电脑。

二、git安装教程

参考文章:https://www.liaoxuefeng.com/wiki/896043488029600/896067074338496

2.1 git配置

(base) yfy@yfydeMacBook-Pro ~ % git config --global user.name "yfy"
(base) yfy@yfydeMacBook-Pro ~ % git config --global user.email "yyanfeiyu@163.com"

2.2 创建版本库

版本库也叫仓库,git会跟踪仓库里的所有文件的修改情况,以便追踪历史或还原。

(base) yfy@yfydeMacBook-Pro CPP % mkdir learngit
(base) yfy@yfydeMacBook-Pro CPP % cd learngit 
(base) yfy@yfydeMacBook-Pro learngit % git init
Initialized empty Git repository in /Users/yfy/Desktop/CPP/learngit/.git/
(base) yfy@yfydeMacBook-Pro learngit % ls -ah
.	..	.git

其中.git目录就是git用来跟踪管理版本库的。

2.3 将文件添加到版本库以及其它git命令

重要提示:所有的版本控制系统,只能跟踪文本文件的改动,无法跟踪二进制文件如图片和视频(包括word)。

使用Windows系统不能使用自带的记事本编辑任何文本文件,建议使用vscode编辑。

  • 编写一个txt文件,一定要放在版本库目录下。

  • 第一步,用命令git add 告诉Git,把文件添加到仓库。

  • 第二部,用命令git commit告诉Git,把文件提交到仓库。-m后的是本次提交的说明。

(base) yfy@yfydeMacBook-Pro learngit % git add readme.txt 
(base) yfy@yfydeMacBook-Pro learngit % git commit -m"wrote a readme file"
[main (root-commit) 9b82f95] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

如果有多个文件需要add:

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

笔者个人更偏好使用git add . 进行多个文件的提交

  • 如果文件被修改了,可以使用git status查看状态
On branch main
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:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")
  • 如果想知道哪里被修改了,使用git diff查看
diff --git a/readme.txt b/readme.txt
index d8036c1..15f01b8 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,2 +1,3 @@
 Git is a version control system.
-Git is free software.
\ No newline at end of file
+Git is free software.
+Git is easy.
  • 查看历史记录git log
commit 3d3d739bf5478af94698d35533dbb2ef8ba10bce (HEAD -> main)
Author: yfy <yyanfeiyu@163.com>
Date:   Wed Feb 1 13:45:52 2023 +0800

    add distributed

commit 9b82f959387583938afebdbcfb091b463e5e803f
Author: yfy <yyanfeiyu@163.com>
Date:   Tue Jan 24 22:01:02 2023 +0800

    wrote a readme file

commit后的一长串数字是版本号,用于区分多个人在同一个版本库中的提交信息。

  • 查看版本号可以使用git reflog

  • 回退一个版本git reset --hard HEAD^

其中HEAD表示当前版本,一个代表一个版本,回退两个就需要写2个,回退太多的话,比如回退100个版本,可以是git reset --hard HEAD~100

  • 撤销回退git reset --hard 目的版本号

三、工作区和暂存区操作

请添加图片描述

工作区就是创建的learngit目录,其中有一个隐藏目录.git,是Git的版本库,其中有 被称为stage(或index)的暂存区,还有分支master和指向分支的HEAD。

git add是把文件修改添加到暂存区,git commit是将暂存区的所有内容提交到当前分支。

3.1 撤销修改

如果文件修改后还未git add,则可以使用git checkout – 文件名,丢弃工作区的修改。如果已经git add了,则可使用git reset HEAD 文件名,重新放回工作区。(以上命令可以通过git status获得提示),如果已经提交到分支了,就需要进行版本回退了。

3.2 删除文件

如果将已经提交到版本库中的文件,用rm命令直接删除,是不能完全删除的,需要用到git rm删除,然后使用git commit命令进行提交。

如果文件已经提交到了版本库,就不用担心误删除,都是可以恢复的。

四、远程仓库

我们可以使用git,把代码存储到远程服务器上,例如GitHub网站,这样就不用担心硬盘不足了。但注意git只能管理文本文件。

4.1 如何上传代码到GitHub

请添加图片描述

  • 第0步

注意,如果不愿意花额外的费用进行科学上网,建议使用Gitee进行代码托管。如果不介意,就使用邮箱注册GitHub

  • 第1步 创建SSH Key

在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key

ssh-keygen -t rsa -C "youremail@example.com"

然后一路回车即可。

如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsaid_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

  • 第2步 在GitHub上绑定公钥

进入GitHub个人页面,在左边栏找到「SSH and GPG keys」,选择「New SSH key」,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。

简单讲一下非对称加密算法,你有一个还没上锁的盒子,但锁已经挂在上面了,只需要摁一下就可以上锁,用这个盒子让别人存放东西,他只需要摁一下锁,别人就没法打开,只有盒子所有者有钥匙打开。这个摁一下的动作就相当于公钥,盒子所有者的钥匙相当于私钥。

  • 第三步 添加远程库

我们需要在GitHub上也创建一个git仓库,好与本地仓库同步,可作为备份抑或是多人协作。

注意:参考文章在此处已经不具有操作价值,不过还是有阅读价值。由于GitHub已经不让使用账户密码进行推送代码了,需要使用个人访问令牌。参考https://docs.github.com/zh/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

  • 第四步 创建个人访问令牌

进入GitHub,点击头像,找到「setting」选项,进入后在左边栏找到「Developer settings」选项,然后是「Personal access tokens」选项栏中的「token(classic)」。在其中找到「Generate new token」,然后填写相关信息,为了方便可以选择永久使用该token,多选项可以全选。最后会出来一串字符,记得保存下来。

然后在命令行中执行

git remote set-url origin https://<your_token>@github.com/<USERNAME>/<REPO>.git

<your_token>替换为最后出现的字符串,然后后面的部分是仓库的网址。

然后可以执行git remote -v检查一下自己关联的地址是否正确。

笔者在这里被频繁掉线的梯子和奇葩的git命令报错折磨疯了,所以介绍Gitee了。

4.2 如何上传代码至Gitee

请添加图片描述

我参考的还是廖老师的文章,和GitHub大同小异。配置好公钥后,上传不再需要使用密码了。

因为之前我关联了GitHub上的,所以还需要git remote rm origin删除一下。

然后我在准备提交的出现了一些不同的报错信息,通过bing检索找到了解决方案。

最终提交的手法可以总结为git三板斧:add+commit+push

也就是提交到了版本库后,执行git push就上传到远程仓库了。

顺便记录一下我发现在终端里输入命令code .可以直接让vscode打开当前所在文件夹,非常方便。

4.3 从远程仓库克隆

请添加图片描述

上面的操作部分是介绍了从本地上传至远端仓库,接下来介绍从远端仓库同步到本地,或者叫克隆远端仓库到本地。

只需要找到远程仓库的SSH链接,然后在本地使用git clone + SSH链接即可。当然,HTTPS链接也可以,但缺点是慢。

这个命令只适合于从头开始拷贝一份完整的项目代码,但是如果是想要本地多设备同步,并仅限于自己的分支,修改后使用git pull同步。

比如我的PC修改提交后,想在Mac上继续工作,就需要在Mac上执行git pull先将PC修改的部分同步到Mac。

五、分支管理

5.1 如何理解分支呢?

假设你需要两周才能完成一个项目,第一周你写了一半的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,你可以创建了一个属于自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上。

git上的分支最大的优点就是快。

我们各个时间的版本库就像一串链表,分支其实就是指向某个节点的指针,分支的合并就是切换指针的指向。
请添加图片描述

5.2 分支命令

创建并切换到dev分支:

git checkout -b dev或者git switch -c dev

这相当于两条命令:

git branch dev

git checkout dev或者git switch dev

git branch命令可以查看所有的分支,当前所在分支前面会有*

此时在dev分支上,进行修改并提交,再切换到主分支上,是看不到dev分支做的修改,需要将dev分支合并到主分支上,使用git merge dev,合并完成后就可以删除dev分支了,使用git branch -d dev

分支汇总命令:

查看分支:git branch

创建分支:git branch <name>

切换分支:git checkout <name>或者git switch <name>

创建+切换分支:git checkout -b <name>或者git switch -c <name>

合并某分支到当前分支:git merge <name>

删除分支:git branch -d <name>

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

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

相关文章

多核异构核间通信-mailbox/RPMsg 介绍及实验

1. 多核异构核间通信 由于MP157是一款多核异构的芯片&#xff0c;其中既包含的高性能的A7核及实时性强的M4内核&#xff0c;那么这两种处理器在工作时&#xff0c;怎么互相协调配合呢&#xff1f; 这就涉及到了核间通信的概念了。 IPCC (inter-processor communication contr…

Maven_第四章 使用Maven:IDEA环境

目录第一节 创建父工程第二节 配置Maven信息第三节 创建Java模块工程第四节 创建Web模块工程1、创建模块2、修改打包方式3、Web 设定4、借助IDEA生成web.xml5、设置 Web 资源的根目录6、测试6.1 创建文件6.2 配置tomcat第五节 其他操作1、在IDEA中执行Maven命令①直接执行②手动…

代码随想录算法训练营第24天25天|● 77. 组合● 216.组合总和III ● 17.电话号码的字母组合

77组合 看完题后的思路 void f&#xff08;数组&#xff0c;startIndex&#xff09;递归终止 if&#xff08;startIndex数组长度||path.sizek&#xff09;{ if(path.sizek){ 加入} }递归 for&#xff08;&#xff1b;startIndex<num.size&#xff1b;startIndex&#xff0…

为什么分库分表

系列文章目录 文章目录系列文章目录前言一、什么是分库分表二、分库分表的原因分库分表三、如何分库分表3.1 垂直拆分1.垂直分库2、垂直分表3.2 水平拆分水平分库水平分表水平分库分表的策略hash取模算法range范围rangehash取模混合地理位置分片预定义算法四、分库分表的问题分…

华为动态二进制翻译工具(ExaGear)

你还在为liunix x86程序移植到ARM环境而烦恼吗&#xff1f;你们现在您的福利来了&#xff0c;ExaGear可以解决您的烦恼&#xff0c;让您试下零代码迁移运行Linux x86程序。ExaGear是华为自研动态二进制翻译工具&#xff0c;通过在运行时&#xff0c;将x86应用指令翻译为ARM64指…

备战金三银四,软件测试面试题(全)

1.B/S架构和C/S架构区别 B/S 只需要有操作系统和浏览器就行&#xff0c;可以实现跨平台&#xff0c;客户端零维护&#xff0c;维护成本低&#xff0c;但是个性化能力低&#xff0c;响应速度较慢 C/S响应速度快&#xff0c;安全性强&#xff0c;一般应用于局域网中&#xff0c;因…

leetcode: Two Sum

leetcode: Two Sum1. 题目1.1 题目描述2. 解答2.1 baseline2.2 基于baseline的思考2.3 优化思路的实施2.3.1 C中的hashmap2.3.2 实施2.3.3 再思考2.3.4 最终实施3. 总结1. 题目 1.1 题目描述 Given an array of integers nums and an integer target, return indices of the …

Fluent Python 笔记 第 4 章 文本和字节序列

Python 3 明确区分了人类可读的文本字符串和原始的字节序列。隐式地把字节序列转换成 Unicode 文本已成过去。本章将要讨论 Unicode 字符串、二进制序列&#xff0c;以及在二者之间转 换时使用的编码。 没啥可看的&#xff0c;就一句话&#xff0c;一定不能依赖默认编码&#x…

DP优化 - 斜率优化

假设当前的 DP 方程为 fimin⁡0≤j<i{−K(i)X(j)Y(j)}F(i)f_i\min\limits_{0\leq j< i}\{-K(i)X(j)Y(j)\} F(i)fi​0≤j<imin​{−K(i)X(j)Y(j)}F(i) 或 fimax⁡0≤j<i{−K(i)X(j)Y(j)}F(i)f_i\max\limits_{0\leq j< i}\{-K(i)X(j)Y(j)\} F(i)fi​0≤j<im…

Node.js笔记-Express(基于Node.js的web开发框架)

目录 Express概述 Express安装 基本使用 创建服务器 编写请求接口 接收请求参数 获取路径参数(/login/2) 静态资源托管-express.static&#xff08;内置中间件&#xff09; 什么是静态资源托管&#xff1f; express.static() 应用举例 托管多个静态资源 挂载路径前缀…

车厢调度(train)(栈)

目录 题目描述 解题思路&#xff1a; 代码部分&#xff1a; 题目描述 有一个火车站&#xff0c;铁路如图所示&#xff0c;每辆火车从A驶入&#xff0c;再从B方向驶出&#xff0c;同时它的车厢可以重新组合。假设从A方向驶来的火车有n节&#xff08;n≤1000&#xff09;&…

Revit中关于屋顶编辑线移动的问题

一、Revit中关于屋顶编辑线移动的问题 在绘制屋顶的时候&#xff0c;如果出现有稍微偏差的时候&#xff0c;个别习惯移动编辑线&#xff0c;这种方法是不可取的&#xff0c;接下来为大家介绍一下这种方法的问题所在。 首先我们绘制几面这样的墙体&#xff0c;主要做测试用的&am…

锁升级之Synchronized

Synchronized JVM系统锁一个对象里如果有多个synchronized方法&#xff0c;同一时刻&#xff0c;只要有一个线程去调用其中的一个synchronized方法&#xff0c;其他线程只能等待&#xff01;锁的是当前对象&#xff0c;对象被锁定后&#xff0c;其他线程都不能访问当前对象的其…

流程引擎之发展史及对比总结

流程引擎渊源市场上比较有名的开源流程引擎有 jBPM、Activiti、Camunda、Flowable 和 Compileflow。其中 jBPM、Activiti、Flowable、camunda 四个框架同宗同源&#xff0c;祖先都是 jbpm4&#xff0c;开发者只要用过其中一个框架&#xff0c;基本上就会用其它三个。而 Compile…

SOFA Weekly|SOFANew、本周贡献 issue 精选

SOFA WEEKLY | 每周精选 筛选每周精华问答&#xff0c;同步开源进展欢迎留言互动&#xff5e;SOFAStack&#xff08;Scalable Open Financial Architecture Stack&#xff09;是蚂蚁集团自主研发的金融级云原生架构&#xff0c;包含了构建金融级云原生架构所需的各个组件&#…

基于Gromacs配体修饰自由能FPE计算(手动版)

基于Gromacs配体修饰自由能FPE计算(手动版) 本教程来自于https://github.com/huichenggong/Learning-Computation-with-Chenggong/tree/main/CC_news_008_ddG_uniFEP 我们将要使用的系统来自这篇论文 配体和受体pdb文件 A. 介绍 在本教程中&#xff0c;我们将使用非平衡自…

使用开源实时监控系统 HertzBeat 5分钟搞定 Mysql 数据库监控告警

使用开源实时监控系统 HertzBeat 对 Mysql 数据库监控告警实践&#xff0c;5分钟搞定&#xff01; Mysql 数据库介绍 MySQL是一个开源关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL 是最流行的开源关系型数据库管理系统之…

VHDL语言基础-时序逻辑电路-锁存器

目录 锁存器的设计&#xff1a; RS锁存器&#xff1a; 真值表&#xff1a; 电路结构图&#xff1a; RS锁存器的仿真波形如下&#xff1a; D锁存器&#xff1a; D锁存器的仿真波形如下&#xff1a; 锁存器的设计&#xff1a; 为了与触发器相类比&#xff0c;我们先介绍锁…

奇舞周刊第 481 期 数据不够实时:试试长连接?

记得点击文章末尾的“ 阅读原文 ”查看哟~下面先一起看下本期周刊 摘要 吧~奇舞推荐■ ■ ■数据不够实时&#xff1a;试试长连接&#xff1f;在特定场景下&#xff0c;我们往往需要实时的去获取最新的数据&#xff0c;如获取消息推送或公告、股票大盘、聊天消息、实时的日志和…

面试(九)小米C++开发一面 21.11.02

1、局部变量与全局变量的区别?可以同名嘛? 首先是作用域: 局部变量只在变量声明的代码块范围内生效 全局变量在其声明后的所有位置都能访问到 在局部变量与全局变量同名的情况下,全局变量会被屏蔽掉,只会使用局部变量的内容 2、extern 当在a.c中想要使用b.c中的函数fu…