我与git rebase发生了一些合并冲突。
我的问题是,如果我解决冲突,那么我会做这样的事情:
git add files
git commit "fixed merge conflicts"
然后继续
git rebase --continue
我的另一个问题是如果我搞砸了,我可以吗
git rebase --abort
并删除所有提交吗?
答案 0 :(得分:2)
根据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&#34之前剥离了名称&#34;提交L
,是:
J'-K'-L' <-- HEAD
/
...--F--G--H--I <-- origin/whatever
\
J--K--L <-- your-branch
git rebase
的最后一步是从现在粘贴的位置删除名称your-branch
,指向提交L
,并指向提交{{1} - rebase所做的最后一个副本:
L'
如果您使用 J'-K'-L' <-- your-branch (HEAD)
/
...--F--G--H--I <-- origin/whatever
\
J--K--L [abandoned]
而不是继续,Git只会放弃复制的链,而名称git rebase --abort
仍然指向your-branch
:
L
在启动rebase之前,或者当 J'-K'-L' [abandoned]
/
...--F--G--H--I <-- origin/whatever
\
J--K--L <-- your-branch (HEAD)
仍指向提交your-branch
时,在rebase中间的任何时间,您可以添加一个新名称以记住commit {{的原始哈希ID 1}}:
L
例如,您可以使用L
执行此操作。这样,在你完成rebase后,假设你完成了它,你最终得到:
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 rebase
中拉出并粘贴到ORIG_HEAD
上。但是名称L
将被你后来使用的任何其他Git命令(可能是另一个rebase)覆盖,这些命令会像这样拉动一个标签,这样就可以使用这种短期止损如果你不喜欢结果,就要恢复。
您的Git还会在分支的 reflog 中记录分支名称的先前值,即L'
用于指向提交的事实{{1而不是ORIG_HEAD
。这些reflog条目持续30或90天。 1 但它们并不是最容易使用的东西,但是:
your-branch
将溢出所有这些,但你得到的是你在每次提交时使用的单行摘要,当你使用L
时,通常会复制提交{{1}中的原始单行摘要。提交L'
,所以很难说哪一个是哪个。
但是,git reflog your-branch
和reflog的某些组合通常会让你在没有额外名称的情况下恢复。使用额外的名称,如果它让你更舒服。我做了很多:如果我正在处理git rebase
,并且需要重新绑定,我创建L
然后重新绑定。我原来的一系列提交现在可以作为零点版本。几天后,如果我需要做另一个rebase,我创建L'
然后重新绑定。因此ORIG_HEAD
是最新版本,而feature/X
是较旧的版本,剩下的版本较旧,直到我收集它们并将其自行抛弃。
1 从技术上讲,那些在30天后到期的时间正在使用feature/X.0
时间:这些是来自当前值的可到达的提交参考。 Rebase通常会提供此类引用,因此默认的30天到期时间是您应该专注的。
( 可达的Reflog条目获得90天默认值。)
答案 1 :(得分:0)
git rebase --abort
将完全退出rebase,基本上将您的存储库恢复到启动rebase
之前的时间点。唯一丢失的提交将是git rebase
创建的全新提交(因为git rebase
重放您的原始提交,从而形成新的提交。)
无论您是否中止,原始提交都不会被触及。