Git 常用基础命令详解:init、add、commit

一、引言

在软件开发的世界里,版本控制是一项至关重要的技术,它就像是一个时光机器,让开发者能够追踪代码的每一次变化,轻松回溯到任意历史版本,同时也为多人协作开发提供了强大的支持。而 Git,作为目前最流行的分布式版本控制系统,已经成为了开发者们不可或缺的工具。无论是小型项目还是大型企业级应用,Git 都能发挥其强大的功能,帮助团队高效地管理代码。

在 Git 的众多命令中,init、add和commit是最为基础且常用的命令,它们构成了 Git 版本控制的核心操作。掌握这些命令,就相当于拿到了开启 Git 强大功能的钥匙。接下来,让我们深入探索这三个命令的奥秘。

二、git init:初始化你的代码世界

2.1 基本概念

git init是 Git 中用于初始化新仓库的命令 ,它就像是为你的项目打造了一个专属的 “代码时光宝盒”,开启了对项目文件的版本控制之旅。当你在一个项目目录下执行git init时,Git 会在该目录下创建一个隐藏的.git目录,这个目录是 Git 仓库的核心,包含了所有用于跟踪和管理项目版本的文件和目录,如对象数据库、引用、配置文件等。简单来说,它是你进行所有版本控制操作的基础,没有它,Git 就无法记录你的代码变化。

2.2 使用场景

git init命令主要应用于两种场景:

  • 新项目的开始:当你着手一个全新的项目时,使用git init在本地创建一个新的 Git 仓库,从此可以利用 Git 管理项目的版本控制和历史记录,包括代码的提交、分支管理、合并等,便于更好地组织和协作开发代码,同时保留所有历史版本的备份。
  • 对已有项目引入 Git 版本控制:若你已经有一个项目,希望将其纳入 Git 版本控制体系,可使用git init初始化一个新的 Git 仓库,随后通过git add命令将项目中的文件添加到暂存区,再用git commit命令提交这些修改到 Git 仓库,从而实现对项目版本的有效管理,方便与他人协作开发。

2.3 操作示例

假设我们在桌面上有一个名为my_project的文件夹,里面存放着我们的项目代码,现在我们要将其初始化为一个 Git 仓库,具体步骤如下:

  1. 打开终端,切换到my_project目录:
 

cd ~/Desktop/my_project

  1. 执行git init命令:
 

git init

执行结果如下:

 

Initialized empty Git repository in /Users/your_username/Desktop/my_project/.git/

这表明我们已经成功初始化了一个空的 Git 仓库,在my_project目录下会生成一个隐藏的.git目录,使用ls -a命令可以查看。

2.4 常见问题及解决

在使用git init时,可能会遇到以下问题:

  • 权限不足:如果在执行git init时,没有对目标目录的写权限,会导致初始化失败。例如,在一个受系统保护的目录下执行git init,就会出现权限错误。解决方法是确保你对要初始化仓库的目录拥有足够的权限,你可以通过修改目录权限或切换到有写权限的目录来解决。比如,将项目移动到用户主目录下的某个文件夹,或者使用sudo命令(需谨慎使用,可能会带来安全风险)提升权限,但要注意sudo可能会导致文件所有者和权限的变化。
  • 目录已存在 Git 仓库:如果在一个已经存在.git目录的文件夹中再次执行git init,虽然不会覆盖已有的内容,但可能会产生一些混淆。此时,你需要确认是否真的需要重新初始化,或者直接使用已有的 Git 仓库进行操作。

三、git add:将修改纳入管理轨道

3.1 基本概念

在 Git 的工作流程中,git add命令起着桥梁的作用,它将工作区中修改的文件添加到暂存区(也称为索引区) 。暂存区是一个临时的存储区域,位于.git目录下的index文件中,它充当了工作区和版本库之间的缓冲区。当你在工作区对文件进行了修改、新增或删除操作后,这些变化不会立即被记录到版本库中,而是需要通过git add命令将这些文件标记为下次提交的一部分,即将它们添加到暂存区。简单来说,git add就是告诉 Git,你希望将这些文件的当前状态包含在下一次的提交中。

