基于
your comment
在
jready's answer
,真正的问题是是否应该在某处/以某种方式保存原始提交链。
在某种基本级别上,rebase是通过复制来工作的(因为提交永远不能更改这包括它们的向后链接)。分支名称只是指向一些特定的提交。如果我们将提交绘制为图中的节点,我们得到的结果如下:
...--F--G--H--I <-- origin/whatever
\
J--K--L <-- your-branch
如果你跑
git checkout your-branch && git rebase origin/whatever
Git必须
复制
犯罪
J
,将其转换为相对于其父级的一组更改
G
,并应用这些更改以提交
I
(何处)
origin/whatever
点)。复制的
J
到
J'
,然后尝试复制
K
作出新的承诺
K'
,等等。最终的结果是,在解决任何冲突之后,在git“剥离名称”commit之前
L
是:
J'-K'-L' <-- HEAD
/
...--F--G--H--I <-- origin/whatever
\
J--K--L <-- your-branch
最后一步
git rebase
是删除名称
your-branch
从现在粘贴的位置,指向提交
L
,并指出
L'
Rebase制作的最后一个副本:
J'-K'-L' <-- your-branch (HEAD)
/
...--F--G--H--I <-- origin/whatever
\
J--K--L [abandoned]
如果你使用
git rebase --abort
git没有继续,而是放弃了复制的链,留下了名称
你的分支
仍然指向
L
:
J'-K'-L' [abandoned]
/
...--F--G--H--I <-- origin/whatever
\
J--K--L <-- your-branch (HEAD)
在你开始重新定位之前,或者在重新定位中间的任何时候
你的分支
仍需提交
L
,可以添加新名称以记住commit的原始哈希ID
L
:
J'-K' <-- HEAD
/
...--F--G--H--I <-- origin/whatever
\
J--K--L <-- your-branch, extra-name
你可以用它
git branch extra-name your-branch
例如。这样,在你完成回扣后,假设你完成了它,你会得到:
J'-K'-L' <-- your-branch (HEAD)
/
...--F--G--H--I <-- origin/whatever
\
J--K--L <-- extra-name
你不
有
这么做,因为秘密的,
GIT重碱
设置一个特殊的名称,
ORIG_HEAD
,以记住你的分支名称在被扯下之前在哪里
L
贴在上面
L’
. 但名字
始祖鸟
将被稍后使用的其他git命令(可能是另一个rebase)覆盖,该命令会像这样到处拉扯标签,因此这是一种短期的权宜之计,如果您不喜欢结果,可以使用它来恢复。
你的git还记录了
重新浮起
对于分支,分支名称的前一个值,即
你的分支
用于指向提交
L
而不是
L’
. 这些重新登录条目持续30或90天。
一
它们不是最容易使用的东西,不过:
git reflog your-branch
会溢出所有这些,但您得到的是在每次提交中使用的单行摘要,以及当您使用
GIT重碱
通常从commit复制原始的单行摘要
L
提交
L’
,所以很难分辨哪一个是哪一个。
尽管如此
始祖鸟
而重新登录通常会让你恢复没有额外的名字。如果能让你更舒服的话,就用这个额外的名字。我经常这么做:如果我在工作
feature/X
,需要重新定位,我创建
feature/X.0
然后再重新定位。我最初的提交系列现在可以作为dot zero版本使用。几天后,如果我需要再做一次调整,我会创建
feature/X.1
然后再重新定位。所以
特征/X
是最新的,而且
feature/X.<number>
是老的,还有更多的老的,直到我自己把它们捡起来扔掉。
一
从技术上讲,30天内到期的是使用
expireUnreachable
时间:这些承诺不是
可达成的
从引用的当前值。rebase通常会进行这种引用,因此默认的30天到期日是您应该关注的到期日。
(重新记录
是
可获得90天的默认值。)