Best Practice
发表于:2025-05-14 | 分类: Tool Git
字数统计: 861 | 阅读时长: 3分钟 | 阅读量:

最佳实践

初始化远程仓库

前提:需要在 github 中设置好账号或仓库的公钥。

  • 推送新建仓库
1
2
3
4
5
6
7
8
9
10
11
12
# 初始化
git init
git config user.name "USERNAME"
git config user.email "XXX@github.com"
# 本地提交
touch README.md
git add README.md
git commit -m "init"
# 关联远程仓库并提交
git remote add origin git@github.com:USERNAME/REPO.git
git push -u origin master
git remote show origin
  • 推送已存在仓库
1
2
3
4
# 关联远程仓库并提交
git remote add origin git@github.com:USERNAME/REPO.git
git push -u origin master
git remote show origin

比较差异

1
2
3
4
5
6
7
8
9
10
11
12
13
# 工作区修改
git diff
git diff FILE_NAME

# 暂存区修改
git diff --cached
git diff --staged

# 提交版本
git diff HASH_VALUE

# 指定文件指定提交的差异
git diff HASH_VALUE FILE_NAME

变基

  • 优先选择 merge
  • 不要在 master / main 分支上 rebase,这是默认分支。
  • 总是在本地分支上 rebase,在远程也有的分支上进行 rebase 很可能会影响协作。

依赖仓库

推荐使用 subtree ,而不是 submodule

  • submodule : 仅保存子模块的引用而不保存其代码,无法修改提交到子模块仓库,未提供直接删除子模块的命令。
  • subtree : 主仓库会克隆一份依赖仓库代码,可对主仓库和依赖仓库进行修改提交。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 添加依赖仓库
git remote add SUBTREE-ORIGIN https://github.com/USERNAME/SUBTREE.git
git remote show
git subtree add --prefix=SUBTREE_FOLDER SUBTREE-ORIGIN master --squash
git push

# 拉取依赖仓库
git subtree pull --prefix=SUBTREE_FOLDER SUBTREE-ORIGIN master --squash
# 推送依赖仓库修改到依赖仓库
git subtree push --prefix=SUBTREE_FOLDER SUBTREE-ORIGIN master
# 切割部分代码来作为新的依赖仓库(会统计所有相关提交信息)
git subtree split --prefix=SUBTREE_FOLDER SUBTREE-ORIGIN master
# 依赖仓库日志
git log SUBTREE-ORIGIN

误提交

cherry-pick 的目标场景用于处理本应在其他分支上进行的误提交。

1
2
# 按提交顺序先后应用,会依次生成提交
git cherry-pick HASHCODE

提交定位

主要用于通过二分查找定位某些修改是哪次提交引入的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 检查提交历史
git log --pretty=oneline
# 指定二分查找范围,会切换到这段范围中间的那一次提交状态
git bisect start HEAD 4d83cf
# 前半段没问题(4d83cf, half),自动切换到后半段的中点
git bisect good
# 前半段有问题(4d83cf, half),自动切换到前半段的中点
git bisect bad

# 不断重复,直到最后,提示:
# b47892 is the first bad commit

# 退出到最新提交状态
git bisect reset

回退修改

未暂存

回退工作区修改,即未使用 git add xxx

1
2
3
4
5
6
7
8
9
10
11
# 回退单文件修改
# 旧语法
git checkout -- FILENAME
# 推荐语法
git restore FILENAME

# 回退所有文件修改
# 旧语法
git checkout -- .
# 推荐语法
git restore .

已暂存

回退暂存区修改,但未使用 git commit。需要先从暂存区撤销,再丢弃工作区修改:

1
2
3
4
5
6
7
8
9
10
11
# 回退单个文件暂存
# 旧语法
git reset HEAD FILENAME
# 推荐语法
git restore --staged FILENAME
# 丢弃工作区修改
git restore FILENAME

# 回退所有文件暂存
git restore --staged .
git restore .

已提交&未推送

1
2
3
4
5
6
# 查看提交历史
git log --oneline
# 回退到目标版本,修改会保留在工作区
git reset --soft HASHID
# 回退到目标版本,丢弃后续所有修改
git reset --hard HASHID

已推送

不会删除历史提交。

1
2
3
4
5
6
# 查看提交历史
git log --oneline
# 撤销提交,生成新 commit,抵消目标提交的修改
git revert HASHID
# 重新推送
git push origin BRANCHNAME
上一篇:
Submodule
下一篇:
Setup