推荐使用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的内容
// 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
临时保存和恢复未完成的工作
对应的命令
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
会出现类似下面的界面
参数说明
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
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-rebase、post-checkout、post-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…
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
修改最后一次提交记录
git commit --amend
如果要修改之前的提交记录只能使用git rebase