3.2 常用参数解析

  • git add.:这是最常用的参数之一,它表示将当前目录及其子目录下的所有修改、新增和删除的文件都添加到暂存区。这里的.代表当前目录,使用这个命令可以快速地将所有相关文件纳入暂存区,适用于一次性提交多个文件的场景。
  • git add -u:-u是--update的缩写,该参数只将已经被 Git 跟踪的文件的变动提交到暂存区,对于新建的文件,它不会包含在内。这个参数适用于你只想更新已有文件的修改,而不处理新文件的情况,比如你对项目中的一些源文件进行了修改,只想提交这些修改,而不涉及新添加的测试文件等。
  • git add -A:-A是--all的缩写,它会提交所有被删除、被替换、被修改和新增的文件到暂存区,相比git add.,它不仅包含当前目录下的所有变化,还能处理那些在子目录中被删除的文件(git add.在使用rm命令删除文件时,不会自动将删除操作添加到暂存区,除非使用git rm命令删除文件),功能更为全面。

3.3 操作示例

假设我们在my_project项目中进行如下操作:

  1. 创建一个新文件test.txt,并写入一些内容:
 

echo "This is a test file." > test.txt

  1. 查看当前文件状态:
 

git status

输出结果如下:

 

On branch master

Untracked files:

(use "git add <file>..." to include in what will be committed)

test.txt

nothing added to commit but untracked files present (use "git add" to track)

可以看到test.txt文件处于未跟踪状态。

3. 使用git add.将所有文件添加到暂存区:

 

git add.

  1. 再次查看文件状态:
 

git status

输出结果如下:

 

On branch master

Changes to be committed:

(use "git reset HEAD <file>..." to unstage)

new file: test.txt

此时test.txt文件已经被添加到暂存区,状态变为 “new file”,表示这是一个新添加到暂存区的文件。

3.4 与文件状态的关系

结合git status命令,可以更好地理解git add对文件状态的改变。在执行git add之前,文件可能处于未跟踪(untracked)、已修改(modified)但未暂存的状态。当执行git add后,未跟踪的文件会变为已跟踪并暂存(staged)状态,已修改的文件会将修改部分添加到暂存区,文件状态也变为已暂存。例如,我们对test.txt文件进行修改:

 

echo "Modify the test file." >> test.txt

查看状态:

 

git status

输出:

 

On branch master

Changes not staged for commit:

(use "git add <file>..." to update what will be committed)

modified: test.txt

no changes added to commit (use "git add" and/or "git commit -a")

可以看到文件处于已修改但未暂存状态,执行git add test.txt后:

 

git status

输出:

 

On branch master

Changes to be committed:

(use "git reset HEAD <file>..." to unstage)

modified: test.txt

此时文件状态变为已暂存,等待提交。

3.5 撤销操作

如果不小心将错误的文件添加到了暂存区,或者想要撤销之前的git add操作,可以使用git reset命令 。例如,要撤销对test.txt文件的添加操作,可以执行:

 

git reset test.txt

如果要撤销所有暂存区的更改,回到工作区状态,可以执行:

 

git reset

需要注意的是,git reset命令会将暂存区的内容恢复到上一次提交的状态,谨慎使用,以免丢失未提交的修改。

四、git commit:记录代码的关键时刻

4.1 基本概念

当你在工作区完成了一系列的代码修改,并使用git add将这些修改添加到暂存区后,接下来就需要使用git commit命令将暂存区的文件提交到本地仓库,正式记录下代码的这一次变更 。每一次的git commit操作都会在版本历史中创建一个新的提交对象,这个对象包含了本次提交的作者、提交时间、提交说明以及所涉及的文件变更等信息,它是版本控制的关键节点,就像是历史长河中的里程碑,标记着项目代码在不同时刻的状态。

