常用Git命令清单

139 阅读6分钟

推荐使用vscode或者idea的git可视化操作,简单方便,当可视化操作解决不了的时候再通过命令解决

vscode可视化操作教程: cloud.tencent.com/developer/a…

配置git密钥

生成密钥

ssh-keygen -t rsa

然后一路回车, 会自动生成一个.ssh目录,具体位置

  • windows: C:\Users\当前用户.ssh
  • mac: ~/.ssh

在github添加密钥: 复制.ssh下的id_rsa.pub的内容

image.png

// mac需要多执行一句
ssh-add ~/.ssh/id_rsa

// 测试配置是否正确
ssh -T git@github.com

配置多个git账号

比如我们要配置自己的github还有公司的gitlab,需要分开配置

~/.ssh/config

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa

Host githubx1
    HostName github.com
    User git
    Port 2222
    IdentityFile ~/.ssh/id_rsa_x1

git init

初始化一个项目为git仓,生成.git目录

// 关联远程仓
git remote add origin git@github.com:xxx/test.git

如果远程有代码,本地也有代码,会出现下面的问题:

Updates were rejected because the tip of your current branch is behind

本地没有远程的代码,提交就会报错,git push -f强制推送会导致远程记录丢失

fatal: refusing to merge unrelated histories

我们需要先合并远程,再推送,可以先忽略历史不相关的检查

git fetch origin 
git merge origin main --allow-unrelated-histories

git提交代码

git add .
git commit -m "提交的描述信息"
git push origin main

git branch

// 列出本地分支
git branch
// 列出本地和远程分支
git branch -a

// 创建一个分支
git branch <branch-name>
// 切换分支,不存在则创建并切过去
git checkout <branch-name>

// 删除一个分支
git branch -d <branch-name>
// 强制删除一个分支
git branch -D <branch-name>
// 删除远程分支
git push origin -d <branch-name>

上游分支

// 查看上游分支
git branch -vv

// 修改上游分支
git branch --set-upstream-to=origin/develop

git fetch

git pull = git fetch + git merge

git remote

git remote -v 

git remote add origin https://github.com/paulboone/ticgit
git remote add origin1 https://github.com/paulboone/ticgit

git remote remove origin1

git stash

临时保存和恢复未完成的工作

image.png

对应的命令

git stash

// 列出所有保存的记录
git stash list

// 使用最新的记录
git stash apply
// 删除最新的记录
git stash pop

// 使用特定的记录
git stash apply stash@{1}
// 删除特定的记录
git stash drop stash@{1}

git cherry-pick

将一个或多个提交从另一个分支复制到当前分支

// 查看提交点
git log

// 合入提交点
git cherry-pick 1a2b3c4d

// 解决完冲突
git cherry-pick --continue

// 中断
git cherry-pick --abort

git reset

回退代码

// 回退git commit, 不影响我们更改的文件
git reset --soft HEAD^

// 默认,回退git commit 和git add, 会影响我们更改的文件是否被git add
git reset --mixed HEAD^

// 慎用,回退git commit + git add + 包括已修改的代码 + 删除所有修改代码
git reset --hard HEAD^

git rebase

// 解决完冲突后
git rebase --continue

// 回退这次变基
git rebase --abort

合并提交记录

合入后发现需要清理提交记录时执行

git rebase -i HEAD~3

会出现类似下面的界面 image.png 参数说明

  • pick:保留该提交。
  • reword:保留该提交,但允许修改提交信息。
  • edit:保留该提交,但暂停变基过程以允许修改提交内容或提交信息。
  • squash:将该提交与上一个提交合并。
  • fixup:与 squash 类似,但会丢弃该提交的提交信息。
  • exec:执行 shell 命令。
  • drop:删除该提交。

有些小伙伴可能没用过vim编辑器,下面是简单的使用,还有不懂的可以查询linux vim的使用教程
编辑器是通过输入来执行操作:

  • i: 进入编辑模式,可以开始删除修改
  • :q 退出,有修改无法退出
  • :q! 强制退出,会丢失修改
  • :wq 保持文件并退出

