原文是我用英文写的,我让gpt翻译了一下owo
让我们进行一些实践实验吧!你绝对想要看看DAG的运作!
首先,确保你已经安装了git。在Windows上,简单搜索并下载。在Linux上,使用你的包管理器,比如 sudo pacman -S git
或 sudo apt-get install git
。
mkdir git-dag # 创建一个新目录
cd git-dag # 进入该目录
git init # 初始化一个新的git仓库
仓库里现在还什么都没有。我们先创一个新文件,假设你正在做一个魔法证明。
echo "定理:这里发生了一些魔法。" > magic-proof.md
git status
你会看到
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git status
在分支 master 上
还没有提交
未跟踪的文件:
(使用 "git add <file>..." 来添加到提交中)
magic-proof.md
没有新内容被添加,但存在未跟踪的文件 (使用 "git add" 跟踪)
哦,git告诉我们这个文件是未跟踪的。让我们将其添加到暂存区并重新运行 git status
。
git add magic-proof.md # 将文件添加到暂存区
git status
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git status
在分支 master 上
将要提交的更改:
(使用 "git rm --cached <file>..." 来取消暂存)
new file: magic-proof.md
太好了,文件现在已经被暂存。让我们提交它,这样它就会作为我们DAG中的新顶点出现! >w<
git commit -m "初始提交:添加魔法定理。"
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git commit -m "初始提交:添加魔法定理"
[master (root-commit) ee464ad] 初始提交:添加魔法定理
1 文件更改过,1 次插入(+)
创建模式 100644 magic-proof.md
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git status
在分支 master 上
工作区干净,没有新的提交
现在我们已经在DAG中添加了一个顶点(提交)。让我们看看它!
git log --graph
# 你也可以使用 --oneline 标志来简化输出
git log --graph --oneline
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git log --graph
* commit ee464ad7f9d00972d4c15c0c8fff6ed92893a625 (HEAD -> master)
Author: Eiko <eikochanowo@outlook.com>
Date: 2024年12月8日 星期日 17:56:01 +0000
初始提交:添加魔法定理
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git log --graph --oneline
* ee464ad (HEAD -> master) 初始提交:添加魔法定理
看见那颗小点 *
吗?那是我们刚刚做出的提交对应的顶点。
提交哈希 ee464ad
是这个提交的唯一标识符,你可以用它来在未来引用这个顶点(提交)。
HEAD -> master
部分告诉我们我们当前在master
分支,并且这个分支指向最新的提交,即我们刚刚添加的顶点。
让我们通过添加一个新分支来扩展我们的DAG。
git checkout -b fire-magic
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git checkout -b fire-magic
切换到新分支 'fire-magic'
你可以看到发生了一些变化:
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git status
在分支 fire-magic 上
工作区干净,没有新的提交
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git log --graph
* commit ee464ad7f9d00972d4c15c0c8fff6ed92893a625 (HEAD -> fire-magic, master)
Author: Eiko <eikochanowo@outlook.com>
Date: 2024年12月8日 星期日 17:56:01 +0000
初始提交:添加魔法定理
现在的 HEAD -> fire-magic
部分告诉我们我们现在在 fire-magic
分支上。
当然,我们想要在这个分支上探索一些火魔法。
echo "证明:火魔法是最好的魔法。" >> magic-proof.md
git add magic-proof.md
git commit -m "添加使用火魔法的证明。"
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ echo "证明:火魔法是最好的魔法。" >> magic-proof.md
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git add magic-proof.md
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ cat magic-proof.md
定理:这里发生了一些魔法。
证明:火魔法是最好的魔法。
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git commit -m
错误:选项 `m` 需要一个值
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git commit -m "添加使用火魔法的证明。"
[fire-magic 90b98e8] 添加使用火魔法的证明。
1 文件更改过,1 次插入(+)
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git log --graph
* commit 90b98e846edb248e5c1b816fb78c76cf2eb20f1f (HEAD -> fire-magic)
| Author: Eiko <eikochanowo@outlook.com>
| Date: 2024年12月8日 星期日 18:17:06 +0000
|
| 添加使用火魔法的证明。
|
* commit ee464ad7f9d00972d4c15c0c8fff6ed92893a625 (master)
Author: Eiko <eikochanowo@outlook.com>
Date: 2024年12月8日 星期日 17:56:01 +0000
初始提交:添加魔法定理
哇哦,我们现在扩展了我们的DAG!fire-magic
分支有一个新顶点(提交),它是master
分支顶点的子节点。注意它是向上生长的(从旧到新)。
现在让我们切换回master
分支。
git checkout master
cat magic-proof.md # 来看看文件的内容
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ cat magic-proof.md
定理:这里发生了一些魔法。
酷,文件的内容回到了最初的定理。我们真的在我们的DAG中跳跃着探索不同的顶点!
如果我们做不同的更改会发生什么呢?比如,我想在master分支中添加一个推论,让fire-magic分支用于仅探索火魔法的证明。
echo "推论:一些魔法是非常有用的。" >> magic-proof.md
git add magic-proof.md
git commit -m "为魔法定理添加推论。"
现在我们在master
分支添加了一个新顶点。让我们看看DAG。
git log --graph --oneline --all
# --all用于显示所有分支
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git log --graph --oneline --all
* a979fa6 (HEAD -> master) 为魔法定理添加推论。
| * 90b98e8 (fire-magic) 添加使用火魔法的证明。
|/
* ee464ad 初始提交:添加魔法定理
这真是太棒了!看,fire-magic
分支和master
分支是从同一个顶点分叉出来的。fire-magic
分支正在探索使用火魔法的证明,而master
分支在原始定理上添加了一个推论,它们可以独立发展而不互相干扰!
你可以通过检出提交哈希直接跳回到原始顶点。
git checkout ee464ad
cat magic-proof.md
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ cat magic-proof.md
定理:这里发生了一些魔法。
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git log --graph --all --oneline
* a979fa6 (master) 为魔法定理添加推论。
| * 90b98e8 (fire-magic) 添加使用火魔法的证明。
|/
* ee464ad (HEAD) 初始提交:添加魔法定理
你可以看到我们的HEAD
现在指向原始顶点。
假设现在fire-magic分支已经完成,我们想将其合并回master分支,将它们统一为一个顶点。
为此,我们首先返回到master分支,然后将fire-magic分支合并到它上面。
git checkout master
git merge fire-magic
如果没有冲突,它将自动合并分支。对于我们的情况,既然我们在第二行做了不同的更改,会发生冲突。
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git merge fire-magic
自动合并 magic-proof.md
冲突 (内容):在 magic-proof.md 中存在合并冲突
自动合并失败;请修复冲突然后提交结果。
git
会识别到冲突并为我们标记,格式如下:
<<<<<<< HEAD
当前分支的内容。
=======
正在合并分支(fire-magic)的内容。
>>>>>>> fire-magic
你可以在编辑器中看到我们在文件中有冲突:
定理:这里发生了一些魔法。
<<<<<<< HEAD
推论:一些魔法是非常有用的。
=======
证明:火魔法是最好的魔法。
>>>>>>> fire-magic
你只需要根据自己的需要编辑文件,并移除冲突标记。之后,你可以添加文件并提交合并。
在这个情况下,我只需要推论紧随其后,所以我会相应调整,然后删除冲突标记和证明这一行。
定理:这里发生了一些魔法。
证明:火魔法是最好的魔法。
推论:一些魔法是非常有用的。
git add magic-proof.md
git commit -m "合并fire-magic分支。"
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git log --graph --oneline --all
* 6368dfa (HEAD -> master) 合并fire-magic分支。
|\
| * 90b98e8 (fire-magic) 添加使用火魔法的证明。
* | a979fa6 为魔法定理添加推论。
|/
* ee464ad 初始提交:添加魔法定理
哇!这太酷了!我们已经将分支合并回了一个单独的顶点,DAG现在又是一条直线了。
变基允许你通过将提取的“转换”应用到另一个顶点上,改变分支的基础。可以把它看作是从某个基础到当前点的“滑动”。
让我们添加一个ice-magic
分支,展示一个使用冰魔法的证明。
git checkout -b ice-magic
nvim magic-proof.md # 在我最喜欢的编辑器中添加使用冰魔法的证明
我在文件中添加了一个使用冰魔法的证明,然后添加并提交。
定理:这里发生了一些魔法。
证明:火魔法是最好的魔法。
证明 2:冰魔法是最好的魔法。
推论:一些魔法是非常有用的。
git add magic-proof.md
git commit -m "添加使用冰魔法的证明。"
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git log --graph --all --oneline
* 50a1c8c (HEAD -> ice-magic) 添加使用冰魔法的证明。
* 6368dfa (master) 合并fire-magic分支。
|\
| * 90b98e8 (fire-magic) 添加使用火魔法的证明。
* | a979fa6 为魔法定理添加推论。
|/
* ee464ad 初始提交:添加魔法定理
现在假设在master分支上也有一些新的并行开发。
git checkout master
nvim magic-proof.md # 在此添加一些新推论
定理:这里发生了一些魔法。
证明:火魔法是最好的魔法。
推论:一些魔法是非常有用的。
推论 2:一些魔法是非常危险的。
git add magic-proof.md
git commit -m "解释一些魔法的危险"
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git log --graph --all --oneline
* 21de518 (HEAD -> master) 解释一些魔法的危险
| * 50a1c8c (ice-magic) 添加使用冰魔法的证明。
|/
* 6368dfa 合并fire-magic分支。
|\
| * 90b98e8 (fire-magic) 添加使用火魔法的证明。
* | a979fa6 为魔法定理添加推论。
|/
* ee464ad 初始提交:添加魔法定理
我们可以清楚地看到分叉的开发。当然,我们可以合并这些分支,但让我们尝试如何使用 rebase
来“滑动” ice-magic 分支,使其从 master
分支的最新提交开始,而不是从 6368dfa
。
git checkout ice-magic
git rebase master
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git checkout ice-magic
切换到分支 'ice-magic'
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git rebase master
成功地进行了变基并更新了 refs/heads/ice-magic。
[eiko@EikoMagic14 ~/LocalDocuments/git-dag]$ git log --graph --all --oneline
* 9c31252 (HEAD -> ice-magic) 添加使用冰魔法的证明。
* 21de518 (master) 解释一些魔法的危险
* 6368dfa 合并fire-magic分支。
|\
| * 90b98e8 (fire-magic) 添加使用火魔法的证明。
* | a979fa6 为魔法定理添加推论。
|/
* ee464ad 初始提交:添加魔法定理
哇!现在冰魔法已经在master
分支的最新提交之上进行了变基!这真是太酷了!你可以看到ice-magic
分支现在是master
分支最新提交的子节点。
Git是一个DAG!你可以使用 git log --graph --all
查看DAG中的顶点和边。 --oneline
可以简化输出, --all
可以显示所有分支。
你可以使用 git checkout -b new-branch-name
创建一个新分支。
你可以使用 git checkout branch-name
在分支间切换。
务必要使用 git status
来查看你仓库的当前状态哦。
你可以通过 git add file-name
来跟踪并将文件添加到暂存区。
可用的快捷/方便选项有:
使用 git add .
来添加当前目录下的所有更改。但如果你不想添加所有更改或跟踪所有文件,这可能不是你想要的。
使用 git add -p
交互式地添加文件中的更改。这非常有用,因为你可以查看所有更改,你可能只想添加文件中的某些部分更改。
使用 git add file1 file2 directory1 directory2
同时添加多个文件和目录。
你可以使用 git commit -m "Commit message"
提交 已添加 的更改。
这将在DAG中创建一个新的顶点,表示该仓库当前的状态(上一个状态加上你添加的更改)。
你可以将分支合并到当前分支中,使用 git merge branch-name
。
如果存在冲突,你需要手动解决,然后添加和提交文件。
你可以使用 git rebase B
来变基一个分支。
这将“滑动”当前分支中的提交到目标分支 B
上。
其他工具:
尝试 git reflog
来查看你的HEAD移动历史。这就是你在DAG中的“旅行日志” >w<!我相信所有的法师都会需要这个!
尝试 gitk --all
来在图形界面中查看DAG。这是一个帮助你可视化DAG的GUI工具哦。
删除不好的提交(如果你意外提交了不想要的东西,这可能有用,但如果你已经将提交推送到远程仓库,不要使用它们):
如果你想要删除最后一个提交,可以使用 git reset HEAD~1
。这将删除最后一个提交,同时保留工作区中的更改。
如果你想同时删除最后一个提交和更改,可以使用 git reset --hard HEAD~1
。这将删除最后一个提交并丢弃工作区中的更改。