Git小能手进阶指南

Stella981
• 阅读 503

关注  Vue中文社区 ,回复“ 加群 ”

加入我们一起学习,天天进步

Git小能手进阶指南

前言

Git 命令对于程序员的你来说再熟悉不过,但是发现好多小伙伴都是会一些基本的提交流程,当遇到问题的时,查到的命令还不敢用,总是请教组里那几个精通 Git 的小伙伴。本文对 Git 使用过程中常出现的问题进行总结并且对 Git 的一些误区概念说明了一些,看完后记得自己尝试下,希望你也能成为组里被请教的那 个 Git 小能手。

Git 经典图

Git小能手进阶指南

一张经典的 Git 流程图(来源阮一峰老师的博客)

图中的几个专用名词解释:

  1. Workspace: 工作区

  2. Index / Stage: 暂存区

  3. Repository: 本地仓库

  4. Remote: 远程仓库

git 提交可能遇到的一些问题

git 提交到本地仓库有问题怎么办?

情况一:最近一次 commit 的代码有问题怎么办?

这时候可能有小伙伴说直接修改再提交一次不就好了,这里说一下优雅的方式,不进行再一次提交,修改这次提交。

git add 我是修改内容.txtgit commit --amend

【amend】修正,会对最新一条 commit 进行修正,会把当前 commit 里的内容和暂存区(stageing area)里的内容合并起来后创建一个新的 commit,用这个新的 commit 把当前 commit 替换掉。

输入上面的命令后,Git 会进入提交信息编辑界面,然后你可以删除之前的 changeId,并且修改或者保留之前的提交信息,:wq 保存按下回车后,你的 commit 就被更新了。

对于 amend 还可能出现几种小问题,下面列举下:

刚刚写的提交信息有问题,想修改怎么办?
git commit --amend -m "新的提交信息"
刚刚提交完代码发现,我有个文件没保存,漏了提交上去怎么办?

最简单的方式,再次 commit:

git  commit -m "提交信息"

另一中方式,使用--no-edit,它表示提交信息不会更改,在 git 上仅为一次提交。

git add changgeFile // changeFile 刚刚漏了提交的文件git commit --amend --no-edit

情况二:最新提交的代码没问题,它上一次提交的有问题怎么办?

上面说的是最新一次的提交出了问题,接下来说之前提交的代码发现有问题了想修改,应该怎么办?需要一个新的命令:

git rebase -i

rebase -i 是 rebase --interactive 的缩写形式,意为「交互式 rebase」。所谓「交互式 rebase」,就是在 rebase 的操作执行之前,你可以指定要 rebase 的 commit 链中的每一个 commit 是否需要进一步修改。

注意点:看 commit 历史的时候,最新的提交在最下面,刚开始使用时候总是搞错。

输入上面的命令后,会进入下面的编辑界面。

Git小能手进阶指南

根据编辑界面中的提示,我们把要修改的倒数第二个 commit,也就是上面的【修改代码格式首行缩进】前面 pick 指令改为 edit。edit的意思编辑器中已给了解释,应用这个commit,但是停下来修正。改完之后,esc退出,:wq 保存。

会显示如下信息。

Git小能手进阶指南

这个rebase过程已经停在倒数第二个 commit 的位置了,修改完成你要修改的内容,再次提交。

git add .git commit --amend

然后继续 rebase 过程,使用 rebase --continue 来继续 rebase 过程,把后面的 commit 直接应用上去。

git rabase --continue

另外在使用git rebase -i 的时候,里面带了不同的指令,都可以对已有的提交进行一些操作,比如 squash 对多个 commit 合并成一个 commit。

情况三:刚刚写完的提交太烂了,不想改了,想直接丢弃怎么办?

你可以用 reset --hard 来撤销 commit

git reset --hard HEAD^

HEAD 表示 HEAD^ 往回数一个位置的 commit ,HEAD^ 表示你要恢复到哪个 commit。因为你要撤销最新的一个 commit,所以你需要恢复到它的父 commit ,也就是 HEAD^。那么在这行之后,你的最新一条就被撤销了。

Git 代码已经 push 上去发现有问题

情况一:如果出错内容还在私有分支

这种情况你修改后,再次提交会报错,由于你在本地对已有的 commit 做了修改,这时你再 push 就会失败,因为中央仓库包含本地没有的 commits。这种情况只在你自己的分支 branch1 ,可以使用强制 push 的方式解决冲突。

git push origin branch1 -f

-f 是 --force 的缩写,意为「忽略冲突,强制 push」

情况2:如果出错内容已经 push 到了 master 分支

这种情况可以使用 Git 的 revert 指令。

git revert HEAD^

上面这行代码就会增加一条新的 commit,它的内容和倒数第二个 commit 是相反的,从而和倒数第二个 commit 相互抵消,达到撤销的效果。

在 revert 完成之后,把新的 commit 再 push 上去,这个 commit 的内容就被撤销了。

