热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从0开始学习GitHub系列之「Git进阶」

关于Git相信大家看了之前一系列的文章已经初步会使用了,但是关于Git还有很多知识与技巧是你不知道的,今天就来给大家介绍下一些Git进阶的知识。1.用

关于 Git 相信大家看了之前一系列的文章已经初步会使用了, 但是关于Git还有很多知识与技巧是你不知道的,今天就来给大家介绍下一些 Git 进阶的知识。


1. 用户名和邮箱

我们知道我们进行的每一次commit都会产生一条log,这条log标记了提交人的姓名与邮箱,以便其他人方便的查看与联系提交人,所以我们在进行提交代码的第一步就是要设置自己的用户名与邮箱。执行以下代码:

git config --global user.name "stormzhang"
git config --global user.email "stormzhang.dev@gmail.com"

以上进行了全局配置,当然有些时候我们的某一个项目想要用特定的邮箱,这个时候只需切换到你的项目,以上代码把 –global 参数去除,再重新执行一遍就ok了。

PS:我们在 GitHub 的每次提交理论上都会在 主页的下面产生一条绿色小方块的记录,如果你确认你提交了,但是没有绿色方块显示,那肯定是你提交代码配置的邮箱跟你 GitHub 上的邮箱不一致,GitHub 上的邮箱可以到 Setting -> Emails里查看。


2. alias

我们知道我们执行的一些Git命令其实操作很频繁的类似有:

git commit
git checkout
git branch
git status
...

这些操作非常频繁,每次都要输入完全是不是有点麻烦,有没有一种简单的缩写输入呢?比如我对应的直接输入以下:

git c
git co
git br
git s
...

是不是很简单快捷啊?这个时候就用到了alias配置了,翻译过来就是别名的意思,输入以下命令就可以直接满足了以上的需求。

git config --global alias.co checkout # 别名
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch

当然以上别名不是固定的,你完全可以根据自己的习惯去定制,除此之外还可以设置组合,比如:

git config --global alias.psm 'push origin master'
git config --global alias.plm 'pull origin master'

之后经常用到的git push origin mastergit pull origin master 直接就用 git psmgit plm 代替了,是不是很方便?

另外这里给大家推荐一个很强大的 alias 命令,我们知道我们输入 git log 查看日志的时候是类似这样的:

告诉大家一个比较屌的命令&#xff0c;输入git log –graph –pretty&#61;format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ –abbrev-commit –date&#61;relative 然后日志这样了&#xff1a;

是不是比较清晰&#xff0c;整个分支的走向也很明确&#xff0c;但是每次都要输这么一大串是不是也很烦&#xff1f;这时候你就该想到 alias 啊&#xff1a;

git config --global alias.lg "log --graph --pretty&#61;format:&#39;%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset&#39; --abbrev-commit --date&#61;relative"

这样以后直接输入 git lg 就行了。


3. 其他配置

当然还有一些其他有用的配置&#xff0c;默认情况下 git 用的编辑器是 vi &#xff0c;如果不喜欢可以改成其他编辑器&#xff0c;比如我习惯 vim 。

git config --global core.editor "vim" # 设置Editor使用vim

你们如果喜欢其他编辑器可自行搜索配置&#xff0c;前提是本机有安装。

有些人纳闷我的终端怎么有各种颜色&#xff0c;自己却不是这样的&#xff0c;那是因为你们没有开启给 Git 着色&#xff0c;输入如下命令即可&#xff1a;

git config --global color.ui true

还有些其他的配置如&#xff1a;

git config --global core.quotepath false # 设置显示中文文件名

以上基本所有的配置就差不多了&#xff0c;默认这些配置都在 ~/.gitconfig 文件下的&#xff0c;你可以找到这个文件查看自己的配置&#xff0c;也可以输入 git config -l 命令查看。


4. diff

diff命令算是很常用的&#xff0c;使用场景是我们经常在做代码改动&#xff0c;但是有的时候2天前的代码了&#xff0c;做了哪些改动都忘记了&#xff0c;在提交之前需要确认下&#xff0c;这个时候就可以用diff来查看你到底做了哪些改动&#xff0c;举个例子&#xff0c;比如我有一个 a.md 的文件&#xff0c;我现在做了一些改动&#xff0c;然后输入 git diff 就会看到如下&#xff1a;

