5.git

235 阅读6分钟

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 删除提交记录

截屏2024-03-17 14.56.18.png

git rebase

  • 输入命令后会进入这样一个框
# 编辑最近两条commit的状态
git rebase -i HEAD~2
# 指定commit记录
git rebase -i ${commitId}

截屏2024-03-17 14.58.09.png

修改记录

  • 通过 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}

截屏2024-03-17 15.12.08.png

  • 通过 i 进入编辑状态
  • 将除了第一条之外的 commit 记录更换为 squash 或者 s
    • squash 页脚会有合并的记录说明
    • fixup 页脚不会有合并的记录说明
  • esc + :wq 退出编辑状态

截屏2024-03-17 15.15.27.png

  • 随后会自动进入第二个编辑框 在这里可以重新编辑 commit 信息
    • 通过 i 进入编辑状态
    • esc + :wq 退出编辑状态

截屏2024-03-17 15.16.15.png

  • 然后我们就可以看到编辑成功了

截屏2024-03-17 15.18.21.png 截屏2024-03-17 15.18.52.png

  • 然后我们使用 git push -f 覆盖提交 就ok了
  • 如果需要撤回 我们 git checkout master 就好了
git push -f origin master

更换commit信息

  • 与上一条合并多条记录类似
  • 不同的是 将 squash 更换为 reword
  • 在第二个框修改成你想要的信息就好了

git pull --rebase origin master

  • 和merge的不同的是 不会生成一条合并多余的提交记录

截屏2024-03-17 15.23.42.png

  • 如果发生冲突 需要自己处理冲突
# 继续修改下一个文件冲突
git rebase --continue
# 放弃本次 rebase 操作
git rebase --abort

3.团队合作规范

分支介绍

  • 一般代码分支为
    • develop 测试分支
    • feature/date{date}-{userName} 个人开发分支
      • 需要从 master 作为基础分支 创建分支
        • 因为develop存在未上线内容等原因导致测试生产代码不一致
        • 所以需要定期重置develop分支 或者自行删除无用的代码
    • release_pre
      • uat 预发布环境
      • 与生产数据相同或 定期导入
      • 主要面向要交付的人员进行验证测试
    • release
      • 与master的不同是 只可内网访问
      • 通过 创建合并请求 最后统一合并到生产分支
    • master
      • 外网可直接访问 直接面向外部用户的环境
    • hotfix
      • 修改生产bug分支
      • 从release拉取

开发流程

开发人员通常从 master 或 release 分支作为基础分支 创建自己的 feature/date{date}-{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 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 需要遵循规范
  • 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美元

截屏2024-03-17 16.27.49.png

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以触发逻辑,随后调回正常时间。此时应该就可以无限试用了

截屏2024-03-17 17.19.10.png

截屏2024-03-17 17.16.25.png

6.参考链接