Git 版本控制完全指南:从入门到精通

Git 版本控制完全指南:从入门到精通

作为当今最流行的分布式版本控制系统,Git 已经成为开发者必备的技能之一。无论你是独立开发者还是团队协作,Git 都能帮助你高效管理代码版本。本文将带你从零开始,逐步掌握 Git 的核心概念和常用操作。

Git 初始化与配置

git init

这个简单的命令会在当前目录创建一个新的 Git 仓库。Git 仓库是 Git 用来跟踪和管理项目变更的核心机制。执行后,你会看到一个隐藏的 .git 文件夹,它包含了 Git 所需的所有仓库数据。

git config user.name "sin"
git config user.email "123456@qq.com"

这些配置命令非常重要,因为它们设置了提交代码时的作者信息。Git 会将这些信息附加到你的每一次提交上,这样其他人就能知道是谁做了哪些修改。

查看配置项:

git config -l

这个命令会列出所有 Git 配置,包括用户信息、别名设置等。当需要检查或调试配置问题时非常有用。

删除配置

git config -unset user.email

如果你需要删除某个特定的配置项,可以使用这个命令。注意,如果该配置是在全局设置的,你需要使用相同的范围来删除它。

一台服务器可以创建多个本地仓库,加了global相当于配置在全局都生效。

git config --global user,name "sin"

全局配置(--global)会将设置应用于当前用户的所有仓库,而本地配置(不加--global)只影响当前仓库。这在多项目开发中特别有用。

是用global创建的想要重置需要同样是用global关键字。

我们可以进入.get文件:

[sin@VM-4-8-centos gitcode]$ cd .git
[sin@VM-4-8-centos .git]$ tree ./
./
|-- branches
|-- config
|-- description
|-- HEAD
|-- hooks
|   |-- applypatch-msg.sample
|   |-- commit-msg.sample
|   |-- post-update.sample
|   |-- pre-applypatch.sample
|   |-- pre-commit.sample
|   |-- prepare-commit-msg.sample
|   |-- pre-push.sample
|   |-- pre-rebase.sample
|   -- update.sample
|-- info
|   -- exclude
|-- objects
|   |-- info
|   -- pack
-- refs|-- heads-- tags

.git 目录是 Git 仓库的核心,包含了所有版本控制所需的数据。其中:

  • objects 目录存储所有数据内容
  • refs 目录存储指向分支和标签的指针
  • HEAD 文件指向当前所在的分支
  • config 文件包含仓库特定的配置选项

不能再.git文件中手动修改任何内容。手动修改可能会导致仓库损坏,应该始终使用 Git 命令来操作。

Git 基本工作流程

在这里插入图片描述

这张图清晰地展示了 Git 的三个主要区域:工作区、暂存区(Stage/Index)和版本库(Repository)。理解这三个区域的关系对掌握 Git 至关重要。

git add file.txt

git add 命令将工作区的修改添加到暂存区。暂存区就像一个准备区,让你可以精心挑选哪些修改要包含在下一次提交中。

git commit file.txt -m"本次提交的细节"

git commit 命令将暂存区的修改永久保存到版本库中。提交信息(-m参数)应该清晰描述这次提交的目的,这对日后回溯历史非常有帮助。

git log

git log 显示项目的提交历史,包括每次提交的作者、日期和提交信息。这是了解项目演变过程的主要方式。

Git 对象模型

[root@VM-4-8-centos gitstudy]# tree .git
.git
|-- branches
|-- COMMIT\_EDITMSG
|-- config
|-- description
|-- HEAD
|-- hooks
|   |-- applypatch-msg.sample
|   |-- commit-msg.sample
|   |-- post-update.sample
|   |-- pre-applypatch.sample
|   |-- pre-commit.sample
|   |-- prepare-commit-msg.sample
|   |-- pre-push.sample
|   |-- pre-rebase.sample
|   -- update.sample
|-- index
|-- info
|   -- exclude
|-- logs
|   |-- HEAD
|   -- refs
|       -- heads
|           -- master
|-- objects
|   |-- 2f
|   |   -- 96a52bce7a059aab3577e7e9b8499df7aa46dc
|   |-- 9c
|   |   -- 7b41e1c03f5499d21419108d6ef57d0bec1da4
|   |-- ec
|   |   -- 8c05d08dbd2166e7550d64239cd997a35e396c
|   |-- info
|   -- pack
-- refs|-- heads|   -- master-- tags

