【Git】(基础篇五)—— Git进阶

Git进阶

之前关于本地和远程仓库的各种操作都已经非常基础了,本文介绍git的一些进阶使用和设置

用户名和邮箱

之前介绍的每一次提交(commit) 都会产生一条日志(log) 信息,这条日志信息不仅会记录提交信息,还会记录执行提交操作的这个用户的用户名和邮箱,我们应该在提交前就设置好用户名和邮箱,使用以下代码进行设置

git config --global user.name "daocaoren"
git config --global user.email "123@123.com"

上述代码使用了--global 参数,表示设置的是全局参数,如果你在某个项目中不使用全局设置,而是使用特定的用户和邮箱,只需要去掉--global 参数即可进行单独设置。

github的邮箱设置应该和本地的设置相同,这样在提交到github之后就可以产生对应的提交记录

别名alias

对于一些频繁使用的git操作,比如git status,在使用命令行时,每次都输入完整就很麻烦了,使用别名配置,可以将这个操作简化,你可以对几乎所有的命令进行起别名的操作。

【示例】对status 命令起别名为st,然后使用st命令查看本地仓库状态

git config --global alias.st status

在进行起别名操作时,别名的内容并不固定,你可以根据自己的喜好和习惯进行设置

不仅是这些简单的命令,复杂的命令也可也起别名

【示例】对push origin main命令起别名为pom

git config --global alias.pom 'push origin main'

【示例】这里我给出一个很强大的alias别名,它可以让我们的日志信息显示更加有条理且为彩色的主题

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

运行结果:

其他配置

颜色配置

给git命令行窗口开启着色配置

git config --global color.ui true

显示中文文件名

git config --global core.quotepath false

默认这些配置都在C:\Users\Administrator\ .gitconfig文件下的,你可以找到这个文件查看自己的配置,也可以输入 git config -l 命令查看。

diff

在Git中,git diff命令主要用来比较之前提交内容之间的差异。这是一个非常强大且常用的工具,可以让你查看文件的变化、添加、删除等。下面是一些基本的git diff用法:

让我们对之前创建的本地仓库test中的a.txt文件内容进行修改,然后再使用git diff 命令查看当前仓库中的文件与暂存区的目录

其中红色的文字和减号表示和暂存区相比删除掉的内容,绿色的文字和加号表示和暂存区相比增加的内容

diff命令不仅可以比较本地仓库和暂存区的不同,他还可以有其他用法,如比较两次 commit 之间的差异,比较两个分支之间的差异,比较暂存区和版本库之间的差异等,具体用法如下:

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

checkout

checkout 一般用作切换分支使用,比如切换到 develop 分支,可以执行:

git checkout develop

但是 checkout 不只用作切换分支,他可以用来切换tag,切换到某次commit,如:

git checkout v1.0    # 切换tag
git checkout ffd9f2dd68f1eb21d36cee50dbdd504e95d9c8f7 # 后面的一长串是commit_id,是每次commit的SHA1值,可以在git log中看到。

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

git checkout a.md

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

stash

git stash 是一个非常实用的命令,它可以帮助你在Git中临时保存你的工作现场(即你未完成的工作或者未提交的改动),以便在稍后继续进行。当你需要切换分支或执行其他操作,但又不想提交当前未完成的更改时,git stash 就派上用场了。

使用stash的前提是没有使用commit,即使使用了add也无所谓,先执行命令

git stash

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

git stash list

此时stash取已经有了一条信息,这个时候你可以切换会其他分支,赶紧把bug修复好,然后发布。之后一切都解决了,你再切换回来继续做你之前没做完的功能,但是之前的代码怎么还原呢?执行命令

git stash apply

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

git stash drop

就把最近一条的 stash 记录删除了,是不是很方便?其实还有更方便的,你可以使用:

git stash pop

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

最后还有一个命令介绍下:

git stash clear

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

merge & rebase

merge 分支是合并的意思,我们在一个 featureA 分支开发完了一个功能,这个时候需要合并到主分支main 上去,我们只需要进行如下操作:

git checkout main
git merge featureA

其实 rebase 命令也是合并的意思,上面的需求我们一样可以如下操作:

git checkout main
git rebase featureA

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

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

忽略文件

在项目开发中,有时候你并不希望把工作目录下的所有文件都纳入版本控制中,比如一些临时文件。

在主目录下建立".gitignore"文件,此文件有如下规则:

  1. 忽略文件中的空行和以井号(#)开始的行将不会被识别。
  2. 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
  3. 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
  4. 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
  5. 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
bash 复制代码
#为注释
*.txt        #忽略所有 .txt结尾的文件,这样的话上传就不会被选中!
!lib.txt     #但lib.txt除外
/temp        #仅忽略项目根目录下的temp文件,不包括其它目录temp
build/       #忽略build/目录下的所有文件
doc/*.txt    #会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

解决冲突

如果A和B两个人在两个不同的分支上同时更改了同一个地方,Git 本身他没法判断你们两个谁更改的对,但是这个时候他会智能的提示有 conflicts,需要手动解决这个冲突之后再重新进行一次 commit 提交。

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

相关推荐
清源妙木真菌2 小时前
Linux:git的了解和基础使用(保姆级教程)
git
但老师11 小时前
Git遇到“fatal: bad object refs/heads/master - 副本”问题的解决办法
git
秃头女孩y11 小时前
git创建分支
git
研究是为了理解16 小时前
Git Bash 常用命令
git·elasticsearch·bash
DKPT16 小时前
Git 的基本概念和使用方式
git
Winston Wood19 小时前
一文了解git TAG
git·版本控制
喵喵先森20 小时前
Git 的基本概念和使用方式
git·源代码管理
xianwu54321 小时前
反向代理模块
linux·开发语言·网络·git
binishuaio1 天前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
会发光的猪。1 天前
如何在vscode中安装git详细新手教程
前端·ide·git·vscode