Ch3nyang's blog collections_bookmark

post

person

about

category

category

local_offer

tag

rss_feed

rss

再谈git

calendar_month 2024-06
archive 工具
tag git

简单介绍我自己的 Git 和 GitHub 工作流。部分流程不是绝对的,只是我自己的一些习惯,仅供参考。

向远程仓库提交代码

  1. 将项目 Clone 到本地:

    git clone https://github.com/项目.git
    
  2. 创建一个新分支并切换到该分支:

    git checkout -b 功能名称
    
  3. 对文件进行修改。

  4. 确认修改的文件:

    git diff
    
  5. 如果确认没有问题,提交修改:

    git add 文件名
    git commit -m "提交信息"
    

    如果修改了多处内容,尽量每修改完一处后执行一次 git addgit commit

  6. 如果在修改过程中,远程仓库有了新的提交,需要先将远程仓库的修改拉取到本地:

    git checkout main
    git pull origin main
    

    如果你不确信你的 git 是否正确设置了 pull 的行为,最好先执行 git fetch,然后再执行 git merge

    然后将主分支的修改合并到你的分支:

    git checkout 你的分支名称
    git rebase main
    

    这里尽量不去使用使用 merge

    如果有冲突,需要解决冲突后再 rebase

  7. 然后再推送到远程仓库:

    git push origin 你的分支名称
    
  8. 在 GitHub 上 New Pull Request,等待仓库管理员审核后,即可合并到主分支。

  9. 合并后,删除你自己的分支:

    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 来管理大文件。

  1. 安装 Git LFS:

    git lfs install
    
  2. 选择需要使用 Git LFS 管理的文件类型:

    git lfs track "*.文件类型"
    git add .gitattributes
    git commit -m "Add LFS"
    
  3. 将文件转换为 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

Share This Post