Git 的核心是一个内容寻址文件系统,这意味着它存储的是文件内容的哈希值而非文件名。每次提交都会创建一个新的对象存储在 objects 目录中。

[root@VM-4-8-centos gitstudy]# cat .git/refs/heads/master
ec8c05d08dbd2166e7550d64239cd997a35e396c

master 分支实际上只是一个指向特定提交对象的指针。这种设计使得分支创建和切换非常高效。

git cat-file -p ec8c05d08dbd2166e7550d64239cd997a35e396c

git cat-file 命令可以查看 Git 对象的内容。这是深入了解 Git 内部工作原理的强大工具。

[root@VM-4-8-centos gitstudy]# git cat-file -p ec8c05d08dbd2166e7550d64239cd997a35e396c
tree 9c7b41e1c03f5499d21419108d6ef57d0bec1da4
author sin <123456@sin.com> 1747633828 +0800
committer sin <123456@sin.com> 1747633828 +0800Init and test

这个提交对象包含了指向树对象(tree)的指针、作者信息、提交者信息和提交消息。树对象则包含了项目目录结构和文件指针。

git追踪管理的不是文件,是修改。这意味着 Git 关注的是内容的变化,而不是文件本身。这种设计使得 Git 能够高效地处理文件重命名、移动等操作。

查看状态与差异

git status

git status 是日常使用最频繁的命令之一。它会告诉你:

  • 哪些文件被修改但未暂存
  • 哪些文件已暂存准备提交
  • 当前所在的分支
  • 与远程分支的关系
[root@VM-4-8-centos gitstudy]# touch file1
[root@VM-4-8-centos gitstudy]# ls
file1  readme
[root@VM-4-8-centos gitstudy]# git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#        file1
nothing added to commit but untracked files present (use "git add" to track)

这个输出显示我们创建了一个新文件 file1,但它目前处于"未跟踪"状态,意味着 Git 还没有开始跟踪它的变化。

使用git diff,可以查看文件的修改:

[root@VM-4-8-centos gitstudy]# git diff readme
diff --git a/readme b/readme
index 2f96a52..f633a22 100644
--- a/readme
+++ b/readme
@@ -1 +1,2 @@sdsadsad
+nihao

git diff 显示工作区与暂存区之间的差异。这个输出显示我们在 readme 文件中添加了一行"nihao"。

版本回退

git reset [--soft | --mixed | --hard] [HEAD]

在这里插入图片描述

版本回退是 Git 的强大功能之一,但需要谨慎使用。三种模式的区别:

  • --soft: 只移动 HEAD 指针,不改变暂存区和工作区
  • --mixed(默认): 移动 HEAD 指针并重置暂存区,但不改变工作区
  • --hard: 彻底回退,移动 HEAD 指针、重置暂存区和工作区

要慎用hard,防止一次回退导致代码消失。使用 --hard 前,确保你已经保存或提交了所有重要更改。

回退一次之后,如何ID没有被清楚,还是有后悔药可以吃的(撤回回退)

使用git reflog可以查看回退操作。git reflog 记录了 HEAD 的所有变化,即使是被"丢失"的提交也能在这里找到。

撤销修改

在这里插入图片描述

如果在工作区中,可以使用下面的代码进行撤销修改:

  1. 手动修改
  2. Git checkout – [filename]

git checkout -- <file> 会丢弃工作区中指定文件的所有修改,将其恢复到最近一次提交或暂存的状态。

如果代码同时在工作区与暂存区,需要使用git reset进行版本回退。这种情况下,你需要先取消暂存(git reset HEAD <file>),然后再撤销工作区的修改。

删除文件

Git提供删除命令,可以同时删除工作区与暂存区。

git rm

