乐趣区

关于git:深入浅出git五自由的修改提交记录

上篇文章讲了 merge 和 rebase, 咱们曾经能够在 commit object 形成的图 (当然我更违心把它看成一棵树) 下面进行分支的合并了, 在图上咱们能够新增节点(git commit), 合并节点(merge 或者 rebase), 这篇咱们就来解说下挪动和删除节点。

在讲挪动和删除之前,咱们先来意识下 HEAD 的拆散。

拆散的 HEAD

咱们都晓得,HEAD 是指向以后分支的, 而拆散的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。

当初我本地的提交记录是这样的

当咱们执行 git checkout 062704b1c3a814dfd95695aba3684c22e3f3fa85 之后 HEAD 就处于拆散状态。

挪动节点

咱们能够通过指定提交记录 hash 的形式挪动指针的地位 (无论是分支还是 HEAD), 然而理论中并没有那么直观的图给咱们看,就不得不应用git log 来查看提交记录的 hash,然而 hash 又比拟长,幸好 git 对 hash 的解决比拟智能,咱们只须要提供惟一标识提交记录的前几个字符就能够了,因而咱们能够只输出 git checkout 0627 就能够检出提交记录了。

通过 hash 值来挪动节点显然并不不便,所以 git 提供了绝对援用,这样咱们就能够从一个易于记忆的中央 (比方 bugFix 分支或者 HEAD) 开始计算。

绝对援用

绝对援用很给力,罕用的两种用法

  1. 应用 ^ 向上挪动 1 个提交记录
  2. 应用 ~num 向上挪动多个提交记录

当咱们执行 git checkout master^ 的时候,咱们的 HEAD 就指向了上一个提交记录(以后记录的是一个记录),留神这里挪动的是提交记录(commit object),同理挪动多个记录也是一样的。

应用绝对援用最多的就是挪动分支,咱们能够命令间接让分支指向另外一个提交。

当初 master 分支就指向了第一个提交,须要留神的是不能在以后分支操作以后分支的挪动,否则你会有这样的谬误

fatal: Cannot force update the current branch.

实现挪动之后并不会切换分支,依然处于之前的分支。

任意挪动

如何能将提交树的 commit object 任意的挪动? 让咱们的批改能够更加的随便,git cherry-pick就能做到。
当初咱们想把 bugFix 分支上 C2,C4 的提交记录挪动到 master 分支上,只须要执行

git cherry-pick C2 C4

这个命令能够 ” 复制 ” 提交节点并在以后分支做一次齐全一样的新提交

回退代码

有的时候咱们的代码提交织了,然而曾经提交到 git 下来了,我想要回退怎么办?还好 git 提供了两种办法用来撤销变更 —-git reset以及git revert

git reset

git reset通过把分支记录回退几个提交记录来实现撤销 改变,其实就是挪动在图上的指针。

git revert

咱们原本是要撤销 C2 提交的,然而为什么还多了一个 C2’ 提交呢?这是因为新提交记录 C2’ 引入了更改 – 这个更改又是用来撤销 C2 这个提交的,也就是说 C2’ 的状态于 C1 是雷同的。
revert 之后就能够把更改 push 到近程仓库与他人分享了。

退出移动版