- 本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。
前言
- git 官网
- 本文主要针对有
git
基础的掘友们,没有相应基础可能导致阅读体验感不佳,可以先点赞收藏,从点击这里学习。 git
在项目开发中必不可少,我们常用的命令也就那几个(clone、branch、checkout、merge、add、commit、pull、push...),我们在使用时往往发现这些完全不够用。本文告诉你:这些命令还有哪些更好的用法,还有哪些命令是你不知道但却很有用的。
SSH 查看与创建
// 查看是否存在,Windows 可以使用 git-bash 执行下面的命令
ls -al ~/.ssh
// 不存在则创建,已存在但不是自己的可以删除再创建
ssh-keygen -t rsa -C ["your_email@example.com"]
// 复制 id_rsa.pub 文件全部内容,可以使用记事本等打卡
// Windows 命令
cat id_rsa.pub // 复制输出的所有字符
// Mac 命令
pbcopy < ~/.ssh/id_rsa.pub // 直接复制到粘贴板
// 将内容放到对应的 GitHub/Gitlab 添加新的 SSH 即可
Git 更新
- 官网多系统安装 Git
- 查看
git
版本
git version/--version
- 更新
git
版本- Windows
git update // 2.17.1及以前 git update-git-for-windows // 2.17.1以后
- Mac
- 使用
Brew
安装,安装 Brew。
brew install git brew link git --overwrite
git
命令文档
git help/--help [command name]
// Windows 可在 git 的安装目录下查找
例如我的在:D:\Git\mingw64\share\doc\git-doc
全局配置
// 查看系统 config
git config --system --list
// 查看当前用户(global)配置
git config --global --list
// 查看当前仓库配置信息
git config --local --list
// 删除全局配置项
(1)终端执行命令:
git config --global --unset 属性名(user.name)
(2)编辑配置文件:
git config --global --edit
用户名、密码
git config -–global user.name "user name"
git config –-global user.email "user email"
// 账号密码变动重置
git config --system --unset credential.helper
命令别名
- 在使用过程用,有些命令很长(例如:
branch
、commit
等等),我们可以通过别名的方法来代替它。除此之外,我们还可以配置别名为特定的命令。 - 别名可以根据自己的喜好随意配置,不需按照我的一模一样。
git branch -> git bc
git commit -> git cm
git log -> git config --global alias.lg "log --pretty=oneline --graph"
...
- 以
git log
为例:git log
git config --global alias.lg "log --pretty=oneline --graph"
- 这样是不是大大节约了我们输入命令的时间,提高了我们的开发效率呢。其他同事看到是不是感觉更高级呢。
文件操作
添加
- 除了 我们常用的
git add ./*
之外。
git add [filepath] -u
-u
添加远程已追踪的变化文件(已与远程仓库关联),filepath
可选文件路径,不写默认项目根路径。
git add -f [filename]
-f
强制添加文件,如果在.gitignore
文件中已经忽略,但是又想提交到仓库不想修改.gitignore
文件(他人不能提交)。
git add . --no-verify
--no-verify
绕过husky pre-commit
的代码规范校验。
git check-ignore -v [ignore filename/filepath]
- 检查
.gitignore
规则是否正确。
撤销
- 未使用
git add
,可以使用git checkout
。- 放弃当前所有的文件修改:
git checkout .
(慎用,会丢掉所有编辑过的文件,需要保存的手动存储)。 - 放弃某个文件:
git checkout -- filepathname
(比如:git checkout -- readme.md
,不要忘记中间的 “--
” ,不写就成了检出分支了!!!)。
- 放弃当前所有的文件修改:
- 已使用
git add
,可以使用git reset
。- 放弃所有的缓存:
git reset HEAD .
。
- 放弃所有的缓存:
- 已经用
git commit
,可以使用git reset
。git reset --hard HEAD^
回退到上一次commit
的状态。
git reset
详解。
// merge|keep 不常用
$ git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
- 工作区:未使用
git add
;暂存区:已使用git add
。
--mixed
:仅重设暂存区,并把HEAD
指向<commit>
,但是不重设工作区,本地文件修改不受影响。 这个模式是默认模式,即当不显示告知git reset
模式时,会使用mixed
模式。 工作区中文件的修改都会被保留,不会丢弃,但是也不会被标记成Changes to be committed
,但是会提示文件未被更新。 (回退到某个版本,只保留源码,回退commit和index信息)--hard
:重设暂存区和工作区 ,从<commit>
以来在工作区中的任何改变都被丢弃,并把HEAD
指向<commit>
。 (彻底回退到某个版本,本地的源码也会变为上一个版本的内容。)--soft
: 工作区中的内容不作任何改变,HEAD
指向<commit>
,自从<commit>
以来的所有改变都会回退到“暂存区”中,显示在git status
的Changes to be committed
中。(回退到某个版本,只回退了commit
的信息。如果还要提交,直接commit
即可。)
- 通过
git log
中的commit_id
我们可以回退到之前的任意版本。
git reset --hard commit_id
查看提交记录
- 使用
git reset
回退到Delete .DS_Store
。
git lg
- 看上面的
git lg
打印,我们发现少了我们最后一次提交的log
记录。当我们执行git reset
进行版本回退之后,之前最新的版本号无法通过git log
查询到,此时需要使用git reflog
命令查询Git的操作记录,我们可以从该记录中找到之前的commit id
信息。
缓存当前修改
- 前面提到
git checkout .
会放弃所有的工作区修改,那有没有什么办法可以保存呢?
保存
- 你可以一直执行
git stash
。
释放
pop
和apply
pop
:恢复到工作区,并从stash
存储区内删除;apply
:恢复到工作区,stash
存储区保留,需要手动删除。
git stash pop
git stash apply stash@{[index]}
删除
// 删除某一次的存储内容
git stash drop stash@{[index]}
// 清除所有
git stash clear
查看
// 显示记录
git stash list
// 显示信息
git stash show stash@{[index]}
删除远程文件
rm [filename] // 本地删除
git rm -rf --cached [filename] // 远程删除
- 删除后再提交推送一次即可。
分支管理
创建分支
- 本地分支
// 创建分支
git checkout branch-name
// 创建并切换到对应分支
git checkout -b branch-name
- 远程分支
// 获取远程分支
git fetch
// 创建新分支(最好和远程同名,方便比对)关联远程分支,并切换到对应分支
git checkout -b branch-name origin/branch-name
合并分支
- 合并分支
merge
和rebase
区别。git log
时,merg
命令不会保留merge
的分支的commit
。- 冲突处理:
merge
合并后只需要解决完冲突再一次性添加即可;reabse
解决完冲突,执行git add .
和git rebase --continue
,直到冲突处理完,不会产生额外的commit
。
git rebase while(存在冲突) { git status # 找到当前冲突文件,编辑解决冲突 git add -u git rebase --continue if( git rebase --abort ) break; }
merge
也可以保留commit
记录,但只有在冲突的时候,解决完冲突才会自动产生一个commit
。如果想在没有冲突的情况下也自动生成一个commit
,记录此次合并就可以用git merge --no-ff
。
推送分支
- 已关联远程
// 不能直接推送,先 pull 再 push
git push
- 未关联远程(首次推送)
- 当我们本地直接新建的分支就是未和远程关联的分支,当我们使用
git checkout -b branch-name origin/branch-name
时,就是已关联的分支,前提是远程已存在。
git push --set-upstream origin [branch name]
- 回退到某一次提交
git push origin HEAD --force
删除分支
- 本地删除
git branch -d [branch name]
git branch -D [branch name] // 强制删除
- 远程删除
git push origin --delete [branch name]
Tag管理
创建
git tag [tag version] // 当前提交
git tag -a [tag version] -m [tag description] // 当前提交
git tag [tag version] commit_id // git log 的commit id 给之前的提交打tag
查看
git tag // 查看所有
git show [tag version] // 查看具体某个tag
推送
git push origin [tag version] // 推送某个
git push origin --tags // 推送所有
删除
git tag -d [tag version] // 本地删除
git push origin :refs/tags/[tag version] // 远程删除
参考
结语
- 欢迎在评论区讨论,掘金官方将在掘力星计划活动结束后,在评论区抽送
100
份掘金周边,抽奖详情见活动文章。
往期精彩
- 前端还不会 Nginx 吗?快来学起来
- VS Code 提升开发效率、质量以及编码体验指南
- 金九前端面试总结!
- 从0搭建Vite + Vue3 + Element-Plus + Vue-Router + ESLint + husky + lint-staged
- 「前端进阶」JavaScript手写方法/使用技巧自查
- 公众号打开小程序最佳解决方案(Vue)
- Axios你可能不知道使用方式
「点赞、收藏和评论」
❤️关注+点赞收藏+评论+分享❤️,手留余香,谢谢🙏大家。