1.基础命令
1.init
git init
git clone ${url}
2.compare
git log
git reflog
git status -s
git diff ${filePath}
3.add
git add .
git add ${file}
git commit -m "${summary}"
git commit -a
git commit --amend
4.remove
rm -rf .git
git checkout ${filePath}
git reset --soft HEAD^
git reset --soft ${commitID}
git reset --hard HEAD
git reset HEAD --hard
git revert ${commitID}
5.branch
git branch
git branch ${branchName}
git checkout ${branchName}
git checkout -b ${branchName}
git branch -d ${branchName}
git push origin --delete ${branchName}
git branch -r
git checkout ${remoteBranchName}
git checkout -b ${localBranchName} ${remoteReposityoryName}/${remoteBranch}
git push ${remoteRepositoryName} --delete ${remoteBranchName}
git push -u origin ${BranchName}
6.tag
git tag -a v1.0 -m "my version 1.0"
git push origin :refs/tags/[tagName]
7.cherry-pick
git cherry-pick ${commitID}
8.stash
git stash
git stash apply
git pop
git stash save 'xxx'
git stash list
git stash show
git stash show stash@{0} -p
git stash apply stash@{0}
git stash pop stash@{0}
git stash drop stash@{0}
git stash clear
6.push pull
git push
git pull
git remote add
git push -u origin main -f
git pull --rebase origin main
7.merge
git reset --merge
git checkout -- *
git merge --abort
git reset --merge
git merge ${branch}
git merge ${branch} --squash
8.rebase
git pull --rebase
git rebase master
git rebase -i HEAD~3
10.other
git help ${verb}
git ${verb} -h
2.撤销提交
1.git reset
# 1.撤销最近的几次提交
# 一共有三种形式: soft mixed hard
# mixed 会保存在工作区
# sort 会保留在暂存区
# hard 不会保存文件变更
git reset –soft HEAD^
git reset –soft HEAD^3
# 2.重置到某次提交 之前的都会被重置
git reset –soft ${commitId}
git push -f orgin develop
2.git revert
## 重置一次提交的代码
git revert ${commitId}
3.rebase
状态介绍
- 常用的有
- reword 更换commit -m 的信息
- squash 合并提交记录
- drop 删除提交记录
git rebase
- 输入命令后会进入这样一个框
# 编辑最近两条commit的状态
git rebase -i HEAD~2
# 指定commit记录
git rebase -i ${commitId}
修改记录
- 通过 i 进入编辑状态
- 将想要删除的commit 前面的pick修改为 drop 或者 d
- esc + :wq 退出编辑状态
修改完成
git push -f origin develop
2.rebase
删除记录
- 参考 2.3 部分
合并多条记录
- 输入 git rebase -i HEAD~5 后编辑最近5条记录
# 编辑最近两条commit的状态
git rebase -i HEAD~2
# 指定commit记录
git rebase -i ${commitId}
- 通过 i 进入编辑状态
- 将除了第一条之外的 commit 记录更换为 squash 或者 s
- squash 页脚会有合并的记录说明
- fixup 页脚不会有合并的记录说明
- esc + :wq 退出编辑状态
- 随后会自动进入第二个编辑框 在这里可以重新编辑 commit 信息
- 通过 i 进入编辑状态
- esc + :wq 退出编辑状态
- 然后我们就可以看到编辑成功了
- 然后我们使用 git push -f 覆盖提交 就ok了
- 如果需要撤回 我们 git checkout master 就好了
git push -f origin master
更换commit信息
- 与上一条合并多条记录类似
- 不同的是 将 squash 更换为 reword
- 在第二个框修改成你想要的信息就好了
git pull --rebase origin master
- 和merge的不同的是 不会生成一条合并多余的提交记录
- 如果发生冲突 需要自己处理冲突
# 继续修改下一个文件冲突
git rebase --continue
# 放弃本次 rebase 操作
git rebase --abort
3.团队合作规范
分支介绍
- 一般代码分支为
- develop 测试分支
- feature/{userName} 个人开发分支
- 需要从 master 作为基础分支 创建分支
- 因为develop存在未上线内容等原因导致测试生产代码不一致
- 所以需要定期重置develop分支 或者自行删除无用的代码
- 需要从 master 作为基础分支 创建分支
- release_pre
- uat 预发布环境
- 与生产数据相同或 定期导入
- 主要面向要交付的人员进行验证测试
- release
- 与master的不同是 只可内网访问
- 通过 创建合并请求 最后统一合并到生产分支
- master
- 外网可直接访问 直接面向外部用户的环境
- hotfix
- 修改生产bug分支
- 从release拉取
开发流程
开发人员通常从 master 或 release 分支作为基础分支 创建自己的 feature/{userName} 个人开发分支
- 这时候多人协作可能需要拉取其他人提交的代码(未提交到生产)
- 简单的功能,每个功能都是单独的 git 提交 ,所以 cherry-pick 他的那个commit即可
- 复杂的功能
- 两个人新增一个 feature/临时分支 共同开发公共内容
- 在自己的分支开发 相关的内容同步到 feature/临时分支
- 1.cherry-pick
- 2.rebase
- git checkout feature/我的分支
- git rebase feature/临时分支 拉取最新的代码并处理冲突
- 在自己分支自测介绍后 通过
- git checkout develop && git merge feature/我的分支 --squash 合并成一条记录提交代码到测试环境
- 修复bug
- 在自己分支和测试分支都提交下
- 测试通过 合并到预发布uat环境
- git checkout release_pre && git merge feature/我的分支 --squash
- 合并到release分支
- git checkout release && git merge release_pre --default
- 注意不要使用 git merge --squash 这样会导致后续 从release新建开发分支然后合并到release_pre产生冲突
- git checkout release && git merge release_pre --default
- 如果需要撤回代码 突然不需要上线了
- git revert ${commitID}
- git rebase -i ${commitId}
- git push -f --orgin release_pre
- 在gitlab等平台创建合并请求进行合并 到最终的master分支
- 创建tag
- 修复bug
- 在release分支创建 hotfix分支
- 修复问题
- fix: xxx(#issues编号)
- 创建tag
- 创建合并请求进行合并 到最终的master分支
注意事项
- 善用cherry-pick命令 最好一个功能点一个提交 进行合理的拆分
- git commit 需要遵循规范
- git 仓库管理通过正则等限制非法提交
- 项目使用 conventional-commits 限制提交规范
- www.conventionalcommits.org/zh-hans/v1.…
- husky 处理代码风格规范
- rebase 只在自己的分支使用
- 开源项目为了保持一条线 往往需要 rabase 自己分支 将记录打平 按照时间排序 日常项目开发不推荐这样
- 从自己的分支 合并到测试环境时
- 很少提交直接使用 cherry-pick
- 不要使用 git merge --default 会导致测试分支线很乱
- 使用 git merge --squash 命令 合并自己的提交记录
- 或者使用 git rebase 将自己记录合并好了. 然后在develop上 git merge feature/自己的分支
- 合并到release环境时
- 不要使用git merge --squash 这样会导致后续有冲突 这里不需要保持一条记录
- 需要使用 git merge --default 理论上 release 和 release_pre 的代码都是相同的
- master分支 只允许合并请求合入 需要打tag
4.其他
发起pr
clone 开源的仓库
git remote -v
// 建立链接
git remote add upstream https://github.com/xxx.git
建立新的分支
git checkout -b hotfix:xxx
修改内容
git add . git commit git push
在github上 点击合并 pull requests
git clone --depth=1
- 开源项目很大 使用--depth=1只克隆最后一次提交
diff3
git config --global merge.conflictstyle diff3
# 删除配置
git config --global --unset merge.conflictstyle
查看仓库代码提交行数
git log -format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
5.推荐的GUI工具
fork
- git-fork.com/
- 免费的 直接点就能下载 忽略49.99美元
vscode gitlens
- 付费破解
# 1. 下载压缩包
https://github.com/gitkraken/vscode-gitlens
# 2.pnpm i
# 3.npm i -g rimraf
# 4.yarn run rebuild
# 代码中找到 computeSubscriptionState 函数
# 直接返回 return SubscriptionState.Paid;
# yarn run package
# 一切顺利的话能在文件夹内找到一个vsix文件。直接安装即可
# 安装后可能仍然提示试用在几天后过期,此时直接将时间调至过期后时间(如一年后)并重启VSCode以触发逻辑,随后调回正常时间。此时应该就可以无限试用了