4.2 提交信息的重要性

清晰、有意义的提交信息对于代码管理和团队协作至关重要。一个好的提交信息应该能够准确地描述本次提交所做的修改,让其他开发者(包括未来的自己)能够快速了解这次变更的目的和内容。例如,“修复了用户登录时密码错误提示不明确的问题” 就比 “小修小补” 这样的提交信息更具价值。在团队开发中,详细的提交信息有助于代码审查、问题追踪和版本回溯,提高开发效率和代码质量。

4.3 常用参数解析

  • -m:这是最常用的参数,用于指定提交信息。例如git commit -m "添加了用户注册功能",其中双引号内的内容就是提交信息,简洁明了地描述了本次提交的主要内容。
  • -a:-a是--all的缩写,使用git commit -a时,它会自动将所有已经被 Git 跟踪且修改过的文件添加到暂存区并提交,跳过了git add这一步骤,但它不会提交新创建的文件(即未跟踪的文件)。这个参数适用于你已经确定所有修改都需要提交,且没有新文件需要添加的情况,能简化提交流程。
  • --amend:--amend参数用于修改最近一次的提交 。它有两个主要用途:一是当你发现上次提交的信息有误,或者遗漏了某些文件时,可以使用git commit --amend,在不产生新的提交记录的情况下,将新的修改或正确的提交信息追加到上一次提交中;二是当你希望合并连续的多次提交时,也可以使用这个参数,通过多次--amend操作,将多个小的提交合并为一个更有意义的大提交,使提交历史更加清晰简洁。但需要注意的是,使用--amend会改变提交的哈希值,所以如果已经将提交推送到远程仓库,谨慎使用此参数,以免与远程仓库产生冲突。

4.4 操作示例

继续上面的my_project项目示例,在执行git add.将test.txt文件添加到暂存区后,我们执行git commit命令提交修改:

 

git commit -m "添加了test.txt文件"

执行结果如下:

 

[master (root-commit) 596d8c2] 添加了test.txt文件

1 file changed, 1 insertion(+)

create mode 100644 test.txt

这里[master (root-commit) 596d8c2]表示在master分支上创建了一个根提交(因为这是仓库的第一次提交),596d8c2是这次提交的哈希值,后面的信息表示有 1 个文件被更改,插入了 1 行内容,创建了一个新文件test.txt。

如果我们后续又对test.txt文件进行了修改,比如添加了一行内容:

 

echo "Another line in test.txt" >> test.txt

然后使用git commit -a直接提交修改(假设没有新文件需要添加):

 

git commit -a -m "修改了test.txt文件,添加了新内容"

执行结果如下:

 

[master 7c8a7e4] 修改了test.txt文件,添加了新内容

1 file changed, 1 insertion(+)

这样就完成了对test.txt文件修改的提交。

4.5 提交历史管理

使用git log命令可以查看提交历史,它会按时间顺序列出所有的提交记录,包括每次提交的哈希值、作者、提交时间和提交信息等。例如,在my_project项目中执行git log:

 

git log

输出结果如下:

 

commit 7c8a7e467f8c2c87c2d999c267c2c167d8d6e7a4 (HEAD -> master)

Author: your_name <your_email@example.com>

Date: Tue Nov 19 16:25:12 2024 +0800

修改了test.txt文件,添加了新内容

commit 596d8c2d8c2d8c2d8c2d8c2d8c2d8c2d8c2d8c2d (root-commit)

Author: your_name <your_email@example.com>

Date: Tue Nov 19 16:23:05 2024 +0800

添加了test.txt文件

git log还有一些常用参数,如-p用于显示每次提交的详细差异;--oneline以简洁的单行形式显示提交历史,只包含提交哈希值和提交信息;--graph以图形化方式展示分支和合并历史,便于直观地了解项目的开发脉络。例如,使用git log --oneline查看提交历史:

 

git log --oneline

输出:

 

