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 的核心工作流程:
- 工作区:你当前正在编辑的文件和目录,是你在本地文件系统中看到的实际内容。
- 暂存区:通过
git add命令将工作区的修改添加到暂存区,准备提交。暂存区是一个中间状态,允许你选择性地提交部分修改。 - 版本库:通过
git commit命令将暂存区的内容提交到版本库,形成一个新的版本。版本库保存了项目的完整历史记录。
这三棵树的关系是:工作区 -> 暂存区 -> 版本库。
最基本的指令:add, commit, push, pull
以下是 Git 最基本的指令及其作用:
git add将工作区的修改添加到暂存区。 示例:git add <file> # 添加指定文件 git add . # 添加所有修改git commit将暂存区的内容提交到版本库,生成一个新的版本。 示例:git commit -m "提交信息" # 提交并添加描述 git commit --amend # 可以用于 commit 并将这个新的 commit 整合到上一个旧的 commit 里,这样就不会创建没有用的 commitgit push将本地版本库的提交推送到远程仓库。 示例:git push origin <branch> # 推送到指定分支git pull从远程仓库拉取最新更改并合并到本地分支。 示例:git pull origin <branch> # 拉取指定分支的更新
这些指令构成了 Git 日常使用的基础工作流。
submodule
让我们以一个案例来说明:
要将 ~/org/roam/novels 转化为 Git 子模块,步骤如下:
创建新的 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
- 在
*将
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"
- 回到
同步子模块:
- 克隆或更新仓库时,使用
--recurse-submodules选项:git clone --recurse-submodules <your-repo-url> - 或者手动初始化子模块:
git submodule update --init --recursive
- 克隆或更新仓库时,使用
完成这些步骤后,=novels= 文件夹就成为了一个独立的 Git 子模块。
rebase
git rebase 用于将当前分支的提交移动到另一个分支的顶端,常用于整理提交历史或合并分支。以下是常见用法:
- 交互式变基(整理提交历史):
git rebase -i <commit-hash>可以编辑、合并、删除提交。
变基时可用的操作有:
p: 保留提交(默认)。r: 修改提交信息。e: 编辑提交内容。s: 将提交压缩到前一个提交中。f: 类似s,但丢弃提交信息。d: 删除提交。/变基到目标分支/:
git rebase <target-branch>将当前分支的提交移动到目标分支的顶端。
/解决冲突/: 变基过程中如果发生冲突,解决冲突后执行:
git add <resolved-files> git rebase --continue若要取消变基,执行:
git rebase --abort/强制推送/: 变基后需要强制推送到远程仓库:
git push --force
注意:变基会重写提交历史,避免在公共分支上使用。