每个提交的冲突都要手动解决,

参考文章:cloud.tencent.com/developer/a…

解决分叉

本地git提交记录在某个提交点落后了,为了保持提交历史的清晰,减少合并冲突和重复工作,需要修正,原理就是把你的提交撤销,同步到最新远程记录,再恢复你的提交

git rebase master

参考文章:juejin.cn/post/696910…

git prune

清扫,删除失效的本地分支(和远程分支建立联系的本地分支)

// 列出要被删除的分支
git remote prune origin --dry-run

// 删除
git remote prune origin 

如果你的本地分支没有推送过,那么该分支不会被删除

git revert

撤销,把指定更改的反向操作作为一个新的提交

git revert HEAD

git merge -squash

合并提交记录,一般合入到主仓会执行这个操作

git merge --squash <source_branch_name_to_squash>

git reflog

记录了所有本地 HEAD 的变更,包括提交、重置、检出等操作,可以使用git checkout恢复某个操作前的记录,git reflog 显示的信息只存在于本地仓库中,不会随着 git push 操作被推送到远程仓库

git tag

打标签,作为里程碑,一般在重要版本发布完后记录归档,储在 .git/refs/tags 目录

// 查看
git tag

// 创建
git tag <tagname> <commit-hash>

// 删除本地tag
git tag -d <tagname>

// 删除远程tag
git push origin :refs/tags/<tagname>

// 推送
git push --tags

// ### 检出
git checkout <tagname>

强制同步远程分支的提交记录

确认好再执行,会丢失本地修改

git fetch origin&& git reset --hard origin/dev&& git push -f

git hooks

.git/hooks目录下,有很多.sample结尾的示例文件,把sample后缀去掉就可以生效了

  • pre-commit:在提交之前运行,可以用来检查代码风格、运行测试等。
  • prepare-commit-msg:在编辑提交信息之前运行,可以用来预先填充提交信息。
  • commit-msg:在提交信息被最终确定前运行,可以用来验证提交信息的格式。
  • post-commit:在提交完成后运行,通常用来通知团队成员或记录日志。
  • pre-rebasepost-checkoutpost-merge 等:在 rebase、checkout 或 merge 操作前后运行。
  • pre-receive:在推送操作开始时运行,可以用来检查推送的内容是否符合某些标准。
  • update:针对每一个被推送的分支运行,可以用来进一步检查。
  • post-update:在引用更新之后立即执行,无法访问推送的详细信息,可以用来发送通知、部署应用等。
  • post-receive:在推送操作完成后运行,可以处理推送的详细信息,可以用来发送通知、部署应用等。

前端一般是配置husky使用,可以参考: juejin.cn/post/728631…

git 裸仓

第一次知道裸仓是看了一篇文章,使用裸仓可以触发git hook, 触发部署脚本

git init --bare /path/to/repo.git

裸仓的定义

一个git仓包括.git目录和工作目录,裸仓就是只包括.git目录的仓库,命名一般为xxx.git, 包含所有文件的信息,存储在.git/packed-refsand .git/refs, and .git/objects

裸仓的用处

作为中心仓,当你想把本地某个仓库作为中心仓时,又不想用GitHub, GitLab等工具,可以使用裸仓,GitHub类似一个裸仓,只会在请求时生成快照,而不是每次推送都保持更新

参考文章
stackoverflow.com/questions/3…

chuquan.me/2022/05/21/…

git submodule

git submodule add <git@github.com>:xxx/your-lib.git libs/your-lib

.gitmodules

[submodule "libs/your-lib"]
        path = libs/your-lib
        url = git@github.com:xxx/your-lib.git
        branch = master

juejin.cn/post/715439…

修改最后一次提交记录

git commit --amend

如果要修改之前的提交记录只能使用git rebase