Git
简介
Git 的优势?
其关键字是“分支策略”以及“变化追踪”,前者保证了在不同大小的团队中,代码的变化都可以相对保持独立,并可以通过合并策略融合变化;后者保证了变化都会被记录下来,使变化可管理。
使用 Git 时数据流是怎样的?
Git 有工作区、索引、本地仓库和远端仓库几个概念。在各个数据中心,可以使用咱词条、提交、推送、拉取、rebase、fetch、checkout 等方法对数据进行操作。
配置相关
如何配置用户名和邮箱?
去掉 --global 参数可以给单个项目进行配置,对某些项目有用。
git config --global user.name <username>
git config --global user.email <email>
如何把 VIM 编辑器换掉?
Git 用 vim 作为默认的文本编辑器,好在可以在配置中进行替换。
# 在确保 Code.exe 所在目录在环境变量中后,
# 设置 Code 为默认编辑器
git config --global core.editor Code
怎么配置代理?
git config --global http.proxy <your-proxy-url>
分支操作
如何添加远端仓库?
GitHub 流行从主仓库 fork 代码到自己的域下本地开发,再通过 PR 把代码提交回主仓库的模式。这个时候,远端仓库相关操作就比较有用了。
# 添加远端仓库
git remote add <repo-name> <repo-url>
# 合并分支到远端仓库
git merge <repo-name> feat-xxx。
如何拷贝仓库代码?
git clone <repo-url> <local-directory-name>
怎么初始化项目的子模块?
# 在项目根目录执行,递归地初始化子模块
git submodule update --init --recursive
怎么快速创建新分支?
# 切换到本地的 main
git checkout main
# 创建并跳转到 feat-xxx 分支(新的 feat-xxx 从当前分支 main 打出)
git checkout -b feat-xxx
# 创建并跳转到 feat-xxx 分支(新的分支从 main 打出)
git checkout -b feat-xxx main
如何查看所有分支?
# 查看所有分支(包括远端分支)
git branch -a
如何拣选提交?
# 从 main 打出一个干净的功能分支 feat-xxx
git checkout -b feat-xxx main
# 查看 dev 分支的提交记录(推荐使用可视化工具)
git log dev
# 拣选一些功能并提交到 feat-xxx
git cherry-pick <commit-hash> <commit-hash>
如何关联远程分支?
git branch --set-upstream-to=origin/branch-1 branch-2
工程化实践
提交规范有什么用?
业界有许多成熟的 Git Commit Message 规范,主要目的是使“代码提交变得有意义”,这样一来,方便成员协作,有利于工程化实践以及提高美观度。
一个简单的提交规范示例?
我的提交规范:Dorothy
Quick Questions
草稿功能应该怎么使用?
如果你写代码时突然来了一个紧急线上 bug 要处理,而手头的改动又没写完,不适合直接提交,你可以将手头写好的代码存为草稿。
# 将所有改动保存到本分支下名为 <stash-description> 的草稿中,
# 加上 -u 参数后,文件的新增或删除操作也能一并存为草稿
git stash save -u <stash-description>
哼哧哼哧改为 bug 之后,找到并应用相应的草稿就可以回到初始状态了。
# 使用 list 指令查看有哪些草稿
git stash list
# 应用某草稿
git stash pop <stash-hash>
如何快速拷贝仓库代码?
有两种优化手段:仅拷贝某个分支或者拷贝前 n 次提交记录。
# 仅拷贝单分支
git clone --single-branch -b <branch-name> <repo-url>
# 下载 <branch-name> 分支前 n 个提交记录
git clone --single-branch -b <branch-name> --depth=<n> git@github.com:vuejs/vue.git
# 下载仓库默认分支前 n 个提交记录
git clone --depth=<n> git@github.com:vuejs/vue.git
怎么在命令行提交多行消息?
commit -m 是可以换行的!只要结尾不用引号,就不会中断输入。
git commit -m 'feat: brief message
detailed message'
怎么快速修正上一次提交?
如果涉及到文件的修改,需要使用 reset 重置提交。
# 撤销上一个提交,把所有修改都放到暂存区中(也就是还原回 git add . 后的状态)
git reset --soft HEAD~
# 再次提交
git commit -m <message>
如果只是修改提交信息,用 --amend 指令覆盖就好了。
# 把上个提交的提交信息修正为 <message>
git commit --amend -m <message>
reset --hard 有几种模式?
可以撤销 n 次提交,或者还原到具体的哈希标记的提交上,也可以还原为远端的某个提交。
# 撤销上一个提交(并丢弃所有修改)
git reset --hard
# 把分支还原到某个提交(并丢弃所有修改)
git reset --hard <hashname>
# 把分支还原设为远端的某个提交(并丢弃本地所有修改)
git reset --hard <repo-name>/<branch-name>
如何拯救因删除或还原造成丢失的信息?
git reflog 指令可以恢复已经被 reset 或删除的 commit 记录,但是并不保证一定成功,因为 git 有定期清理的策略。
如何清理最近几次提交?
可以使用 reset --soft 或者 rebase。使用 rebase 可以对前几次提交进行重新排序、修改提交消息或者进行压缩提交等操作。
# 修改近 <number> 次提交
git rebase -i HEAD~<number>
怎么对比文件历史?
推荐使用 VS Code Git History 插件,如果没条件的话,可以使用命令行。
# 1
git diff <hash-1> <hash-2>
# 2
git blame -L <line-start>,<line-end> <filename>
如何合并两个不相关分支?
git pull origin master --allow-unrelated-histories
如何忽略冲突快速合并?
git merge dev --strategy-option theirs
如何忽略特定提交?
- gitignore
设置好 .gitignore
文件后,所有匹配的文件都不会被继续追踪(已经追踪的不会被影响,除非先把它删掉)。
- update-index
git update-index --skip-worktree filename.js
git update-index --assume-unchanged package.json
- git filter
- rm
git rm --cached file1
git rm -r --cached <folder-name>
如何本地同步代码?
将 diff 文件输出,之后就可使用 apply 指令应用更改。
git diff > diff.patch
git apply diff.patch
如何跳过钩子?
git commit --no-verify -am 'bad commit message'
Common Issues
怎么记住 HTTPs 账号密码?
# 先执行再重试
git config --global credential.helper store
SSH 链接超时问题怎么解决?
可以使用以下指令来测试是否是 ssh 连接超时:
ssh -T git@github.com
如果提示超时,则到 ~/.ssh/ 文件夹下创建一个 config 文件,内容如下:
Host github.com
User lionad-trident
Hostname ssh.github.com
PreferredAuthentications publickey
IdentityFile C:\Users\18062\.ssh\id_rsa
Port 443
再次输入测试指令,会提示是否记录指纹,选择“yes”就好。
Reference Broken 问题?
好像是因为断电,我本地或者线上的仓库记录坏掉了,无法拉或推送代码。按照以下 Issue 设置后也没能解决。