百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Git 常用命令总结,掌握这些,轻松驾驭版本管理

wptr33 2025-07-07 23:37 12 浏览

最近公司的代码管理工具要从SVN转到Git上,因此虽然之前用过Git,但是都是一些简单的推送提交,因此还是有必要进行一些系统的学习,这里做一下笔记,以备后询,且不定期更新。

关于SVN和Git的比较已经有很多文章说过了,就不再赘述,本文的重点是如何使用常用的Git命令进行操作,冷门的就不说了,且比较零散,系统的学习推介廖雪峰的Git教程。

声明

下面用户名都为 SHERlocked93,请自行修改成自己的用户名

1. 概览

  • 工作区 Workspace
  • 暂存区 Stage / Index
  • 本地仓库 Repository
  • 远程仓库 Remote

2. 修改

2.1 暂存修改

操作一览

如果在工作的时候出现了临时需要解决的问题,而你又不希望提交,那么有个 stash功能

git stash

在暂存后工作区会回退到最近的一个commit的状态,以便开建新分支;比如我们修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场 git stash一下,然后去修复bug,修复后,再 git stash pop,回到工作现场。

2.2 撤销修改

还未提交到暂存区

当修改还没有被 add的时候,可以使用

git checkout -- filename.txt

来丢弃工作区某文件的修改,当然也可以把后面的文件改成 *来撤销所有文件的修改。这是用仓库的文件覆盖工作区的文件。

注意这里用的是 --,如果没有这个 --的话就变成切换分支了。

还未提交到仓库

如果你的修改已经被 add到了暂存区,但是还没有被 commit,那么可以使用

git reset HEAD filename.txt	
git checkout -- filename.txt

首先用 reset来把修改撤回到工作区,再使用上面的 checkout命令撤回工作区的修改。这里的 reset相当于 add的反操作。

已经提交到仓库

则可以版本回退

git reset --hard 15zdx2s

这里的 --hard表示强制回退,丢弃本地的修改。这个回退比较野蛮,该版本号之后的提交都将不可见。

撤销之前某一个提交

git revert撤销一个提交的同时会创建一个新的提交,这是一个安全的方法,因为它不会重写提交历史。但实现上和reset是完全不同的。它撤销这个提交引入的更改,然后在最后加上一个撤销了更改的新提交,而不是从项目历史中移除这个提交。

git revert 46af7z6

相较于 reset , revert不会改变项目历史,对那些已经发布到共享仓库的提交来说这是一个安全的操作。其次 git revert 可以将提交历史中的任何一个提交撤销、而 reset会把历史上某个提交及之后所有的提交都移除掉,这太野蛮了。

相比 reset,它不会改变现在的提交历史。因此, revert 可以用在公共分支上, reset 应该用在私有分支上。

合并commit

如果已经 commit了怎么办,如果要撤回目前的 commit,可以把它合并到上一个 commit中

git rebase -i HEAD~~

在出现的两个提交信息的 pick改为 fixup

3. 分支操作

3.1 创建/查看/合并分支

操作一览

创建分支

# 创建新分支

git branch bug-fix	

# 查看分支,-a查看本地和远程的分支,-r查看远程分支,-l或没有只查看本地

git branch -a	

# 切换到刚刚创建的分支

git checkout bug-fix

上面两个步骤可以合并为

# 创建并切换到分支

git checkout -b bug-fix

如果修改一下本地文件之后在这个分支继续培育一个版本之后,怎么去合并到主分支呢

git add *	
git commit -m "some change"	
# 切换到主分支	
git checkout master	
# 合并分支	
git merge bug-fix	
# 删除分支 (可选)	
git branch -d bug-fix

如果master分支和新的分支都各自培育了版本,那么自动合并通常会失败,发生冲突 conflict,此时需要打开文件解决冲突之后 commit一个版本以完成合并

git add *	
git commit -m "branch merge"

这里提一下, merge的时候有几个主要模式, --no-ff、 fast-forward,其中 fast-forward是默认的

fast-forward:在master开始的新分支前进了几个版本之后如果需要merge回来,此时master并没有前进,那么这个模式就是把HEAD与master指针指向新分支上,完成合并。这种情况如果删除分支,则会丢失分支信息,因为在这个过程中并没有创建commit。

--no-ff:关闭默认的 fast-forward模式,也就是在merge的时候生成一个新的commit,这样在分支历史上就可以看出分支信息。

3.2 远程仓库操作

操作一览

关于各个分支,哪些需要推送呢

master分支是主分支,因此要时刻与远程同步;

dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;

bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;

feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

直接 clone

在github上创建一个新的项目之后,比如叫 learn-git,那么可以直接 clone下来,注意创建的时候不要选择
Initializethisrepositorywitha README,我们要的是一个空的仓库

git clone https://github.com/SHERlocked93/learn-git.git

这样在本地就直接创建了一个空的文件夹 learn-git,当然里面有 .git文件夹。也可以使用SSH地址来clone,速度会快一些,也不用每次推送都输入口令,推介使用这种

git clone git@github.com:SHERlocked93/learn-git.git

添加一个文件 filename.txt之后

git add filename.txt	
git commit -m "add filename.txt"	
git push -u origin master

这样就把本地新建的文件push到了远程仓库

本地与远程建立关联

如果已经有了本地工程文件夹,如何分享到github远程仓库呢,当然此时我们已经在github上创建了一个新的空白项目,还是叫 learn-git,在本地文件夹中