红色的部分前面有个 - 代表我删除的&#xff0c;绿色的部分前面有个 &#43; 代表我增加的&#xff0c;所以从这里你们很一目了然的知道我到底对这个文件做了哪些改动。

值得一提的是直接输入 git diff 只能比较当前文件和暂存区文件差异&#xff0c;什么是暂存区&#xff1f;就是你还没有执行 git add 的文件。

当然跟暂存区做比较之外&#xff0c;他还可以有其他用法&#xff0c;如比较两次 commit 之间的差异&#xff0c;比较两个分支之间的差异&#xff0c;比较暂存区和版本库之间的差异等&#xff0c;具体用法如下&#xff1a;

git diff <$id1> <$id2> # 比较两次提交之间的差异
git diff .. # 在两个分支之间比较
git diff --staged # 比较暂存区和版本库差异

5. checkout

我们知道 checkout 一般用作切换分支使用&#xff0c;比如切换到 develop 分支&#xff0c;可以执行&#xff1a;

git checkout develop

但是 checkout 不只用作切换分支&#xff0c;他可以用来切换tag&#xff0c;切换到某次commit&#xff0c;如&#xff1a;

git checkout v1.0
git checkout ffd9f2dd68f1eb21d36cee50dbdd504e95d9c8f7 # 后面的一长串是commit_id&#xff0c;是每次commit的SHA1值&#xff0c;可以根据 git log 看到。

除了有“切换”的意思&#xff0c;checkout 还有一个撤销的作用&#xff0c;举个例子&#xff0c;假设我们在一个分支开发一个小功能&#xff0c;刚写完一半&#xff0c;这时候需求变了&#xff0c;而且是大变化&#xff0c;之前写的代码完全用不了了&#xff0c;好在你刚写&#xff0c;甚至都没有 git add 进暂存区&#xff0c;这个时候很简单的一个操作就直接把原文件还原&#xff1a;

git checkout a.md

这里稍微提下&#xff0c;checkout 命令只能撤销还没有 add 进暂存区的文件。


6. stash

设想一个场景&#xff0c;假设我们正在一个新的分支做新的功能&#xff0c;这个时候突然有一个紧急的bug需要修复&#xff0c;而且修复完之后需要立即发布。当然你说我先把刚写的一点代码进行提交不就行了么&#xff1f;这样理论上当然是ok的&#xff0c;但是这会产品垃圾commit&#xff0c;原则上我们每次的commit都要有实际的意义&#xff0c;你的代码只是刚写了一半&#xff0c;还没有什么实际的意义是不建议就这样commit的&#xff0c;那么有没有一种比较好的办法&#xff0c;可以让我暂时切到别的分支&#xff0c;修复完bug再切回来&#xff0c;而且代码也能保留的呢&#xff1f;

这个时候 stash 命令就大有用处了&#xff0c;前提是我们的代码没有进行 commit &#xff0c;哪怕你执行了 add 也没关系&#xff0c;我们先执行

git stash

命令&#xff0c;什么意思呢&#xff1f;意思就是把当前分支所有没有 commit 的代码先暂存起来&#xff0c;这个时候你再执行 git status 你会发现当前分支很干净&#xff0c;几乎看不到任何改动&#xff0c;你的代码改动也看不见了&#xff0c;但其实是暂存起来了。执行

git stash list

你会发现此时暂存区已经有了一条记录。

这个时候你可以切换会其他分支&#xff0c;赶紧把bug修复好&#xff0c;然后发布。之后一切都解决了&#xff0c;你再切换回来继续做你之前没做完的功能&#xff0c;但是之前的代码怎么还原呢&#xff1f;

git stash apply

你会发现你之前的代码全部又回来了&#xff0c;就好像一切都没发生过一样&#xff0c;紧接着你最好需要把暂存区的这次 stash 记录删除&#xff0c;执行&#xff1a;

git stash drop

就把最近一条的 stash 记录删除了&#xff0c;是不是很方便&#xff1f;其实还有更方便的&#xff0c;你可以使用&#xff1a;

git stash pop