git rm 不仅会从工作目录中删除文件,还会将这次删除操作记录到暂存区。这与直接删除文件后运行 git add 效果相同。

分支管理

在这里插入图片描述

分支是 Git 最强大的功能之一。Head可以指向其他分支,被指向的分支是当前工作的分支。

创建分支:

git branch dev

分支在 Git 中非常轻量级 - 它们只是指向特定提交的指针。创建新分支不会复制任何文件,只是创建一个新的指针。

切换分支:

git checkout dev

切换分支会更新工作目录中的文件以匹配该分支指向的提交。如果工作区有未提交的修改,Git 会阻止切换以避免数据丢失。

查看当前分支:

git branch

不带参数的 git branch 会列出所有本地分支,并在当前分支前标记星号。

合并操作:
在转到master分支上后运行下面的代码,即可将dev分支合并到master分支上。

git merge dev

合并将另一个分支的修改整合到当前分支。Git 会尝试自动合并,如果遇到冲突,需要手动解决。

删除本地分支:

git branch -d dev

删除分支前,确保它的所有修改都已经合并到其他分支。如果分支未合并,Git 会拒绝删除,除非使用 -D 强制删除。

git中如果两个分支产生冲突,会在生成的项目中显示出来,之后由开发人员手动修复冲突。冲突标记格式为:

<<<<<<< HEAD
当前分支的内容
=======
要合并的分支的内容
>>>>>>> branch-name

在手动合并之后,需要进行一次提交操作。这个提交就是合并提交,记录了冲突解决的结果。

在git中,可以将提交过程展示为可视的图:

git log --graph --abbrev-commit

--graph 选项会绘制 ASCII 图形展示分支和合并历史,--abbrev-commit 显示缩写的提交哈希,使输出更简洁。

分支管理策略

FastForward模式下面,并不能看出来这次的提交是正常提交还是通过merge的提交。当合并的分支是当前分支的直接祖先时,Git 默认会使用"快进"(fast-forward)合并,即简单移动分支指针而不创建合并提交。要强制创建合并提交,可以使用 --no-ff 选项。

远程仓库操作

从本地将代码上传到远程仓库:

git push

git push 将本地分支的提交上传到远程仓库。第一次推送时需要使用 -u 选项设置上游分支。

将远程仓库拉去到本地:

git fetch

git fetch 从远程仓库下载所有数据,但不会自动合并到工作分支。这让你可以在合并前先检查变化。

git pull origin master:master

git pull 实际上是 git fetchgit merge 的组合操作。它会从远程仓库获取最新更改并尝试合并到当前分支。

如果远端和本地的名称一样的话也可以使用下面的缩写版:

git pull origin master

Git 别名

git除了可以配置name和email,也可以为命令起别名:

git config --global alias.lpa 'log --pretty=oneline --abbrev-commit'

别名可以显著提高工作效率。例如,上面的命令创建了一个 lpa 别名,可以显示简洁的提交历史。

标签管理

可以对一次commit进行标签的标识。标签通常用于标记发布版本(v1.0, v2.0等)。

使用下面的命令,可以默认为最新的提交打一个标签:

git tag v1.0

标签分为轻量标签(只是一个指向特定提交的指针)和附注标签(包含打标签者信息、日期和消息)。要创建附注标签,使用 -a 选项。

使用下面的命令可以查看现在有哪些标签存在:

git tag

在标签命令之后也可以进行评论。使用 -m 选项可以为标签添加注释,这对发布说明特别有用。

可以用下面的代码删除标签:

git tag -d v1.0

标签默认只在本地创建,要共享标签到远程仓库,需要显式推送(git push origin v1.0)。

总结

Git 是一个功能强大且灵活的工具,掌握它可以显著提高你的开发效率。建议从基础命令开始练习,逐步熟悉更高级的功能。记住:

  • 频繁提交,保持提交的原子性
  • 编写有意义的提交信息
  • 合理使用分支进行功能开发
  • 定期与远程仓库同步

随着经验的积累,你会越来越欣赏 Git 的设计哲学和强大能力。

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

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

相关文章