7c8a7e4 修改了test.txt文件,添加了新内容

596d8c2 添加了test.txt文件

这样可以更简洁地查看提交历史,快速了解项目的变更情况。

五、综合示例:完整的版本控制流程

5.1 项目初始化

假设我们要开始一个名为my_project的新 Python 项目,首先在本地创建一个新目录:

 

mkdir my_project

cd my_project

然后使用git init初始化 Git 仓库:

 

git init

此时,我们的项目目录下会生成一个隐藏的.git目录,这标志着我们的项目已经可以进行版本控制了。

5.2 文件添加与修改

接下来,我们在项目中创建一个 Python 文件main.py,并写入一些简单的代码:

 

print("Hello, Git!")

使用git add命令将main.py文件添加到暂存区:

 

git add main.py

再使用git commit命令提交修改,添加有意义的提交信息:

 

git commit -m "初始化项目,添加了main.py文件"

此时,我们的第一次提交已经完成,代码的初始状态被记录在版本库中。

如果我们后续对main.py文件进行修改,比如添加一行代码:

 

print("Hello, Git!")

print("This is a modified version.")

修改后,再次使用git add和git commit命令来记录这次修改:

 

git add main.py

git commit -m "修改了main.py文件,添加了新的打印信息"

5.3 模拟开发过程中的变更

在实际开发中,我们会不断地对代码进行修改。假设我们又对main.py进行了如下修改,添加一个函数:

 

def greet():

print("Welcome to my project!")

print("Hello, Git!")

print("This is a modified version.")

greet()

这次我们先使用git status查看文件状态,确认main.py文件已被修改:

 

git status

然后使用git add将修改添加到暂存区,这里我们也可以使用git add.来添加当前目录下的所有修改:

 

git add main.py

最后使用git commit提交修改,并详细描述提交信息:

 

git commit -m "在main.py中添加了greet函数,用于打印欢迎信息"

通过这样的操作,我们可以清晰地记录每次代码变更,方便后续的版本管理和回溯。

六、总结与拓展

6.1 命令回顾

  • git init:用于初始化一个新的 Git 仓库,在指定目录下创建一个隐藏的.git目录,标志着项目可以开始进行版本控制。它是使用 Git 进行版本管理的第一步,为后续的操作奠定基础。
  • git add:将工作区的文件添加到暂存区,是连接工作区和版本库的桥梁。通过git add,我们可以选择将哪些修改纳入到下一次的提交中,它支持多种参数,如git add.添加当前目录下所有文件,git add -u只添加已跟踪文件的修改,git add -A添加所有变化(包括新建、修改和删除的文件) 。
  • git commit:将暂存区的文件提交到本地仓库,记录代码的变更。每次提交都需要添加有意义的提交信息,通过-m参数指定,例如git commit -m "修复了登录页面的样式问题"。git commit还有一些常用参数,如-a可以跳过git add步骤,直接提交已跟踪文件的修改;--amend用于修改最近一次的提交 。

6.2 学习建议

学习 Git 最好的方法就是实践,建议读者在实际项目中不断运用这些命令,加深理解和记忆。可以尝试创建一些小型项目,模拟不同的开发场景,如多人协作、分支管理等,通过实际操作来熟悉 Git 的工作流程和命令使用。同时,遇到问题时不要害怕,多查阅官方文档和相关资料,积极寻求解决方案,这也是学习和成长的过程。

6.3 后续学习方向

掌握了init、add和commit这三个基础命令后,还有很多 Git 的强大功能等待你去探索,比如分支管理(git branch、git checkout等)、远程仓库操作(git remote、git push、git pull等)、冲突解决、变基操作等。这些高级功能将进一步提升你在团队开发中的效率和协作能力,希望读者能够继续深入学习,成为 Git 使用的高手 。

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

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

相关文章

1-kafka服务端之延时操作前传--时间轮

