创建一个新的分支同时切换到新创建的分支
git checkout -b new-branch 或 git switch -c new-branch
合并两个分支(将B合并到A)
git merge B // 操作在A分支(连线模式)
git rebase A // 操作在B分支(复制模式)
/*注意:
当你知道你所需要的提交记录(并且还知道这些提交记录的哈希值)时, 用 cherry-pick 再好不过了
*/
- merge图示:
- rebase图示:提交记录C3依然存在(树上那个半透明的节点),而C3'是我们Rebase到main分支上的C3 的副本。
操作符 ^ 与 ~ 符一样,后面也可以跟一个数字。
但是该操作符后面的数字与 ~ 后面的不同,并不是用来指定向上返回几代,而是指定合并提交记录的某个 parent 提交。还记得前面提到过的一个合并提交有两个 parent 提交吧,所以遇到这样的节点时该选择哪条路径就不是很清晰了。
Git 默认选择合并提交的“第一个” parent 提交,在操作符 ^ 后跟一个数字可以改变这一默认行为。
相对引用^(1个) 与~
git checkout HEAD^ //向上移动 1 个提交记录
git checkout HEAD^^ //向上移动 2 个提交记录, 依次累加
git checkout HEAD~ //向上移动 1 个提交记录
git checkout HEAD~3 //向上移动 3 个提交记录
git branch -f main HEAD~3 // 将 main 分支强制指向 HEAD 的第 3 级 parent 提交
/*
注意:
git checkout 移动的只能是HEAD指向的位置, 要移动main指向的位置,需要使用git branch与HEAD结合使用
*/
git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。
git revert 通过新引入一个版本用于后续修改,新的版本与废弃版本的父版本一致,不影响提交的历史记录
-
本地使用git reset HEAD~1(前一个结点)
-
远程使用git revert HEAD(当前节点)
git cherry-pick B D// 在父节点上单独拎出若干子节点按照自定义顺序重新排序
- cherry-pick图示:git cherry-pick C2 C4
如果你不清楚你想要的提交记录的哈希值
交互式 rebase 指的是使用带参数--interactive的rebase 命令,简写为-i
如果你在命令后增加了这个选项,Git 会打开一个U 界面并列出将要被复制到目标分支的备选提交记录,它还会显示每个提交记录的哈希值和提交说明,提交说明有助于你理解这个提交进行了哪些更改。
在实际使用时,所谓的 UI 窗口一般会在文本编辑器-如 Vim - 中打开一个文件。 考虑到课程的初衷,我弄了一个对话框来模拟这些操作。
当rebase UI界面打开时,你能做3件事:
·调整提交记录的顺序(通过鼠标拖放立空成、
·删除你不想要的提交(通过切换
合并提交。 遗憾的是由于某种逻辑允许你把多个提交记录合并成一个
(349,58)
66,
66,
66
关闭就意味着你不想要这个提交记录)
是不支持此功能,因此我不会详细介绍这个操作。简而言之,它
git rebase -i HEAD~3
git commit --amend 是 Git 中的一个命令,它允许你修改(即修正或替换)最近一次提交的内容和/或提交消息。这个命令会将当前暂存区中的所有改动与上一次提交合并,并且可以重新编辑提交信息。这意味着你可以更改代码、添加遗漏的文件,或者纠正提交时输入错误或不够准确的提交消息。
修改某个内容,不提交
标签
git tag v1 C1
git checkout v1
使用git branch bugwork
加上一个目标提交记录来创建消失的引用。
git fetch 不会做的事
git fetch并不会改变你本地仓库的状态。它不会更新你的main分支,也不会修改你磁盘上的文件。
理解这一点很重要,因为许多开发人员误以为执行了git fetch 以后,他们本地仓库就与远程仓库同步了。它可能已经将进行这一操作所需的所有数据都下载了下来,但是并没有修改你本地的文件。我们在后面的课程中将会讲解能完成该操作的命