408第三季part2 - 计算机网络 - 计算机网络分层结构

理解 PCI会放一些控制信息&#xff0c;源地址目的地址都在里面 SDU是放的数据 整个加起来是PDU 每一层的SDU都是上一层的PDU 看一看 也是简单看一看就行 网络层有时候也叫IP数据报 这里断点下载的意思就是&#xff0c;你下载东西的时候网络断了&#xff0c;再连回来的时候会接…

打开摄像头,服务器和客户端传输摄像头图像数据

1&#xff1a;Camera Server 主要功能&#xff0c;打开摄像头&#xff0c;接收客户端请求 接收到客户端请求“R”字符后开始传输摄像头图像。 #include "mainwindow.h" #include "ui_mainwindow.h"#include<QDebug>MainWindow::MainWindow(QWidget…

Android实现获取前台应用信息

Android实现获取前台应用信息 1.前言&#xff1a; 之前需要获取在后台运行的App信息&#xff0c;比如包名、版本这些常规的&#xff0c;今天是讲解获取在前台的App信息&#xff0c;虽然App在前台&#xff0c;但是具体的信息可能不知道&#xff0c;今天就尝试获取一下&#xf…

快讯|美团即时零售日订单已突破1.2亿,餐饮订单占比过亿

据美团内网公布信息显示&#xff0c;截至22时54分&#xff0c;美团即时零售当日订单已经突破了1.2亿单&#xff0c;其中&#xff0c;餐饮订单已超过1亿单。 值得注意的是&#xff0c;就在当晚20时45分&#xff0c;美团内网曾显示即时零售日订单突破了1亿。这也意味着&#xff…

pycharm2018配置gitee操作

一、gitee介绍及下载安装 gitee介绍&#xff1a; gitee别名码云&#xff0c;是中国的一个代码托管平台&#xff0c;类似于GitHub&#xff0c;基于Git技术&#xff0c;提供远程仓库托管、协作功能和开源社区服务&#xff0c;优势包括访问速度快、本地化服务和政策合规git和gite…

数据结构——栈的讲解(超详细)

数据结构——栈的讲解&#xff08;超详细&#xff09;-腾讯云开发者社区-腾讯云 #include"Stack.h" void STInit(ST* ps) {ps->arr NULL;ps->capacity ps->top 0; //总空间个数和有用空间个数都初始化为0 }void STDestroy(ST* ps) {if (ps -> arr) …

MySQL允许root用户远程连接

注意&#xff1a;在实际生产环境中&#xff0c;允许root用户从任意主机&#xff08;‘%’&#xff09;连接存在安全风险&#xff0c;建议使用强密码并限制访问IP&#xff0c;或者创建具有必要权限的单独用户用于远程连接。MySQL 配置远程连接指南 1. 登录 MySQL 服务器 mysql -…

STM32的 syscalls.c 和 sysmem.c

syscalls.c 是 STM32CubeIDE 自动生成的标准系统调用适配文件&#xff0c;用于裸机环境下支持 newlib 标准库&#xff08;如 printf, scanf, malloc&#xff09;的运行。这份文件提供了标准库运行所需的最小系统调用实现。现在我来逐段解析其作用&#xff0c;并补充你可能需要修…

Java零基础笔记01(JKD及开发工具IDEA安装配置)

1.Java简介 Java是一种广泛使用的计算机编程语言&#xff0c;由美国的Sun Microsystems公司&#xff08;Stanford University Network&#xff09;在1995年推出。Java以其跨平台、面向对象、安全性高等特点&#xff0c;广泛应用于企业级应用开发、移动应用开发等领域。2009年&a…

Spark SQL架构及高级用法

Spark SQL 架构概述 架构核心组件 API层&#xff08;用户接口&#xff09; 输入方式&#xff1a;SQL查询&#xff1b;DataFrame/Dataset API。统一性&#xff1a; 所有接口最终转换为逻辑计划树&#xff08;Logical Plan&#xff09;&#xff0c;进入优化流程。 编译器层&…

【机器学习深度学习】什么是下游任务模型?