文章目录 背景时间轮层级时间轮时间轮降级kafka中的时间轮kafka如何进行时间轮运行 背景 Kafka中存在大量的延时操作&#xff0c;比如延时生产、延时拉取和延时删除等。Kafka并没有使用JDK自带的Timer或DelayQueue来实现延时的功能&#xff0c;而是基于时间轮的概念自定义实现…

从零开始:OpenCV 图像处理快速入门教程

文章大纲 第1章 OpenCV 概述 1.1 OpenCV的模块与功能  1.2 OpenCV的发展 1.3 OpenCV的应用 第2章 基本数据类型 2.1 cv::Vec类 2.2 cv&#xff1a;&#xff1a;Point类 2.3 cv&#xff1a;&#xff1a;Rng类 2.4 cv&#xff1a;&#xff1a;Size类 2.5 cv&#xff1a;&…

网络工程师 (22)网络协议

前言 网络协议是计算机网络中进行数据交换而建立的规则、标准或约定的集合&#xff0c;它规定了通信时信息必须采用的格式和这些格式的意义。 一、基本要素 语法&#xff1a;规定信息格式&#xff0c;包括数据及控制信息的格式、编码及信号电平等。这是协议的基础&#xff0c;确…

算法与数据结构(括号匹配问题)

思路 从题干可以看出&#xff0c;只要给出的括号对应关系正确&#xff0c;那么就可以返回true,否则返回false。这个题可以使用栈来解决 解题过程 首先从第一个字符开始遍历&#xff0c;如果是括号的左边&#xff08;‘&#xff08;‘&#xff0c;’[‘&#xff0c;’}‘&…

kaggle比赛入门 - Spaceship Titanic (第一部分)

1. 导入packages import numpy as np import pandas as pd import matplotlib.pyplot as plt %matplotlib inline import seaborn as sns sns.set(styledarkgrid, font_scale1.4) from imblearn.over_sampling import SMOTE import itertools import warnings warnings.filter…

java基础2(黑马)

一、变量里的数据在计算机中的存储原理 1.二进制 .二进制&#xff1a;只有0、1&#xff0c; 按照逢二进一的方式表示数据。 十进制数字11转换为&#xff1a;1011 方法&#xff1a;除二取余法 计算机中表示数据的最小单元&#xff0c;一个字节&#xff08;Byte&#xff0c;简…

AlwaysOn 可用性组副本所在服务器以及该副本上数据库的各项状态信息

目录标题 语句代码解释&#xff1a;1. sys.dm_hadr_database_replica_states 视图字段详细解释及官网链接官网链接字段解释 2. sys.availability_replicas 视图字段详细解释及官网链接官网链接字段解释 查看视图的创建语句方法一&#xff1a;使用 SQL Server Management Studio…

GPU-Z重磅更新,Blackwell架构全面支持

由TechPowerUp倾力打造的GPU-Z&#xff0c;是一款集显卡信息查看、实时监控与深度诊断于一体的强大工具。它以其轻巧灵便的体积、完全免费的使用模式以及极其友好的操作界面&#xff0c;赢得了全球无数用户的青睐与信任&#xff0c;成为PC硬件领域中不可或缺的软件。 GPU-Z不仅…

程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<6>

大家好啊&#xff0c;我是小象٩(๑ω๑)۶ 我的博客&#xff1a;Xiao Xiangζั͡ޓއއ 很高兴见到大家&#xff0c;希望能够和大家一起交流学习&#xff0c;共同进步。 今天我们继续来学习数组指针变量&#xff0c;二维数组传参的本质&#xff0c;函数指针变量&#xff0c;…

MySQL时间类型相关总结(DATETIME, TIMESTAMP, DATE, TIME, YEAR)

MySQL时间类型相关总结(DATETIME, TIMESTAMP, DATE, TIME, YEAR) MySQL官方文档&#xff1a; https://dev.mysql.com/doc/refman/8.0/en/date-and-time-types.html 一. 对比&#xff1a; 在 MySQL 中&#xff0c;处理时间相关的数据类型主要有以下几种&#xff1a;DATE、TIME、…

