Git常用命令总结

Git

Git 是一个强大的分布式版本控制系统,适用于代码管理和团队协作。大家日常都会使用到Git,常用的IDE工具都已经集成了一些常用的命令,导致常用的Git命令记不住,这里总结了一些常用命令,未来会持续更新。

Git 的工作流程围绕四个主要区域展开:工作区、暂存区、本地仓库和远程仓库

  1. 工作区(Working Directory)进行代码编辑的地方,可以添加新文件、修改现有文件或删除文件。
  2. 暂存区(Staging Area/Index)暂存区是一个临时存储区域,用于存放下次提交的快照。执行git add命令时,将工作区中的更改添加到暂存区。
  3. 本地仓库(Local Repository)本地仓库是项目的历史记录,包含了所有已提交的更改。执行git commit命令时,Git 会将暂存区中的内容创建一个新的提交,并将其保存到本地仓库。
  4. 远程仓库(Remote Repository)远程仓库是托管在互联网上或网络中的仓库,通常用于团队协作。

基础命令操作

命令中加入--global就是全局操作,需要在对应项目的目录下执行git相关命令操作

配置Git信息

全局配置使用者信息,用于提交工作时,展示个人信息

git config --global user.name "ideal"
git config --global user.email "example@ideal.com"
初始化仓库(这个可能用到的情况比较少)
git init
克隆远程仓库

克隆分为两种HTTPSSSH克隆,这里的主要区别是

方式认证方式适用场景优势劣势
HTTPS使用用户名 + 密码适用于临时访问或不想配置 SSH 密钥的情况易用,无需额外配置 SSH 密钥每次操作可能需要输入凭据,或依赖 Git 凭据管理器
SSH通过 SSH 密钥进行认证适用于长期开发和高安全性需求免密码推拉代码,安全性更高需要配置 SSH 密钥
## 生成密钥
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
git clone https://github.com/coding-w/git-test.git
git clone git@github.com:coding-w/git-test.git
查看当前状态
wx@wxdeMacBook-Pro git-test % git statusOn branch main
Your branch is up to date with 'origin/main'.Changes to be committed:(use "git restore --staged <file>..." to unstage)new file:   a.txtChanges 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:   .gitignoremodified:   a.txt
添加文件到暂存区

暂存区是一个临时的区域,用于保存你对文件的更改,可以将它理解为一个“准备提交”的区域

# 添加一个指定文件至暂存区
git add 文件名
# 添加所有修改文件至暂存区
git add .
# 取消文件加入暂存区
git restore --staged 文件名
提交更改
git commit -m "提交说明"

这里需要补充说明的是,提交说明要按照规范去写,常见规则有

类型类别说明
featProduction新增功能
fixProductionBug 修复
prefProduction提高代码性能的变更
styleDevelopment用于修改代码的样式,例如调整缩进、空格、空行等
refactorProduction用于重构代码,例如修改代码结构、变量名、函数名等但不修改功能逻辑
testDevelopment用于修改测试用例,例如添加、删除、修改代码的测试用例等
ciDevelopment用于修改持续集成流程,例如修改 Travis、Jenkins 等工作流配置
docsDevelopment用于修改文档,例如修改 README 文件、API 文档等
choreDevelopment用于对非业务性代码进行修改,例如修改构建流程或者工具配置等
buildDevelopment用于修改项目构建系统,例如修改依赖库、外部接口等

常见的写法是:git commit -m "类型: 提交说明",例如:git commit -m "feat: 完成了**需求"git commit -m "fix: 修复了**BUG"。具体提交规则,参照公司开发规范

已提交,但是未推送,需要取消提交

  1. git reset --soft HEAD~1软重置,只是撤销最后一次提交并保留在暂存区
  2. git reset --mixed HEAD~1混合重置,撤销最后一次提交并将暂存区的文件一通撤销至工作区
  3. git reset --hard HEAD~1硬重置,撤销最后一次提交的所有内容,慎用

已提交,已推送,需要修改提交信息

## 修改最近一次提交信息
git commit --amend -m "..."
## 推送修改后的提交
### --force-with-lease:比 --force 更安全,只有本地分支与远程分支匹配时才会强制推送,避免覆盖他人的提交
### --force:直接覆盖远程提交,不推荐用于多人协作的分支。
git push origin main --force-with-lease
查看操作历史
git log
## 简洁日志
git log --oneline --graph --decorate --all
拉取和推送分支
## 推送并设置推送到那一个分支
git push -u origin <branch_name>
## 直接推送
git push## 拉取远程某一分支
git pull origin branch_name

分支相关操作

Git 分支管理是版本控制系统中非常重要的一个方面,它允许开发者在不同的分支上独立工作

