ESC
输入关键词搜索文章
目录

git

+++ title = "git" author = ["xinyu"] date = 2025-02-02T22:35:52+01:00 tags = ["draft"] draft = false toc = true custom_css = ["css/progress_bar.css"] custom_js = ["js/components/progress_bar.js"] mathjax = false +++

基础解释

三棵树

Git 中的“三棵树”指的是工作区(Working Directory)、暂存区(Staging Area)和版本库(Repository)。这三者构成了 Git 的核心工作流程:

  1. 工作区:你当前正在编辑的文件和目录,是你在本地文件系统中看到的实际内容。
  2. 暂存区:通过 git add 命令将工作区的修改添加到暂存区,准备提交。暂存区是一个中间状态,允许你选择性地提交部分修改。
  3. 版本库:通过 git commit 命令将暂存区的内容提交到版本库,形成一个新的版本。版本库保存了项目的完整历史记录。

这三棵树的关系是:工作区 -> 暂存区 -> 版本库。

最基本的指令:add, commit, push, pull

以下是 Git 最基本的指令及其作用:

  1. git add 将工作区的修改添加到暂存区。 示例:

          git add <file>  # 添加指定文件
          git add .       # 添加所有修改
    
  2. git commit 将暂存区的内容提交到版本库,生成一个新的版本。 示例:

          git commit -m "提交信息"  # 提交并添加描述
          git commit --amend # 可以用于 commit 并将这个新的 commit 整合到上一个旧的 commit 里,这样就不会创建没有用的 commit
    
  3. git push 将本地版本库的提交推送到远程仓库。 示例:

          git push origin <branch>  # 推送到指定分支
    
  4. git pull 从远程仓库拉取最新更改并合并到本地分支。 示例:

          git pull origin <branch>  # 拉取指定分支的更新
    

这些指令构成了 Git 日常使用的基础工作流。

submodule

让我们以一个案例来说明:

要将 ~/org/roam/novels 转化为 Git 子模块,步骤如下:

  1. 创建新的 Git 仓库

    • ~/org/roam/novels 中初始化一个新的 Git 仓库:
                cd ~/org/roam/novels
                git init
                git add .
                git commit -m "Initial commit"
      
    • 将这个仓库推送到远程(如 GitHub):
                git remote add origin <remote-repo-url>
                git push -u origin main
      
  2. *将 novels 转化为子模块*:

    • 回到 ~/org 目录,删除 novels 文件夹:
                cd ~/org
                rm -rf roam/novels
                git add .
                git commit -m "submodulize roam/novels"
      
    • 添加子模块:
                git submodule add <remote-repo-url> roam/novels
                git commit -m "Add novels as submodule"
      
  3. 同步子模块

    • 克隆或更新仓库时,使用 --recurse-submodules 选项:
                git clone --recurse-submodules <your-repo-url>
      
    • 或者手动初始化子模块:
                git submodule update --init --recursive
      

完成这些步骤后,=novels= 文件夹就成为了一个独立的 Git 子模块。

rebase

git rebase 用于将当前分支的提交移动到另一个分支的顶端,常用于整理提交历史或合并分支。以下是常见用法:

  1. 交互式变基(整理提交历史):
          git rebase -i <commit-hash>
    

    可以编辑、合并、删除提交。

变基时可用的操作有:

注意:变基会重写提交历史,避免在公共分支上使用。