使用Git Rebase和导出修复合并冲突

时间:2018-06-06 22:03:41

标签: git merge rebase

我与git rebase发生了一些合并冲突。

我的问题是,如果我解决冲突,那么我会做这样的事情:

git add files
git commit "fixed merge conflicts"

然后继续

git rebase --continue

我的另一个问题是如果我搞砸了,我可以吗

git rebase --abort 

并删除所有提交吗?

2 个答案:

答案 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 重放您的原始提交,从而形成新的提交。)

无论您是否中止,原始提交都不会被触及。