目录 前言 一、什么是下游任务模型&#xff1f; 二、为什么需要下游任务模型&#xff1f; 三、下游任务模型都在干嘛&#xff1f; 四、下游模型怎么训练出来的&#xff1f; 五、图解理解&#xff1a;上游 vs 下游 六、一个现实案例&#xff1a;BERT做情感分析 原始数据…

补充:问题:CORS ,前后端访问跨域问题

补充&#xff1a;问题&#xff1a;CORS &#xff0c;前后端访问跨域问题 我这边的解决方法是&#xff1a; myAxios.defaults.withCredentials true; // 配置为true&#xff0c;表示前端向后端发送请求的时候&#xff0c;需要携带上凭证cookie整体的&#xff1a; import axio…

洛谷 P13014 [GESP202506 五级] 最大公因数-普及-

题目描述 对于两个正整数 a,ba,ba,b&#xff0c;他们的最大公因数记为 gcd⁡(a,b)\gcd(a,b)gcd(a,b)。对于 k>3k > 3k>3 个正整数 c1,c2,…,ckc_1,c_2,\dots,c_kc1​,c2​,…,ck​&#xff0c;他们的最大公因数为&#xff1a; gcd⁡(c1,c2,…,ck)gcd⁡(gcd⁡(c1,c2,……

前端-CSS-day1

目录 1、初识CSS 2、CSS引入方式 3、标签选择器 4、类选择器 5、id选择器 6、通配符选择器 7、画盒子 8、字体大小 9、字体粗细 10、字体倾斜 11、行高 12、行高-垂直居中 13、字体族 14、font属性 15、文本缩进 16、文本对齐方式 17、图片对齐方式 18、文本…

解锁万能文件内容提取器:Apache Tika

01 引言 在日常工作中&#xff0c;你是否曾为这些场景头疼过&#xff1f; 堆积如山的PDF、Word、Excel文档&#xff0c;如何快速提取关键信息&#xff1f;用户上传的文件五花八门&#xff0c;如何自动识别类型并安全处理&#xff1f;构建搜索引擎时&#xff0c;如何让系统“读懂…

gemini-cli初体验

目录 准备配置环境变量运行使用基础使用配置MCP调用MCP 参考 准备 NodeJS 18版本 配置环境变量 设置GEMINI_API_KEY 变量&#xff0c;在https://aistudio.google.com/apikey创建key 设置代理&#xff08;可选&#xff0c;取决于您的网络&#xff09;,不配置可能会报错 api e…

Java --类变量和类方法--main语句

1. 类变量和类方法 介绍&#xff1a; 类变量也叫静态变量/静态属性&#xff0c;是该类的所有对象共享的变量&#xff0c;任何一个该类的对象去访问它时&#xff0c;取到的都是相同的值&#xff0c;同样任何一个该类的对象去修改它时&#xff0c;修改的也是同一个变量。 语法…

spring boot项目配置使用minion

一. Minio概述 Minio是一款开源的高性能对象存储服务,兼容Amazon S3 API,适用于私有云、混合云及边缘计算场景。它采用分布式架构设计,支持水平扩展,提供数据加密、版本控制、生命周期管理等企业级功能,适用于存储非结构化数据(如图片、视频、日志等)。 核心特性 S3兼…

<5>_Linux进程控制

目录 一&#xff0c;进程创建&#xff0c;fork/vfork 1&#xff0c;fork创建子进程&#xff0c;操作系统都做了什么 2&#xff0c;写时拷贝的做了什么 二&#xff0c;进程终止&#xff0c;echo $&#xff1f; 1&#xff0c;进程终止时&#xff0c;操作系统做了什么 2&…

阿里云服务器正确配置 Docker 国内镜像的方法

&#x1f4e6; 原理说明&#xff1a;什么是“Docker 镜像加速器”&#xff1f; Docker 默认会从官方仓库 registry-1.docker.io 拉取镜像。由于网络原因&#xff0c;在中国大陆访问这个地址较慢甚至失败。 镜像加速器的作用是&#xff1a; 在国内部署一个缓存服务器&#xf…