来代替 apply 命令&#xff0c;popapply 的唯一区别就是 pop 不但会帮你把代码还原&#xff0c;还自动帮你把这条 stash 记录删除&#xff0c;省的自己再 drop 一次了&#xff0c;为了验证你可以紧接着执行 git stash list 命令来确认是不是已经没有记录了。

最后还有一个命令介绍下&#xff1a;

git stash clear

就是清空所有暂存区的记录&#xff0c;drop 是只删除一条&#xff0c;当然后面可以跟 stash_id 参数来删除指定的某条记录&#xff0c;不跟参数就是删除最近的&#xff0c;而 clear 是清空。


7. merge & rebase

我们知道 merge 分支是合并的意思&#xff0c;我们在一个 featureA 分支开发完了一个功能&#xff0c;这个时候需要合并到主分支 master 上去&#xff0c;我们只需要进行如下操作&#xff1a;

git checkout master
git merge featureA

其实 rebase 命令也是合并的意思&#xff0c;上面的需求我们一样可以如下操作&#xff1a;

git checkout master
git rebase featureA

rebasemerge 的区别你们可以理解成有两个书架&#xff0c;你需要把两个书架的书整理到一起去&#xff0c;第一种做法是 merge &#xff0c;比较粗鲁暴力&#xff0c;就直接腾出一块地方把另一个书架的书全部放进去&#xff0c;虽然暴力&#xff0c;但是这种做法你可以知道哪些书是来自另一个书架的&#xff1b;第二种做法就是 rebase &#xff0c;他会把两个书架的书先进行比较&#xff0c;按照购书的时间来给他重新排序&#xff0c;然后重新放置好&#xff0c;这样做的好处就是合并之后的书架看起来很有逻辑&#xff0c;但是你很难清晰的知道哪些书来自哪个书架的。

只能说各有好处的&#xff0c;不同的团队根据不同的需要以及不同的习惯来选择就好。


8. 解决冲突

假设这样一个场景&#xff0c;A和B两位同学各自开了两个分支来开发不同的功能&#xff0c;大部分情况下都会尽量互不干扰的&#xff0c;但是有一个需求A需要改动一个基础库中的一个类的方法&#xff0c;不巧B这个时候由于业务需要也改动了基础库的这个方法&#xff0c;因为这种情况比较特殊&#xff0c;A和B都认为不会对地方造成影响&#xff0c;等两人各自把功能做完了&#xff0c;需要合并的到主分支 master 的时候&#xff0c;我们假设先合并A的分支&#xff0c;这个时候没问题的&#xff0c;之后再继续合并B的分支&#xff0c;这个时候想想也知道就有冲突了&#xff0c;因为A和B两个人同时更改了同一个地方&#xff0c;Git 本身他没法判断你们两个谁更改的对&#xff0c;但是这个时候他会智能的提示有 conflicts &#xff0c;需要手动解决这个冲突之后再重新进行一次 commit 提交。我随便在项目搞了一个冲突做下示例&#xff1a;

以上截图里就是冲突的示例&#xff0c;冲突的地方由 &#61;&#61;&#61;&#61; 分出了上下两个部分&#xff0c;上部分一个叫 HEAD 的字样代表是我当前所在分支的代码&#xff0c;下半部分是一个叫 baidu_activity 分支的代码&#xff0c;可以看到 HEAD 对 gradle 插件进行了升级&#xff0c;同时新增了一个插件&#xff0c;所以我们很容易判断哪些代码该保留&#xff0c;哪些代码该删除&#xff0c;我们只需要移除掉那些老旧代码&#xff0c;而且同时也要把那些 <<、&#61;&#61;&#61;&#61; 以及 >>>>>>baidu_activity 这些标记符号也一并删除&#xff0c;最后进行一次 commit 就ok了。

我们在开发的过程中一般都会约定尽量大家写的代码不要彼此影响&#xff0c;以减少出现冲突的可能&#xff0c;但是冲突总归无法避免的&#xff0c;我们需要了解并掌握解决冲突的方法。



本文原创发布于微信公众号 AndroidDeveloper「googdev」&#xff0c;转载请务必注明出处&#xff01;



