Git 常用命令总结,掌握这些,轻松驾驭版本管理
wptr33 2025-07-07 23:37 18 浏览
最近公司的代码管理工具要从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: 其他修改, 比如构建流程, 依赖管理.
附件
- Git常用命令速查表:
相关推荐
- oracle数据导入导出_oracle数据导入导出工具
-
关于oracle的数据导入导出,这个功能的使用场景,一般是换服务环境,把原先的oracle数据导入到另外一台oracle数据库,或者导出备份使用。只不过oracle的导入导出命令不好记忆,稍稍有点复杂...
- 继续学习Python中的while true/break语句
-
上次讲到if语句的用法,大家在微信公众号问了小编很多问题,那么小编在这几种解决一下,1.else和elif是子模块,不能单独使用2.一个if语句中可以包括很多个elif语句,但结尾只能有一个...
- python continue和break的区别_python中break语句和continue语句的区别
-
python中循环语句经常会使用continue和break,那么这2者的区别是?continue是跳出本次循环,进行下一次循环;break是跳出整个循环;例如:...
- 简单学Python——关键字6——break和continue
-
Python退出循环,有break语句和continue语句两种实现方式。break语句和continue语句的区别:break语句作用是终止循环。continue语句作用是跳出本轮循环,继续下一次循...
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
-
用for循环或者while循环时,如果要在循环体内直接退出循环,可以使用break语句。比如计算1至100的整数和,我们用while来实现:sum=0x=1whileTrue...
- Python 中 break 和 continue 傻傻分不清
-
大家好啊,我是大田。...
- python中的流程控制语句:continue、break 和 return使用方法
-
Python中,continue、break和return是控制流程的关键语句,用于在循环或函数中提前退出或跳过某些操作。它们的用途和区别如下:1.continue(跳过当前循环的剩余部分,进...
- L017:continue和break - 教程文案
-
continue和break在Python中,continue和break是用于控制循环(如for和while)执行流程的关键字,它们的作用如下:1.continue:跳过当前迭代,...
- 作为前端开发者,你都经历过怎样的面试?
-
已经裸辞1个月了,最近开始投简历找工作,遇到各种各样的面试,今天分享一下。其实在职的时候也做过面试官,面试官时,感觉自己问的问题很难区分候选人的能力,最好的办法就是看看候选人的github上的代码仓库...
- 面试被问 const 是否不可变?这样回答才显功底
-
作为前端开发者,我在学习ES6特性时,总被const的"善变"搞得一头雾水——为什么用const声明的数组还能push元素?为什么基本类型赋值就会报错?直到翻遍MDN文档、对着内存图反...
- 2023金九银十必看前端面试题!2w字精品!
-
导文2023金九银十必看前端面试题!金九银十黄金期来了想要跳槽的小伙伴快来看啊CSS1.请解释CSS的盒模型是什么,并描述其组成部分。...
- 前端面试总结_前端面试题整理
-
记得当时大二的时候,看到实验室的学长学姐忙于各种春招,有些收获了大厂offer,有些还在苦苦面试,其实那时候的心里还蛮忐忑的,不知道自己大三的时候会是什么样的一个水平,所以从19年的寒假放完,大二下学...
- 由浅入深,66条JavaScript面试知识点(七)
-
作者:JakeZhang转发链接:https://juejin.im/post/5ef8377f6fb9a07e693a6061目录...
- 2024前端面试真题之—VUE篇_前端面试题vue2020及答案
-
添加图片注释,不超过140字(可选)...
- 今年最常见的前端面试题,你会做几道?
-
在面试或招聘前端开发人员时,期望、现实和需求之间总是存在着巨大差距。面试其实是一个交流想法的地方,挑战人们的思考方式,并客观地分析给定的问题。可以通过面试了解人们如何做出决策,了解一个人对技术和解决问...
- 一周热门
- 最近发表
-
- oracle数据导入导出_oracle数据导入导出工具
- 继续学习Python中的while true/break语句
- python continue和break的区别_python中break语句和continue语句的区别
- 简单学Python——关键字6——break和continue
- 2-1,0基础学Python之 break退出循环、 continue继续循环 多重循
- Python 中 break 和 continue 傻傻分不清
- python中的流程控制语句:continue、break 和 return使用方法
- L017:continue和break - 教程文案
- 作为前端开发者,你都经历过怎样的面试?
- 面试被问 const 是否不可变?这样回答才显功底
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)
