再谈git
简单介绍我自己的 Git 和 GitHub 工作流。部分流程不是绝对的,只是我自己的一些习惯,仅供参考。
向远程仓库提交代码
-
将项目 Clone 到本地:
git clone https://github.com/项目.git
-
创建一个新分支并切换到该分支:
git checkout -b 功能名称
-
对文件进行修改。
-
确认修改的文件:
git diff
-
如果确认没有问题,提交修改:
git add 文件名 git commit -m "提交信息"
如果修改了多处内容,尽量每修改完一处后执行一次
git add
和git commit
。 -
如果在修改过程中,远程仓库有了新的提交,需要先将远程仓库的修改拉取到本地:
git checkout main git pull origin main
如果你不确信你的 git 是否正确设置了
pull
的行为,最好先执行git fetch
,然后再执行git merge
。然后将主分支的修改合并到你的分支:
git checkout 你的分支名称 git rebase main
这里尽量不去使用使用
merge
。如果有冲突,需要解决冲突后再
rebase
。 -
然后再推送到远程仓库:
git push origin 你的分支名称
-
在 GitHub 上
New Pull Request
,等待仓库管理员审核后,即可合并到主分支。 -
合并后,删除你自己的分支:
git checkout main git branch -d 你的分支名称 git push origin --delete 你的分支名称
下次再提交时,记得先更新你的仓库:
git pull origin main
然后再从第 2 步开始。
撤销操作
撤销文件的修改
git restore 文件名
git checkout -- 文件名
同样可以撤销文件的修改,但是记得要加上--
,否则在有同名分支的情况下,可能会出现问题。
撤销 add
git restore --staged 文件名
git reset 文件名
同样可以撤销add
。但更推荐使用git restore
。
如果不但想撤销 add
,还想撤销文件的修改:
git checkout HEAD 文件名
撤销 commit
git reset --soft HEAD~1
如果要把 add
也一并撤销:
git reset --mixed HEAD~1
也可以简写为
git reset HEAD~1
。
如果要把 add
和文件的修改全都一并撤销:
git reset --hard HEAD~1
撤销 push
push
不能直接撤销,如果希望撤销某个 push
,可以使用 revert
创建一个新的提交,来撤销之前的提交:
git revert 提交编号
git push
提交编号
可以通过git log
查看。
在个人项目的情况下,也可以更加简单,直接覆盖远程仓库:
git reset --hard HEAD~1
git push -f
其它操作
stash
暂存
如果临时需要切换分支,但是又不想提交当前的修改,可以使用 stash
暂存当前的修改:
git stash
恢复暂存可以使用 pop
:
git stash pop
删除暂存可以使用 drop
:
git stash drop
结对提交
在 commit
时,可以使用 Co-authored-by
来标记多个作者1:
git commit -m "提交信息
Co-authored-by: 合作者用户名1 <合作者邮箱1>
Co-authored-by: 合作者用户名2 <合作者邮箱2>"
补充提交
如果在提交后发现有遗漏,可以使用 commit --amend
来补充提交:
git add 文件名
git commit --amend
Git LFS
如果项目中有大文件,可以使用 Git LFS 来管理大文件。
-
安装 Git LFS:
git lfs install
-
选择需要使用 Git LFS 管理的文件类型:
git lfs track "*.文件类型" git add .gitattributes git commit -m "Add LFS"
-
将文件转换为 LFS:
git rm --cached *.文件类型 git add *.文件类型 git commit -m "Convert to LFS"
如果已经
commit
过,则需要使用migrate
:git lfs migrate import --include="*.文件类型" git push --force
Git Submodule
如果项目中有子模块,可以使用 Git Submodule 来管理子模块。
-
添加子模块:
git submodule add 子模块地址 子模块路径 git add .gitmodules 子模块路径 git commit -m "Add submodule"
-
克隆包含子模块的项目:
git clone --recurse-submodules <项目地址>
-
更新子模块:
git submodule update --remote
-
删除子模块:
git submodule deinit 子模块路径 git rm 子模块路径 rm -rf .git/modules/子模块路径
如果是多个子模块,可以使用
git submodule foreach
。
仓库管理
合并 Pull Request
推荐使用 Squash and merge
,这样可以将多次提交合并为一次提交,保持主分支的提交记录整洁。
行为准则与参与指南
在仓库的 .github/CODE_OF_CONDUCT
和 .github/CONTRIBUTING
中,可以添加行为准则与参与指南。
Pull Request 模板
在 .github
目录下创建 PULL_REQUEST_TEMPLATE.md
文件,可以为 PR 添加模板。
通常会包括任务列表、实现的 Issue 等。
Issue 模板
在 .github
目录下创建 ISSUE_TEMPLATE.md
文件,可以为 Issue 添加模板。
如果需要多个模板,可以在 .github
目录下创建 ISSUE_TEMPLATE
目录,然后在该目录下创建多个模板文件。
同时,还可以使用配置文件 config.yml
来配置 Issue 模板,这可以在 New Issue
页面直接选择模板或访问链接。例如:
blank_issues_enabled: false
contact_links:
- name: 我的链接
url: https://example.com
about: 有关我的链接的描述
目前,GitHub 还支持了 Issue 表单,可以将 .md
文件替换为 .yml
文件,然后在其中配置表单。例如2:
name: Bug Report
description: File a bug report.
title: "[Bug]: "
labels: ["bug", "triage"]
projects: ["octo-org/1", "octo-org/44"]
assignees:
- octocat
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to fill out this bug report!
- type: input
id: contact
attributes:
label: Contact Details
description: How can we get in touch with you if we need more info?
placeholder: ex. <[email protected]>
validations:
required: false
- type: textarea
id: what-happened
attributes:
label: What happened?
description: Also tell us, what did you expect to happen?
placeholder: Tell us what you see!
value: "A bug happened!"
validations:
required: true
- type: dropdown
id: version
attributes:
label: Version
description: What version of our software are you running?
options:
- 1.0.2 (Default)
- 1.0.3 (Edge)
default: 0
validations:
required: true
- type: dropdown
id: browsers
attributes:
label: What browsers are you seeing the problem on?
multiple: true
options:
- Firefox
- Chrome
- Safari
- Microsoft Edge
- type: textarea
id: logs
attributes:
label: Relevant log output
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
render: shell
- type: checkboxes
id: terms
attributes:
label: Code of Conduct
description: By submitting this issue, you agree to follow our [Code of Conduct](https://example.com).
options:
- label: I agree to follow this project's Code of Conduct
required: true
GitHub Actions
GitHub Actions 可以用来自动化工作流程,例如自动测试、自动部署等。
可以在 .github/workflows
目录下创建 .yml
文件,来配置工作流程。详情见文档。
Comments