前缀和练习——洛谷P8218:求区间和

题目: 这道题很简单&#xff0c;直接根据题目无脑套公式 代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N 1e5 9; using ll long long; ll a[N], perfix[N]; int main() {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);//取消同步输…

【STM32】蓝牙模块数据包解析

使用到的蓝牙模块为DX-BT24&#xff0c;他可以将串口转蓝牙&#xff0c;实现与手机蓝牙的通信&#xff0c;本次实现使用手机蓝牙发送数据包来控制单片机LED的亮灭&#xff0c;规则如下&#xff1a; AA 05 01 FF AF 该数据包表示包头为AA&#xff0c;05表示该数据包的大小&#…

NSS-DAY2

Crypto [HNCTF 2022 Week1]A dictator 题目&#xff1a; from random import randint from secret import flagoffset randint(1,100) % 26 # print(offset)assert flag.startswith(NSSCTF{) assert all([ord(c) not in range(ord(A),ord(Z)) for c in flag[7:-1]])for cha…

【vue3 入门到实战】7. 标签中的 ref

目录 1. ref 的作用 2. 如何使用 1. ref 的作用 用于注册模板引用 用在普通DOM标签上&#xff0c;获取的是DOM节点。 用在组件标签上&#xff0c;获取的是组件的实例对象。 2. 如何使用 代码如下 <template><div class"app"><h2 ref"titl…

手写MVVM框架-实现简单的数据代理

MVVM框架最显著的特点就是虚拟dom和响应式的数据、我们以Vue为例&#xff0c;分别实现data、computed、created、methods以及虚拟dom。 这一章我们先实现简单的响应式&#xff0c;修改数据之后在控制台打印。 我们将该框架命名为MiniVue。 首先我们需要创建MiniVue的类(src/co…

spy-debugger + Charles 调试移动端/内嵌小程序H5

简介说明&#xff1a; PC端可以用F12进行console等进行调试&#xff0c;但移动端App中使用webview就无法进行实时调试&#xff0c;针对这种情况 1. 安装 全局安装 spy-debugger sudo npm install spy-debugger -g // window不用加sudo2. spy-debugger 证书 其实spy-debugg…

【目标检测】模型验证:K-Fold 交叉验证

K-Fold 交叉验证 1、引言1.1 K 折交叉验证概述 2、配置2.1 数据集2.2 安装包 3、 实战3.1 生成物体检测数据集的特征向量3.2 K 折数据集拆分3.3 保存记录3.4 使用 K 折数据分割训练YOLO 4、总结 1、引言 我们将利用YOLO 检测格式和关键的Python 库&#xff08;如 sklearn、pan…

Android studio ternimal 中gradle 指令失效(gradle环境变量未配置)

默认gradle路径&#xff1a;C:\Users\ylwj.gradle\wrapper\dists\gradle-8.10.2-bin\a04bxjujx95o3nb99gddekhwo\gradle-8.10.2\bin 环境变量-系统环境变量-双击path-配置上即可-注意重启studio才会生效

Axure大屏可视化动态交互设计:解锁数据魅力,引领决策新风尚

可视化组件/模板预览&#xff1a;https://8dge09.axshare.com 一、大屏可视化技术概览 在数据驱动决策的时代&#xff0c;大屏可视化技术凭借直观、动态的展示方式&#xff0c;已成为众多行业提升管理效率和优化决策过程的关键工具。它能够将复杂的数据转化为易于理解的图形和…

Resnet 改进:尝试在不同位置加入Transform模块

目录 1. TransformerBlock 2. resnet 3. 替换部分卷积层 4. 在特定位置插入Transformer模块 5. 使用Transformer全局特征提取器 6. 其他 Tips:融入模块后的网络经过测试,可以直接使用,设置好输入和输出的图片维度即可 1. TransformerBlock TransformerBlock是Transfo…