采用git进行项目管理

news/2025/11/15 18:58:38/文章来源:https://www.cnblogs.com/gccbuaa/p/19226055

提示:之前写代码的时候经常将目光集中在如何完成功能,实现性能,对整体项目代码的管理并不好。本文旨在学习如何从只会写脚本到可以写作完整的项目的实现过程。

文章目录

  • readme的结构
  • 一、git的基础概念
  • 二、git的基本操作
    • 初始化仓库
    • 检查文件的状态
    • 跟踪新文件
    • 提交更新
    • 暂存已修改的文件
    • 提交已暂存的文件
    • 跳过使用暂存区域
    • 移除文件
    • 忽略文件
    • 回退到指定的版本
  • 二、git管理开发多个分支
    • Git 多分支管理核心操作命令
    • 常见 Git 命令在当前分支下的作用范围
    • ⚠️ 重要注意事项
    • ​合并(git merge)时的“当前分支”是关键​
    • ​处理远程分支​
  • 总结


readme的结构

基本结构​:一个完整的README通常包含以下部分:

项目名称与描述​:开门见山地介绍项目是做什么的,有什么主要特点和目标。

​安装说明​:详细列出运行项目所需的依赖、环境配置以及具体的安装步骤。

使用指南​:通过命令示例、代码片段或截图,说明如何使用项目。如果项目有界面,可加入截图或GIF。

项目结构​(可选):对于复杂项目,说明主要文件和目录的用途。

如何贡献​:说明贡献代码的流程,如如何报告Bug、提交Pull Request的规范等。

许可证​:明确项目采用的许可证。

一、git的基础概念

使用 Git 管理的项目,拥有三个区域,分别是工作区、暂存区、Git 仓库

Git 中的三种状态
已修改 modified
表示修改了文件,但还没将修改的结果放到暂存区

已暂存 staged
表示对已修改文件的当前版本做了标记,使之包含在下次提交的列表中

已提交 committed
表示文件已经安全地保存在本地的 Git 仓库中

配置用户信息

git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
  • 如果使用了 --global 选项,那么该命令只需要运行一次,即可永久生效。

除了使用记事本查看全局的配置信息之外,还可以运行如下的终端命令,快速的查看 Git 的全局配置信息:

# 查看所有的全局配置项
git config --list --global
# 查看指定的全局配置项
git config user.name
git config user.email

二、git的基本操作

初始化仓库

创建一个文件夹demoProject,文件夹中建一个readme.md。

① 在项目目录中,通过鼠标右键打开“Git Bash”

② 执行 git init 命令将当前的目录转化为 Git 仓库

git init 命令会创建一个名为 .git 的隐藏目录,这个 .git 目录就是当前项目的 Git 仓库,里面包含了初始的必要文件,这些文件是 Git 仓库的必要组成部分

检查文件的状态

使用 git status 输出的状态

# 以精简的方式显示文件状态
git status -s
git status --short

未跟踪文件前面有红色的 ?? 标记

跟踪新文件

使用命令 git add 开始跟踪一个文件

git add readme.md
# 如果文件过多,你项跟踪目录下所有文件
git add *.*

此时再运行 git status 命令,会看到readme.md文件在 Changes to be committed 这行的下面,说明已被跟踪,并处于暂存状态

提交更新

现在暂存区中有一个readme.md文件等待被提交到 Git 仓库中进行保存。可以执行 git commit 命令进行提交,其中 -m 选项后面是本次的提交消息,用来对提交的内容做进一步的描述:

git commit -m "新建了readme.md文件"

目前,readme.md 文件已经被 Git 跟踪,并且工作区和 Git 仓库中的文件内容保持一致。当我们修改了工作区中readme.md的内容之后,再次运行 git status 和 git status -s 命令,文件readme.md出现在 Changes not staged for commit 这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。

  • 修改过的、没有放入暂存区的文件前面有红色的 M 标记。

暂存已修改的文件

目前,工作区中的readme.md文件已被修改,如果要暂存这次修改,需要再次运行 git add 命令,这个命令是个多功能的命令,主要有如下 3 个功效:

① 可以用它开始跟踪新文件

② 把已跟踪的、且已修改的文件放到暂存区

③ 把有冲突的文件标记为已解决状态

提交已暂存的文件

