【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 提交。

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

相关推荐
和你一起去月球9 小时前
TypeScript - 函数(下)
javascript·git·typescript
我不是程序猿儿9 小时前
【GIT】TortoiseGit的变基(Rebase)操作
git
yyycqupt16 小时前
git使用(一)
git
Kkooe20 小时前
GitLab|数据迁移
运维·服务器·git
Beekeeper&&P...21 小时前
git bash是什么,git是什么,git中的暂存区是什么,git中的本地仓库是什么,git中工作目录指的是什么
开发语言·git·bash
Stara05111 天前
Git推送+拉去+uwsgi+Nginx服务器部署项目
git·python·mysql·nginx·gitee·github·uwsgi
lsswear1 天前
GIT 操作
git
勋勋勋勋小勋勋1 天前
git分支合并某一次提交
git
PandaCave1 天前
git常用命令以及注意事项总结
git