关于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到近程仓库与他人分享了。

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理