再次运行 git commit -m “提交消息” 命令,即可将暂存区中记录的 index.html 的快照,提交到 Git 仓库中进行保存:

取消暂存的文件
如果需要从暂存区中移除对应的文件,可以使用如下的命令:

git reset HEAD 要移出的文件名称

跳过使用暂存区域

Git 标准的工作流程是工作区 → 暂存区 → Git 仓库,但有时候这么做略显繁琐,此时可以跳过暂存区,直接将工作区中的修改提交到 Git 仓库,这时候 Git 工作的流程简化为了工作区 → Git 仓库

Git 提供了一个跳过使用暂存区域的方式, 只要在提交的时候,给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤:

git commit -a -m "日志信息"

移除文件

从 Git 仓库中移除文件的方式有两种:

① 从 Git 仓库和工作区中同时移除对应的文件

② 只从 Git 仓库中移除指定的文件,但保留工作区中对应的文件

# 从 Git仓库和工作区中同时移除 index.js 文件
git rm -f index.js
# 只从 Git 仓库中移除 index.css,但保留工作区中的 index.css 文件
git rm --cached index.css

忽略文件

一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 在这种情况下,我们可以创建一个名为 .gitignore 的配置文件,列出要忽略的文件的匹配模式。

文件 .gitignore 的格式规范如下:

① 以 # 开头的是注释

② 以 / 结尾的是目录

③ 以 / 开头防止递归

④ 以 ! 开头表示取反

⑤ 可以使用 glob 模式进行文件和文件夹的匹配(glob 指简化了的正则表达式)

星号 * 匹配零个或多个任意字符
[abc] 匹配任何一个列在方括号中的字符 (此案例匹配一个 a 或匹配一个 b 或匹配一个 c)
问号 ? 只匹配一个任意字符
两个星号 ** 表示匹配任意中间目录(比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等)
在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)

回退到指定的版本

# 在一行上展示所有的提交历史
git log --pretty=oneline
# 使用 git reset --hard 命令,根据指定的提交 ID 回退到指定版本
git reset --hard <CommitID># 在旧版本中使用 git reflog --pretty=oneline 命令,查看命令操作的历史git reflog --pretty=onelone# 再次根据最新的提交 ID,跳转到最新的版本git reset --hard <CommitID>

二、git管理开发多个分支

Git 多分支管理核心操作命令

下表总结了 Git 多分支管理中最常用的操作命令及其功能说明:

操作目的常用命令详细说明
查看分支列表git branchgit branch -v显示所有本地分支,当前分支前有 * 标记。-v 选项可查看各分支的最后一次提交信息。
创建新分支git branch <新分支名>基于当前所在的提交位置创建一个新的分支。
切换分支git checkout <分支名>切换到指定的已存在分支。
创建并切换分支git checkout -b <新分支名>创建新分支并立即切换到该分支,这是常用组合命令。
合并分支git merge <要合并的分支名>注意:需要先切换到目标分支(如主分支),再执行此命令将特性分支合并进来。
删除分支git branch -d <分支名>删除已合并完成的分支。如分支未合并但确定要删除,可使用 -D 选项强制删除。
推送到远程分支git push origin <分支名>将本地分支推送到远程仓库,便于团队协作开发。
拉取远程分支git checkout -b <本地分支名> origin/<远程分支名>在本地创建并切换到与远程分支关联的新分支。

处理合并冲突​:当两个分支对同一文件的同一部分进行了不同修改,合并时会发生冲突。Git会提示,你需要手动编辑标记了<<<<<<<, =======, >>>>>>>的文件来解决冲突,然后执行 git add和 git commit完成合并

比较分支间的差异
在合并或部署前,比较分支差异至关重要。

​基础比较命令​:使用 git diff命令。
​比较两个分支的所有差异​:
git diff branch1 branch2
​仅查看有差异的文件列表​(更简洁):
git diff branch1 branch2 --stat
​比较特定文件的差异​:
git diff branch1 branch2 -- <文件路径>​比较特定提交或文件清单​:可以指定两个分支上的特定提交版本(commit ID)进行比较。git log --oneline可以帮助你找到提交ID。

​使用图形化工具(如IntelliJ IDEA)​​:很多集成开发环境(IDE)提供了更直观的分支比较功能。通常可以在版本控制(VCS)菜单中找到类似 “Compare with Branch” 的选项,以可视化方式查看代码差异。

