Git中你可能不知道但却很有用的命令

3,123 阅读6分钟
  • 本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金。

前言

  • 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 version/--version
  • 更新 git 版本
    1. Windows
    git update // 2.17.1及以前
    git update-git-for-windows // 2.17.1以后
    
    1. Mac
    brew install git
    brew link git --overwrite
    

git 命令文档

git help/--help [command name]
// Windows 可在 git 的安装目录下查找
例如我的在:D:\Git\mingw64\share\doc\git-doc

image.png

全局配置

// 查看系统 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

命令别名

  • 在使用过程用,有些命令很长(例如:branchcommit等等),我们可以通过别名的方法来代替它。除此之外,我们还可以配置别名为特定的命令。
  • 别名可以根据自己的喜好随意配置,不需按照我的一模一样。
git branch -> git bc
git commit -> git cm
git log -> git config --global alias.lg "log --pretty=oneline --graph"
...
  • git log 为例:
    • git log image.png
    • git config --global alias.lg "log --pretty=oneline --graph" image.png
  • 这样是不是大大节约了我们输入命令的时间,提高了我们的开发效率呢。其他同事看到是不是感觉更高级呢。

文件操作

添加

  • 除了 我们常用的 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
    1. 放弃当前所有的文件修改:git checkout .(慎用,会丢掉所有编辑过的文件,需要保存的手动存储)
    2. 放弃某个文件:git checkout -- filepathname (比如:git checkout -- readme.md,不要忘记中间的 “--” ,不写就成了检出分支了!!!)。
  • 已使用 git add,可以使用  git reset
    1. 放弃所有的缓存:git reset HEAD .
  • 已经用 git commit,可以使用  git reset
    1. git reset --hard HEAD^ 回退到上一次 commit 的状态。
git reset 详解。
// merge|keep 不常用
$ git reset [--hard|soft|mixed|merge|keep] [commit|HEAD]
  • 工作区:未使用 git add;暂存区:已使用 git add
  1. --mixed:仅重设暂存区,并把 HEAD 指向<commit>,但是不重设工作区,本地文件修改不受影响。 这个模式是默认模式,即当不显示告知 git reset 模式时,会使用 mixed 模式。 工作区中文件的修改都会被保留,不会丢弃,但是也不会被标记成 Changes to be committed,但是会提示文件未被更新。 (回退到某个版本,只保留源码,回退commit和index信息)
  2. --hard重设暂存区和工作区 ,从 <commit> 以来在工作区中的任何改变都被丢弃,并把 HEAD 指向 <commit>(彻底回退到某个版本,本地的源码也会变为上一个版本的内容。)
  3. --soft: 工作区中的内容不作任何改变,HEAD 指向 <commit> ,自从 <commit> 以来的所有改变都会回退到“暂存区”中,显示在 git statusChanges to be committed 中。(回退到某个版本,只回退了 commit 的信息。如果还要提交,直接 commit 即可。)
  • 通过 git log 中的 commit_id 我们可以回退到之前的任意版本。
git reset --hard commit_id
查看提交记录
  • 使用 git reset 回退到 Delete .DS_Storeimage.png
  1. git lg image.png
  2. 看上面的 git lg 打印,我们发现少了我们最后一次提交的 log 记录。当我们执行 git reset 进行版本回退之后,之前最新的版本号无法通过 git log 查询到,此时需要使用git reflog 命令查询Git的操作记录,我们可以从该记录中找到之前的 commit id 信息。 image.png

缓存当前修改

  • 前面提到 git checkout . 会放弃所有的工作区修改,那有没有什么办法可以保存呢?
保存
  • 你可以一直执行 git stash
释放
  • popapply
    • pop:恢复到工作区,并从 stash 存储区内删除;
    • apply:恢复到工作区,stash 存储区保留,需要手动删除。
git stash pop
git stash apply stash@{[index]}

image.png

删除
// 删除某一次的存储内容
git stash drop stash@{[index]}
// 清除所有
git stash clear
查看
// 显示记录
git stash list
// 显示信息
git stash show stash@{[index]}

删除远程文件

rm [filename] // 本地删除
git rm -rf --cached [filename] // 远程删除
  • 删除后再提交推送一次即可。

分支管理

创建分支

  1. 本地分支
// 创建分支
git checkout branch-name
// 创建并切换到对应分支
git checkout -b branch-name
  1. 远程分支
// 获取远程分支
git fetch
// 创建新分支(最好和远程同名,方便比对)关联远程分支,并切换到对应分支
git checkout -b branch-name origin/branch-name

合并分支

  • 合并分支 mergerebase 区别。
    1. git log 时,merg 命令不会保留 merge 的分支的 commit
    2. 冲突处理: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

推送分支

  1. 已关联远程
// 不能直接推送,先 pull 再 push
git push
  1. 未关联远程(首次推送)
  • 当我们本地直接新建的分支就是未和远程关联的分支,当我们使用 git checkout -b branch-name origin/branch-name 时,就是已关联的分支,前提是远程已存在。
git push --set-upstream origin [branch name]
  1. 回退到某一次提交
git push origin HEAD --force

删除分支

  1. 本地删除
git branch -d [branch name]
git branch -D [branch name] // 强制删除
  1. 远程删除
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] // 远程删除

image.png

参考

结语

  • 欢迎在评论区讨论,掘金官方将在掘力星计划活动结束后,在评论区抽送 100 份掘金周边,抽奖详情见活动文章。

往期精彩

「点赞、收藏和评论」

❤️关注+点赞收藏+评论+分享❤️,手留余香,谢谢🙏大家。