推荐阅读
  • Git核心命令全解析:掌握日常开发必备技能
    本文深入解析了 Git 的核心命令,帮助开发者掌握日常开发中的必备技能。从 `git init` 命令开始,介绍了如何将当前目录转变为 Git 可管理的仓库。接着详细讲解了 `git add` 命令的使用方法,包括如何将文件(如 `readme.txt`)添加到暂存区,以便在后续提交时进行版本控制。此外,还探讨了其他关键命令,如 `git commit` 和 `git push`,以确保代码变更能够安全地保存和同步到远程仓库。通过这些命令的综合应用,开发者可以更加高效地管理和协作项目。 ... [详细]
  • 基于域名、端口和IP的虚拟主机构建方案
    本文探讨了在单台物理服务器上构建多个Web站点的虚拟主机方案,详细介绍了三种主要的虚拟主机类型:基于域名、基于IP地址和基于端口的虚拟主机。每种类型的实现方式及其优缺点均进行了深入分析,为实际应用提供了全面的技术指导。 ... [详细]
  • Git基础操作指南:掌握必备技能
    掌握 Git 基础操作是每个开发者必备的技能。本文详细介绍了 Git 的基本命令和使用方法,包括初始化仓库、配置用户信息、添加文件、提交更改以及查看版本历史等关键步骤。通过这些操作,读者可以快速上手并高效管理代码版本。例如,使用 `git config --global user.name` 和 `git config --global user.email` 来设置全局用户名和邮箱,确保每次提交时都能正确标识提交者信息。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 服务器部署中的安全策略实践与优化
    服务器部署中的安全策略实践与优化 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 对于希望在未越狱的iOS设备上修改Hosts文件的苹果用户来说,了解文件的具体位置和操作步骤至关重要。本文将详细介绍如何通过安装最新版本的iTunes来实现这一目标,并提供实用的操作指南,帮助用户轻松完成Hosts文件的编辑。 ... [详细]
  • 在 CentOS 6.5 系统上部署 VNC 服务器的详细步骤与配置指南
    在 CentOS 6.5 系统上部署 VNC 服务器时,首先需要确认 VNC 服务是否已安装。通常情况下,VNC 服务默认未安装。可以通过运行特定的查询命令来检查其安装状态。如果查询结果为空,则表明 VNC 服务尚未安装,需进行手动安装。此外,建议在安装前确保系统的软件包管理器已更新至最新版本,以避免兼容性问题。 ... [详细]
  • 尽管我们尽最大努力,任何软件开发过程中都难免会出现缺陷。为了更有效地提升对支持部门的协助与支撑,本文探讨了多种策略和最佳实践,旨在通过改进沟通、增强培训和支持流程来减少这些缺陷的影响,并提高整体服务质量和客户满意度。 ... [详细]
  • 使用 `git stash` 可以将当前未提交的修改保存到一个临时存储区,以便在后续恢复工作目录时使用。例如,在处理中间状态时,可以通过 `git stash` 命令将当前的所有未提交更改推送到一个新的储藏中,从而保持工作目录的整洁。此外,本文还将详细介绍如何解决 `git stash pop` 时可能出现的冲突问题,帮助用户高效地管理代码变更。 ... [详细]
  • 本文深入探讨了 Git 与 SVN 的高效使用技巧,旨在帮助开发者轻松应对版本控制中的各种挑战。通过详细解析两种工具的核心功能与最佳实践,读者将能够更好地掌握版本管理的精髓,提高开发效率。 ... [详细]
  • Linux CentOS 7 安装PostgreSQL 9.5.17 (源码编译)
    近日需要将PostgreSQL数据库从Windows中迁移到Linux中,LinuxCentOS7安装PostgreSQL9.5.17安装过程特此记录。安装环境&#x ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 基于Net Core 3.0与Web API的前后端分离开发:Vue.js在前端的应用
    本文介绍了如何使用Net Core 3.0和Web API进行前后端分离开发,并重点探讨了Vue.js在前端的应用。后端采用MySQL数据库和EF Core框架进行数据操作,开发环境为Windows 10和Visual Studio 2019,MySQL服务器版本为8.0.16。文章详细描述了API项目的创建过程、启动步骤以及必要的插件安装,为开发者提供了一套完整的开发指南。 ... [详细]
author-avatar
mobiledu2502906557
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有