常见 Git 命令在当前分支下的作用范围

理解命令的作用范围对于高效管理多分支至关重要。下表详细说明了各命令的影响范围:

命令主要作用对象详细说明
git add, git commit仅影响当前分支将文件的修改记录到当前分支的提交历史中,不影响其他分支。
git status, git log仅显示当前分支信息显示当前分支的工作区状态和提交历史记录。
git merge <其他分支>⚠️ 影响当前分支(接收变更方)将指定分支的更改整合到当前分支。当前分支是合并操作的目标分支。
git branch -d <分支名> 仓库全局操作(删除指定分支)删除指定的分支对象本身,与当前分支无关(不能删除当前所在分支)。
git checkout/switch 仓库全局操作(切换HEAD指针)切换HEAD指针指向,改变当前分支的身份标识。
git push origin <分支名> 推送指定分支指定的本地分支推送到远程仓库,与当前处于哪个分支无关。

要更好地掌握这一点,了解其背后的工作原理会很有帮助。

​核心是HEAD指针​:Git 中有一个特殊的名为 ​HEAD​ 的指针,它指向你当前所在的分支(也就是“当前分支”)。
当你执行 git commit等操作时,Git 实际上是将新的提交记录添加到 HEAD 所指向的分支上,并让该分支指针向前移动。
因此,HEAD 决定了你的工作现场。

分支的本质是提交记录的指针​:每个分支本身就是一个指向特定提交历史的指针。创建新分支只是创建一个新的指针,开销极小
。这使得 Git 的分支管理非常高效。

切换分支会改变工作目录​:当你使用 git checkout <分支名>或 git switch <分支名>切换分支时,Git 会做两件重要的事:

  • 将 HEAD 指针指向目标分支。
  • 将你的工作目录中的文件替换成目标分支最新版本的文件快照。

这就是为什么在不同分支间切换时,你看到的文件内容会发生变化。

⚠️ 重要注意事项

未提交的更改会“跟随”当前分支(的切换)吗?​​

不会。如果你在工作区修改了文件但还没有执行 git commit提交,这些修改不属于任何分支,它们只是工作目录中的改动。当你切换分支时,Git 会尝试将这些改动“带”过去
。如果这些改动与目标分支的文件不冲突,你可以继续在其他分支上提交它们。但如果产生冲突,Git 会禁止切换,要求你先处理这些修改(例如提交或临时保存)。

​合并(git merge)时的“当前分支”是关键​

执行 git merge <某分支>时,​当前分支是被合并的、接收变更的目标分支,而 <某分支>是被合并的、提供变更的源分支​
。务必确保你当前位于正确的分支上(如用于发布版本的 main分支)再执行合并操作,否则可能会把代码合并到错误的地方。

​处理远程分支​

当使用 git push origin <本地分支名>或 git push origin <本地分支名>:<远程分支名>时,命令操作的是你指定的那个分支,与当前处于哪个分支无关。但常用的 git push(不带参数)通常会尝试将当前分支推送到与之关联的远程分支。

总结

总而言之,在 Git 多分支开发中,请时刻留意你当前所在的分支​(可通过 git branch命令查看,当前分支前有 *号标记)。你的大部分提交和工作都是在当前分支上进行的,这就像是你在一个独立的开发线上工作,从而实现了不同任务之间的隔离。

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

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

相关文章

Golang游戏开发笔记:地图索引系统实现

好家伙, 在游戏开发,尤其是后端服务的构建过程中,我们常常从一个简单的想法或原型开始。 代码直接、功能明确,一切看起来都很好。但随着项目复杂度的提升,最初的“简洁”设计往往会变成“僵化”的枷锁。0.需求分析…

20251115

依旧平凡的日常生活

网络爬虫:简单静/动态网页

爬虫实验*2 反思总结爬虫实验 实验一:静态网页 what to show? 实验一总流程 第一步:终端下载爬虫三件套第二步:创建文件。因为已经下载了vscode,这里用code进入,python运行。猜猜爬的是什么?第三步:爬虫中impo…

20232307 2024-2025-1 《网络与系统攻防技术》实验五实验报告

