前一阵子整理一个 GitHub 项目,整得焦头烂额。
一个项目我只上传了一部分文件上去,等到想要上传剩下的部分时,却告诉我无法完成提交。
因为对 Git 的操作还不是特别熟练,所以我最后只能采用了一个笨方法:下载 GitHub Destop 拖拽式上传。
为了以后不再出现这种尴尬的事情,我决定好好复习 Git 知识。
于是,我就找到了这个有趣的 Git 练习网站:Learn Git Branching。
- Git For Branching 界面。还是非常美观的。
经过学习后,我发现我的问题可能是 2.8 节所指出的,远程服务器的拒绝。
以下是我学习过程整理的记录。
1. 主要内容
1.1 Git 的思路
Git Commit 的提交记录保存的是文件快照,类似复制粘贴。
通过 diffing 算法,将当前版本与上个版本比较,并将差异保存起来作为提交记录。
Git 保存了提交历史记录。
// 提交
git commit
1.2 Git Branch
Git Branch 的分支思路也非常轻量化,仅仅指向某个提交记录。
建议早建分支,多建分支。
建完分支后,要切换分支。可以用 checkout 命令。当然,checkout -b 可以创建的同时切换。
// 创建分支
git branch newImage
git commit
// 切换分支
git checkout newImage
git commit
// 创建并切换分支
git checkout -b bugFix
1.3 Git Merge
Git Merge 用于合并两个分支,会产生一个特殊节点,包含两个父节点。
// 当前分支与目标分支合并
git merge bugFix
git checkout bugFix
git merge main
// 由于 main 的一个父节点是 bugFix
// 换句话说,main 继承自 bugFix
// 所以 Git 什么也没做
1.4 Git Rebase
Git Rebase 也是一种合并分支的方法。取出一系列提交记录,复制并放在另一个地方。
// 合并分支,得到线性提交序列
git rebase main
git checkout main
git rebase bugFix
// 由于bugFix 继承自 main,所以 Git 只是简单前移了 main
1.5 如何在提交树上移动
HEAD:你目前正在工作的提交记录,一般指向当前分支的最近一次提交记录。
查看 HEAD 指向可以用 cat .git/HEAD。
// 调整 HEAD 指向具体的提交记录,而不是分支
git checkout C1
1.6 相对引用
通过指定提交记录的哈希值移动 HEAD 不是很方便,因为哈希值都很长。
可以用 Log 查看提交记录的哈希值。
相对引用就是可以从一个容易记忆的地方移动 HEAD。^
向上移动一个提交记录如main^
,~<num>
向上移动多个提交记录,如~3
。
也可以用 HEAD 作为相对引用的参照。
使用相对引用最多的是移动分支,可以在 Branch 上加一个 -f 改变分支指向的提交节点。
// 查看日志
git log
// 找到 main 的父节点
git checkout main^
// 找到 HEAD 的父节点
git checkout HEAD^
// 让 main 分支指向 HEAD 的第三级父提交节点
// 可以说,git branch -f 和 git branch 内容都不一样
// git branch 是创建分支,而 git branch -f 是改变分支指向提交节点
git branch -f main HEAD~3
// 注意,不能写 git branch -f HEAD HEAD^,因为没有这个分支
// 只能用 checkout 调整 HEAD
git checkout HEAD^
1.7 撤销变更
可以通过 Reset 和 Revert 撤销变更。
Reset 相当于撤销历史。通过它可以回退本地的提交节点。但是无法处理远程分支。
Revert 用于撤销远程提交。这个过程引入了新的提交节点,因为这个节点做的事情是撤销上个提交节点的内容,所以和上上个节点的内容是一样的。
// 回退本地提交。只针对 local。
git reset HEAD~1
// 撤销远程提交。只针对 pushed。
git revert HEAD
1.8 整理提交记录
整理提交记录在处理复杂请求时十分重要。
Cherry-pick 可以用于将指定提交节点复制到 HEAD 分支上。
也可以用交互式