revert 与前面说的 reset 最主要的区别是,这次改动只是被「反转」了,并没有在历史中消失掉,你的历史中会存在两条 commit :一个原始 commit ,一个对它的反转 commit。

Git 关于暂存的问题

假如正在开发手中需求的时候,突然来了个紧急 bug 要修复,这时候需要先 stash 已经写的部分代码,使自己返回到上一个 commit 改完 bug 之后从缓存栈中推出之前的代码,继续工作。

  • 添加缓存栈: git stash

  • 查看缓存栈: git stash list

  • 推出缓存栈: git stash pop

  • 取出特定缓存内容:git stash apply stash@{1}

注意:没有被 track 的文件(即从来没有被 add 过的文件不会被 stash 起来,因为 Git 会忽略它们。如果想把这些文件也一起 stash,可以加上 -u 参数,它是 --include-untracked 的简写。就像这样:git stash -u

Git 分支相关问题

分支中的常用命令:

  • git 拉取指定分支的代码:git clone -b 分支名称 地址

  • 查看当前分支:git branch

  • 查看远程分支:git branch -a

  • 创建并切换分支:git checkout -b add_orderdesc

  • 切换分支:git checkout 分支名称

  • 查看当前的本地分支与远程分支的关联关系:git branch -vv

  • 合并当前分支代码到master:

问题1:我想把本地创建的一个分支 koalanode提交到远程,并且远程分支名称要求 nodescript,且还未创建,需要怎能做?

  1. 我先在远程建了一个分支 nodescript,我本地也有这么一个分支,名字和远程的分支名称还不一样。首先,我把我本地的分支名称修改成和远程分支相同。

  2. 将本地新建分支 push 到自己的本地远程 origin 上,因为只在本地创建了一个新的分支,远程origin 上还没有该分支

    git push origin nodescript

  3. 把本地分支与远程 origin 的分支进行关联处理(通过 --set-upstream-to 命令)

    git branch --set-upstream-to=origin/add_orderdesc

  4. 再次通过  git branch -vv 查看分支的关联关系,可见本地分支已于 origin 的分支建立上了关联关系,之后我们每次 push 或者 pull 的时候,只需要输入git push 或者git pull

git 用户名密码邮箱相关问题

公司仓库有账号密码,自己的github有账户密码,两个不同账户,有一次提交发现自己仓库的邮箱提交成了公司仓库设置的邮箱,有点尴尬,为什么会出现这种问题呢?

首先这个你在刚开始安装一趟的时候应该就用过:

// 设置查看 git 用户名和邮箱git config user.name   --查看git当前配置用户名git config user.email  --查看git当前配置的邮箱git config user.name 名称 设置用户名git config user.email 邮箱 设置git邮箱

全局命令设置

 git config  --global user.name 你的目标用户名; git config  --global user.email 你的目标邮箱名;

在项目中也可以查看这些信息

vi ~/.gitconfig;

知道了这些配置修改之后,你可以选择全局配置下,在公司电脑,或者提交前自己看下,就不会再出现上面的尴尬问题了。

git 提交规范

这里只列举我常用的提交格式类型

  • feat:新功能(feature)

  • fix:修补bug

  • docs:文档(documentation)

  • style:格式(不影响代码运行的变动)

  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)

  • test:增加测试

  • chore:其他修改,比如构建过程或辅助工具的变动

git 更详细的提交规范可以看一下阮一峰老师的这篇文章,非常棒Commit message 和 Change log 编写指南

Git 工具

网上一些 Git 工具很多,推荐一个 SourceThree,但是个人还是比较喜欢用  Git 命令,不然你会发现这项技能慢慢蜕化了,而且一些工具提交时总是带一些我不懂的参数。平时工具和 Git 命令配个使用,用它的可视化图表看提交是否有问题,当然也有公司觉得用命令没有工具安全的,自己选择就好了,嘿嘿。

SourceThree 下载地址:https://www.sourcetreeapp.com/

vim 常用命令

使用 Git 的时候,偶尔会对 Vim 中对 shell 脚本进行简单操作,为了节约时间,列出几个常用的 vim 快捷命令。

  • a,i,r,o,A,I,R,O 进入编辑模式

  • :q 一般退出

  • :q! 退出不保存

  • :wq 保存退出

  • yy 复制当前行的内容

  • ZZ 保存离开

  • dd 删除光标当前行

总结

本文对 Git 使用过程中常出现的问题进行了一个总结,后面还会更新冲突解决的一些问题,最后建议大家在记忆的时候围绕文初的图片,多使用!希望本文能帮助到小伙伴们。点个在看,啦啦啦!

参考文章与附件:

掘金小册:Git 原理详解及使用指南

阮一峰老师 Git 提交规范 https://www.ruanyifeng.com/blog/2016/01/commit\_message\_change\_log.html

图解 Git 命令

往期

Vue常见的考点(下)

Vue知识点自检清单(上)

Git小能手进阶指南

转发在看就是最大的支持❤️

本文分享自微信公众号 - Vue中文社区(vue_fe)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这