20232307 2024-2025-1 《网络与系统攻防技术》实验五实验报告 1. 实验内容 本周学习内容: 信息搜集:通过各种方式获取目标主机或网络的信息,属于攻击前的准备阶段 网络踩点:Google Hacking技术、Web信息搜集与挖掘…

EXECUTE IMMEDIATE语句分析

在 Oracle 的 PL/SQL 环境中,EXECUTE IMMEDIATE 通常需要包裹在 BEGIN...END 块中执行,因为它是 PL/SQL 的语法元素,不能直接在 SQL 命令行中单独执行(除非使用特定工具的简化模式)。 具体说明:在 PL/SQL 程序中…

产品更新与重构策略:创新与稳定的平衡之道 - 详解

产品更新与重构策略:创新与稳定的平衡之道 - 详解2025-11-15 18:47 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displ…

MySQL MVCC实现原理

一、概述 1.1 MVCC的定义与价值 MVCC(Multi-Version Concurrency Control)是一种非锁定式并发控制技术,其核心目标是解决读写操作的相互阻塞问题。传统锁机制中,读操作加共享锁、写操作加排他锁,导致读写互斥;而…

算法第三次作业

算法第三次作业 1、按照动态规划法的求解步骤分析作业题目“数字三角形”: 1.1 根据最优子结构性质,列出递归方程式,说明方程式的定义、边界条件 a.递归方程式:c[j]=a[i][j]+max(c[j],c[j+1]) b.方程式的定义:数字…

完整教程:《简易制作 Linux Shell:详细分析原理、设计与实践》

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

计算机网络5 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年境外商务出差保险哪里有卖:TOP10平台专业解析

2025年境外商务出差保险哪里有卖:TOP10平台专业解析在当今全球化的商业环境中,境外商务出差已成为众多企业和商务人士的常态。然而,对于有境外商务出差需求的人来说,面临着诸多难题。“选品难(产品繁杂无从下手)…

2025年开除申诉靠谱机构推荐:专业学术申诉机构评测指南!

2025年开除申诉靠谱机构推荐:专业学术申诉机构评测指南!留学途中遭遇学术紧急情况?面临开除、停学或学术不端听证会,一家靠谱的申诉支持机构至关重要。本文基于教育部涉外监管认证信息、机构服务响应速度、申诉成功…

Day39(9)F:\硕士阶段\Java\课程代码\后端\web-ai-code\web-ai-project01\jdbc-demo+springboot-web-quickstart

DQL条件查询-- =================== DQL: 条件查询 ====================== -- 1. 查询 姓名 为 柴进 的员工 select * from emp where name = 柴进;-- 2. 查询 薪资小于等于5000 的员工信息 select * from emp where…

# Android Compose 实现 左滑删除

Android Compose 实现 左滑删除Android Compose 实现 左滑删除 直接看源码 private enum class CardState {Collapsed /* 收缩 */, Expanded /* 展开的 */ // 哈哈哈,还能学点英文 (: } @Composable private fun Pers…

win10pro sn

win10pro snVK7JG-NPHTM-C97JM-9MPGT-3V66T

完整教程:PMBT2222A,215 开关晶体管功率二极管 NXP安世半导体 音频放大电路 LED驱动 应用

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

用递归的方式输出各位数字

include <stdio.h> include <stdlib.h> void f(int n){ if(n<10){ printf("%d ",n); return; }//输出到最后一位 else{int r=0;int x=n;int k=0;//n是k位数while(x!=0){r=x%10;x=x/10;k++;}i…

WebServer类 - 指南

WebServer类 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "C…

EFCore中巧妙利用ToQueryString()实现批插(不借助第三方包)

dotnet10发布了,ef10也快发布了,但是还是只有批量更新(ExecuteUpdateAsync)和批量删除(ExecuteDeleteAsync)功能,没有批量插入。 今天给个办法,在不引用第三方库的情况下,巧妙利用ToQueryString()实现批插。 …

2025 年 11 月门窗十大品牌综合实力权威推荐榜单,产能、专利、环保三维数据透视

引言 2025 年 10 月门窗十大品牌综合实力权威推荐榜单由中国建筑金属结构协会、全国工商联家具装饰业商会联合发布。本次榜单突破传统单一性能评选模式,以《铝合金门窗》(GB/T 8478-2008)为技术底版,创新性构建 “…