git init	
# 关联远程库	
git remote add origin git@github.com:SHERlocked93/learn-git.git	
git push -u origin master

就可以了,如果你的远程仓库已经有了提交,那么在 push之前需要

# 允许不想干库合并	
git pull origin master --allow-unrelated-histories	
git push -u origin master

先拉取远程分支,注意这里
--allow-unrelated-histories允许两个不想干的分支强行合并,再 push;这样在github的网站上还能看到commit记录。

也可以强硬一点直接强行推送

# -f 强行推送	
git push -u origin master -f

这样本地仓库就直接把远程仓库覆盖了,且github上也看不到历史 commit了,如果不想被同事枪击的话,还是推介上一种做法。

同步远程仓库

那么已经clone的仓库如果希望同步原仓库新的提交怎么办

# 从远程分支拉取代码到本地	
git pull upstream master	
# push到自己的库里	
git push origin master

3.3 多人协作

多人协作的工作模式通常是这样:

首先,可以试图用 git push origin<branch-name>推送自己的修改;

如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;

如果合并有冲突,则解决冲突,并在本地提交;

没有冲突或者解决掉冲突后,再用 git push origin<branch-name>推送就能成功

从远程抓取分支,使用 git pull,如果有冲突,要先处理冲突, add->commit->push。如果 git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令 git branch--set-upstream-to<branch-name>origin/<branch-name>。

4. 标签操作

操作一览

如果要删除远程分支,需要

# 首先删除本地tag,假如tag是v0.9	
git tag -d v0.9	
# 再从远程删除	
git push origin :refs/tags/v0.9

5. 提交格式

type:

feat: 新特性,添加功能

fix: 修改bug

refactor: 代码重构

docs: 文档修改

style: 代码格式修改, 注意不是 css 修改

test: 测试用例修改

chore: 其他修改, 比如构建流程, 依赖管理.

附件

  1. Git常用命令速查表:

相关推荐

MySQL进阶五之自动读写分离mysql-proxy

自动读写分离目前,大量现网用户的业务场景中存在读多写少、业务负载无法预测等情况,在有大量读请求的应用场景下,单个实例可能无法承受读取压力,甚至会对业务产生影响。为了实现读取能力的弹性扩展,分担数据库压...

Postgres vs MySQL_vs2022连接mysql数据库

...

3分钟短文 | Laravel SQL筛选两个日期之间的记录,怎么写?

引言今天说一个细分的需求,在模型中,或者使用laravel提供的EloquentORM功能,构造查询语句时,返回位于两个指定的日期之间的条目。应该怎么写?本文通过几个例子,为大家梳理一下。学习时...

一文由浅入深带你完全掌握MySQL的锁机制原理与应用

本文将跟大家聊聊InnoDB的锁。本文比较长,包括一条SQL是如何加锁的,一些加锁规则、如何分析和解决死锁问题等内容,建议耐心读完,肯定对大家有帮助的。为什么需要加锁呢?...

验证Mysql中联合索引的最左匹配原则

后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的弱点知识。在Mysql调优中索引优化又是非常重要的方法,不管公司的大小只要后端项目中用到...

MySQL索引解析(联合索引/最左前缀/覆盖索引/索引下推)

目录1.索引基础...

你会看 MySQL 的执行计划(EXPLAIN)吗?

SQL执行太慢怎么办?我们通常会使用EXPLAIN命令来查看SQL的执行计划,然后根据执行计划找出问题所在并进行优化。用法简介...

MySQL 从入门到精通(四)之索引结构

索引概述索引(index),是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护者满足特定查询算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构...

mysql总结——面试中最常问到的知识点

mysql作为开源数据库中的榜一大哥,一直是面试官们考察的重中之重。今天,我们来总结一下mysql的知识点,供大家复习参照,看完这些知识点,再加上一些边角细节,基本上能够应付大多mysql相关面试了(...

mysql总结——面试中最常问到的知识点(2)

首先我们回顾一下上篇内容,主要复习了索引,事务,锁,以及SQL优化的工具。本篇文章接着写后面的内容。性能优化索引优化,SQL中索引的相关优化主要有以下几个方面:最好是全匹配。如果是联合索引的话,遵循最...

MySQL基础全知全解!超详细无废话!轻松上手~

本期内容提醒:全篇2300+字,篇幅较长,可搭配饭菜一同“食”用,全篇无废话(除了这句),干货满满,可收藏供后期反复观看。注:MySQL中语法不区分大小写,本篇中...

深入剖析 MySQL 中的锁机制原理_mysql 锁详解

在互联网软件开发领域,MySQL作为一款广泛应用的关系型数据库管理系统,其锁机制在保障数据一致性和实现并发控制方面扮演着举足轻重的角色。对于互联网软件开发人员而言,深入理解MySQL的锁机制原理...

Java 与 MySQL 性能优化:MySQL分区表设计与性能优化全解析

引言在数据库管理领域,随着数据量的不断增长,如何高效地管理和操作数据成为了一个关键问题。MySQL分区表作为一种有效的数据管理技术,能够将大型表划分为多个更小、更易管理的分区,从而提升数据库的性能和可...

MySQL基础篇:DQL数据查询操作_mysql 查

一、基础查询DQL基础查询语法SELECT字段列表FROM表名列表WHERE条件列表GROUPBY分组字段列表HAVING分组后条件列表ORDERBY排序字段列表LIMIT...

MySql:索引的基本使用_mysql索引的使用和原理

一、索引基础概念1.什么是索引?索引是数据库表的特殊数据结构(通常是B+树),用于...