查看分支
## 查看本地分支,当前分支有星号(*)
git branch## 查看所有分支,包括远程分支
git branch -a## 查看远程分支所有信息
git fetch --all
创建分支
## 在当前提交的基础上创建一个新分支
git branch branch_name
## 创建并切换到新分支
git checkout -b branch_name## 重命名分支
git branch -m new_branch_name## 查看分支详细信息
git branch -vv

在实际开发中,创建项目新分支,一般是在代码托管平台上操作

分支命名也需要规范,实际遵循公司规定

分支类型命名格式示例描述
主分支main / master主分支,线上稳定版
功能分支feature/feature-namefeature/user-authentication用于新功能开发
修复分支bugfix/bug-namebugfix/login-error用于修复问题
发布分支release/version-numberrelease/v1.2.0用于版本发布
热修复分支hotfix/hotfix-namehotfix/critical-security-patch用于紧急修复生产环境问题
测试分支test/test-nametest/integration-tests用于专门的测试工作
切换分支
## 切换分支
git checkout branch_name
git switch branch_name## 在本地创建分支并拉取远程分支
git checkout -b 本地分支名 origin/远程分支名
合并分支
## 切换到主分支,将 branch_name 合并至主分支
git merge branch_name
## 如有冲突,手动解决冲突
todo ....## 使用其他命令合并
git rebase branch_name

git mergegit rebase都是Git中用于整合不同分支更改的命令,但它们的工作方式和产生的结果有所不同

Git Merge

将两个分支的更改合并成一个新的合并提交(merge commit),并且保留两者的历史。

合并的结果是创建一个新的提交,该提交有两个父提交,即原本分支的最后一个提交和目标分支的最后一个提交。

Git Rebase

会将当前分支上的提交 “移动” 到目标分支的最前面,即将当前分支的每个提交“重放”在目标分支的最新提交上

会改变分支的历史记录,因此它看起来像是当前分支的所有提交是在目标分支的基础上做的

主要区别
特点MergeRebase
历史记录保留了两个分支的历史,合并后会生成一个合并提交会修改提交历史,将当前分支的提交“重放”到目标分支的前面
提交图会生成合并提交,历史呈现出分支结构历史呈现出线性结构,没有合并提交
操作后结果生成新的合并提交,并保留每个分支的历史将当前分支的提交合并到目标分支的前面,结果看起来是从目标分支开始的
适用场景团队协作,需要保留所有分支的提交记录个人分支或者希望清理提交历史,避免合并提交
对公共分支的影响没有改变历史,适合团队合作改变历史,不推荐在公共分支上使用
什么时候使用merge,什么时候使用 rebase?

merge: 当希望保留分支的历史,尤其是多人协作时,merge 是更好的选择。
rebase: 当需要让历史保持线性,或者在个人分支上工作时,rebase 会让提交历史更简洁。

删除分支
## 删除本地分支
git branch -d branch_name
## 强制删除本地分支
git branch -D branch_name
## 删除远程分支
git push origin --delete branch_name
查看分支差异
## 查看两个分支之间的差异
git diff branch_name_a branch_name_b
## 查看分支日志差异
git log branch_name_a branch_name_b

版本回滚

仅回滚本地代码(不影响历史)

如果只是想让本地代码回到某个版本,但不改变提交历史,可以使用git checkoutgit reset --hard

临时回滚(不影响提交历史)
git checkout <目标版本号>

让工作目录切换到目标版本,但不会修改分支指向。适用于查看历史版本,但不修改当前分支状态。

回滚到指定版本并修改本地提交历史
## 本地回滚但保留代码
git reset --soft <目标版本号>

回滚到<目标版本号>,但 保留代码和暂存区的内容,仅撤销后续的提交记录。适用于想撤销提交但保留文件修改,可以重新提交

## 本地回滚并清除暂存区
git reset --mixed <目标版本号>

撤销提交,但代码仍然保留在工作区(未 add 但代码还在)。 适用于希望回滚提交,并重新add需要的文件

## 彻底回滚(删除提交)
git reset --hard <目标版本号>

完全回滚,让代码、暂存区、提交历史全部恢复到**<目标版本号>**,后续提交会被删除。适用于彻底恢复到某个版本,不想保留后续的更改

回滚远程仓库(谨慎操作)
git reset --hard <目标版本号>
## --force 会覆盖远程历史,可能导致团队成员的代码不同步,慎用!
git push origin --force
## 推荐使用 --force-with-lease,以避免意外覆盖其他人的提交:
git push origin --force-with-lease## 不会删除历史,而是创建一个新的提交来撤销目标版本之后的更改
git revert <目标版本号>

其他

统计特定时间范围内的提交次数
git log --since="2025-01-01" --until="2025-03-01" --pretty=oneline | wc -l

