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"文件,此文件有如下规则:
- 忽略文件中的空行和以井号(#)开始的行将不会被识别。
- 可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
- 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
- 如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
- 如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
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 提交。
我们在开发的过程中一般都会约定尽量大家写的代码不要彼此影响,以减少出现冲突的可能,但是冲突总归无法避免的,我们需要了解并掌握解决冲突的方法。