--since="2025-01-01":指定开始时间。
--until="2025-02-01":指定结束时间。
--pretty=oneline:将每个提交显示为一行。
wc -l:统计提交的行数(即提交的次数)。

统计特定时间范围内的新增或删除的代码行数
git log --since="2025-01-01" --until="2025-03-01" --numstat
统计不同类别的提交次数
git log --since="2025-01-01" --until="2025-03-01" --pretty=format:"%s" | grep -E "^(feat|fix|docs|chore|style|refactor|test)" | sort | uniq -c

--pretty=format:"%s":只输出提交的标题(即提交信息)。
grep -E "^(feat|fix|docs|chore|style|refactor|test)":通过正则表达式筛选出特定类别的提交(根据常见规范,这里列出了feat, fix, docs等,可以根据需要添加更多类别)。
sort:对提交类别进行排序。
uniq -c:统计每种类别出现的次数。

按类别统计并显示每种类别的提交次数
git log --since="2025-01-01" --until="2025-03-01" --pretty=format:"%s" | \grep -Eo "^(feat|fix|docs|chore|style|refactor|test)" | \sort | \uniq -c | \sort -nr

grep -Eo "^(feat|fix|docs|chore|style|refactor|test)":只提取符合条件的类别标签。
sort -nr:按降序排序,最频繁的类别会排在前面

上述,是在开发中遇到的会用到一些命令,Git是一个强大的版本控制工具,命令很多,也有很复杂的,需要多积累,此篇文章会持续更新。如有不足,多加指点~~

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

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

相关文章

kafka服务端之副本

文章目录 概述副本剖析失效副本ISR的伸缩LWLEO与HW的关联LeaderEpoch的介入数据丢失的问题数据不一致问题Leader Epoch数据丢失数据不一致 kafka为何不支持读写分离 日志同步机制可靠性分析 概述 Kafka中采用了多副本的机制&#xff0c;这是大多数分布式系统中惯用的手法&…

[笔记] 汇编杂记(持续更新)

文章目录 前言举例解释函数的序言函数的调用栈数据的传递 总结 前言 举例解释 // Type your code here, or load an example. int square(int num) {return num * num; }int sub(int num1, int num2) {return num1 - num2; }int add(int num1, int num2) {return num1 num2;…

mysql8.0使用MHA实现高可用

一、环境配置 本实验环境共有四个节点&#xff0c; 其角色分配如下&#xff08;实验机器均为centos 7.x &#xff09; 机器名称IP配置服务角色备注manager192.168.8.145manager控制器用于监控管理master192.168.8.143数据库主服务器开启bin-log relay-log 关闭relay_logslave…

<论文>DeepSeek-R1:通过强化学习激励大语言模型的推理能力(深度思考)

一、摘要 本文跟大家来一起阅读DeepSeek团队发表于2025年1月的一篇论文《DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning | Papers With Code》&#xff0c;新鲜的DeepSeek-R1推理模型&#xff0c;作者规模属实庞大。如果你正在使用Deep…

【Android开发AI实战】选择目标跟踪基于opencv实现——运动跟踪

文章目录 【Android 开发 AI 实战】选择目标跟踪基于 opencv 实现 —— 运动跟踪一、引言二、Android 开发与 AI 的融合趋势三、OpenCV 简介四、运动跟踪原理&#xff08;一&#xff09;光流法&#xff08;二&#xff09;卡尔曼滤波&#xff08;三&#xff09;粒子滤波 五、基于…

第1章 特征工程

原文&#xff1a;第1章 特征工程 俗话说&#xff0c;“巧妇难为无米之炊”。在机器学习中&#xff0c;数据和特征便是“米”&#xff0c;模型和算法则是“巧妇”。没有充足的数据、合适的特征&#xff0c;再强大的模型结构也无法得到满意的输出。正如一句业界经典的话所说&…

idea 如何使用deepseek 保姆级教程

1.安装idea插件codegpt 2.注册deepseek并生成apikey deepseek 开发平台&#xff1a; DeepSeek​​​​​​​ 3.在idea进行codegpt配置 打开idea的File->Settings->Tools->CodeGPT->Providers->Custom OpenAI Chat Completions的URL填写 https://api.deepseek…

多光谱成像技术在华为Mate70系列的应用

华为Mate70系列搭载了光谱技术的产物——红枫原色摄像头&#xff0c;这是一款150万像素的多光谱摄像头。 相较于普通摄像头&#xff0c;它具有以下优势&#xff1a; 色彩还原度高&#xff1a;色彩还原准确度提升约 120%&#xff0c;能捕捉更多光谱信息&#xff0c;使拍摄照片色…

10vue3实战-----实现登录的基本功能

10vue3实战-----实现登录的基本功能 1.基本页面的搭建2.账号登录的验证规则配置3.点击登录按钮4.表单的校验5.账号的登录逻辑和登录状态保存6.定义IAccount对象类型 1.基本页面的搭建 大概需要搭建成这样子的页面: 具体的搭建界面就不多讲。各个项目都有自己的登录界面&#…

vue学习5

1.自定义创建项目 2.ESlint代码规范 正规的团队需要统一的编码风格 JavaScript Standard Style 规范说明&#xff1a;https://standardjs.com/rules-zhcn.html 规则中的一部分&#xff1a; (1)字符串使用单引号 ‘aabc’ (2)无分号 const name ‘zs’ (3)关键字后加空格 if(n…

QTreeView和QTableView单元格添加超链接

QTreeView和QTableView单元格添加超链接的方法类似,本文仅以QTreeView为例。 在QTableView仿Excel表头排序和筛选中已经实现了超链接的添加,但是需要借助delegate,这里介绍一种更简单的方式,无需借助delegate。 一.效果 二.实现 QHTreeView.h #ifndef QHTREEVIEW_H #def…

Qt监控设备离线检测/实时监测设备上下线/显示不同的状态图标/海康大华宇视华为监控系统

一、前言说明 监控系统中一般有很多设备&#xff0c;有些用户希望知道每个设备是否已经上线&#xff0c;最好有不同的状态图标提示&#xff0c;海康的做法是对设备节点的图标和颜色变暗处理&#xff0c;离线的话就变暗&#xff0c;有可能是加了透明度&#xff0c;而大华的处理…

IDEA+DeepSeek让Java开发起飞

1.获取DeepSeek秘钥 登录DeepSeek官网 : https://www.deepseek.com/ 进入API开放平台&#xff0c;第一次需要注册一个账号 进去之后需要创建一个API KEY&#xff0c;然后把APIkey记录保存下来 接着我们获取DeepSeek的API对话接口地址&#xff0c;点击左边的&#xff1a;接口…

docker学习笔记

1.docker与虚拟机技术的不同 传统虚拟机&#xff1a;虚拟出一条硬件&#xff0c;运行一个完整的操作系统&#xff0c;然后在这个系统上安装和运行软件。容器内的应用直接运行在&#xff0c;宿主机的内容&#xff0c;容器是没有自己的内核的&#xff0c;也没有虚拟我们的硬件每…

Linux之kernel(4)netlink通信

Linux内核(04)之netlink通信 Author: Once Day Date: 2023年1月3日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可查看专栏: Linux内核知识_Once-Day的博客-…

视觉硬件选型和算法选择(CNN)

基础知识 什么是机械视觉: 机械视觉是一种利用机器代替人眼来进行测量和判断的技术&#xff0c;通过光学系统、图像传感器等设备获取图像&#xff0c;并运用图像处理和分析算法来提取信息&#xff0c;以实现对目标物体的识别、检测、测量和定位等功能。 机械视觉与人类视觉有什…

Qt元对象系统

目录 1.元对象系统概述 2 宏QOBJECT slots emit 2.1 QOBJECT 2.2 信号槽相关宏 3 信号和槽 3.1 信号和槽的链接使用 3.2 信号槽触发流程 3.3 信号参数自定义 3.4 槽函数中获取发射信号的对象&#xff08;widget&#xff09; 3.4.1 使用QObject::sender() 3.4.2 在连…

verilog练习:i2c slave 模块设计

文章目录 前言1. 结构2.代码2.1 iic_slave.v2.2 sync.v2.3 wr_fsm.v2.3.1 状态机状态解释 2.4 ram.v 3. 波形展示4. 建议5. 资料总结 前言 首先就不啰嗦iic协议了&#xff0c;网上有不少资料都是叙述此协议的。 下面将是我本次设计的一些局部设计汇总&#xff0c;如果对读者有…

什么是中间件中间件有哪些

什么是中间件&#xff1f; 中间件&#xff08;Middleware&#xff09;是指在客户端和服务器之间的一层软件组件&#xff0c;用于处理请求和响应的过程。 中间件是指介于两个不同系统之间的软件组件&#xff0c;它可以在两个系统之间传递、处理、转换数据&#xff0c;以达到协…

【键盘识别】实例分割

第一步 键盘检测 方案一 canny边缘检测 canny边缘检测检测结果不稳定,容易因为复杂背景或光线变换检测出其他目标。 如图是用canny边缘检测方法标出的检测出的边缘的四个红点。 参考的是这篇文章OpenCV实战之三 | 基于OpenCV实现图像校正_opencv 图像校正-CSDN博客 方案二…