修复与Git重设基础和导出的合并冲突
我遇到了一些与git rebase的合并冲突 我的问题是,如果我解决了冲突,我是否会这样做:修复与Git重设基础和导出的合并冲突,git,merge,rebase,Git,Merge,Rebase,我遇到了一些与git rebase的合并冲突 我的问题是,如果我解决了冲突,我是否会这样做: git add files git commit "fixed merge conflicts" 然后继续 git rebase --continue 我的另一个问题是,如果我搞砸了,我能做什么 git rebase --abort 这会删除所有提交吗?git-rebase--abort将完全退出rebase,基本上将存储库恢复到启动rebase之前的时间点。唯一丢失的提交将是git-rebas
git add files
git commit "fixed merge conflicts"
然后继续
git rebase --continue
我的另一个问题是,如果我搞砸了,我能做什么
git rebase --abort
这会删除所有提交吗?git-rebase--abort
将完全退出rebase,基本上将存储库恢复到启动rebase
之前的时间点。唯一丢失的提交将是git-rebase
创建的全新提交(因为git-rebase
重放原始提交,从而形成新的提交)
无论是否中止,都不会触及原始提交。rebase
之前的时间点。唯一丢失的提交将是git-rebase
创建的全新提交(因为git-rebase
重放原始提交,从而形成新的提交)
无论是否中止,都不会触及原始提交。基于,您真正的问题是是否应该将原始提交链保存在某处/以某种方式保存
在某种基本级别上,Rebase是通过复制来工作的(因为提交永远无法更改,这包括它们的向后链接)。分支名称只是指向某些特定的提交。如果我们将提交绘制为图形中的节点,我们得到的结果如下所示:
...--F--G--H--I <-- origin/whatever
\
J--K--L <-- your-branch
git-rebase
的最后一步是删除当前粘贴分支的名称your-branch
,指向commitL
,并使其指向commitL'
——rebase制作的最后一个副本:
J'-K'-L' <-- your-branch (HEAD)
/
...--F--G--H--I <-- origin/whatever
\
J--K--L [abandoned]
在开始ReBASE或ReBASE中间的任何时候,当<代码>您的分支仍然指向提交“代码> L>代码>时,可以添加一个新的名称来记住提交<代码> L>代码>的原始哈希ID:
J'-K'-L' [abandoned]
/
...--F--G--H--I <-- origin/whatever
\
J--K--L <-- your-branch (HEAD)
J'-K' <-- HEAD
/
...--F--G--H--I <-- origin/whatever
\
J--K--L <-- your-branch, extra-name
您不必这样做,因为,git rebase
秘密地设置了一个特殊的名称,ORIG_HEAD
,以记住您的分支名称在它将其从L
中拉出并粘贴到L'
之前的位置。但是名称ORIG_HEAD
将被您稍后使用的任何其他Git命令(可能是另一个rebase)覆盖,该命令会像这样猛拉标签,因此,如果您不喜欢结果,您可以使用这种短期权宜之计来恢复
Git还记录分支名的reflog,即分支名的前一个值,即Your branch
用于指向提交L
而不是L'
。这些reflog条目持续30或90天。1尽管它们不是最容易使用的东西:
git reflog your-branch
将溢出所有内容,但您得到的是每次提交中使用的一行摘要,并且当您使用git-rebase
时,通常会将原始的一行摘要从提交L
复制到提交L'
,因此很难区分哪个是哪个
尽管如此,ORIG_HEAD
和reflogs的一些组合通常可以让您恢复,而不需要额外的名称。如果让你更舒服,可以使用这个额外的名字。我经常这样做:如果我正在处理feature/X
,并且需要重新设置基址,我会创建feature/X.0
,然后重新设置基址。我最初的提交系列现在作为点零版本提供。几天后,如果我需要做另一个重基,我会创建feature/X.1
,然后重基。因此,feature/X
是最新的,而feature/X.
是旧的,还有更多的旧的,直到我自己把它们收集起来扔掉
1从技术上讲,30天后到期的提交使用的是
expireUnreachable
时间:这些提交无法从引用的当前值访问。Rebase通常会进行此类引用,因此默认的30天到期时间是您应该关注的时间
(可访问的Reflog条目将获得90天的默认值。)基于,您真正的问题是是否应该将原始提交链保存在某处/以某种方式保存
在某种基本级别上,Rebase是通过复制来工作的(因为提交永远无法更改,这包括它们的向后链接)。分支名称只是指向某些特定的提交。如果我们将提交绘制为图形中的节点,我们得到的结果如下所示:
...--F--G--H--I <-- origin/whatever
\
J--K--L <-- your-branch
git-rebase
的最后一步是删除当前粘贴分支的名称your-branch
,指向commitL
,并使其指向commitL'
——rebase制作的最后一个副本:
J'-K'-L' <-- your-branch (HEAD)
/
...--F--G--H--I <-- origin/whatever
\
J--K--L [abandoned]
在开始ReBASE或ReBASE中间的任何时候,当<代码>您的分支仍然指向提交“代码> L>代码>时,可以添加一个新的名称来记住提交<代码> L>代码>的原始哈希ID:
J'-K'-L' [abandoned]
/
...--F--G--H--I <-- origin/whatever
\
J--K--L <-- your-branch (HEAD)
J'-K' <-- HEAD
/
...--F--G--H--I <-- origin/whatever
\
J--K--L <-- your-branch, extra-name
您不必这样做,因为,git rebase
秘密地设置了一个特殊的名称,ORIG_HEAD
,以记住您的分支名称在它将其从L
中拉出并粘贴到L'
之前的位置。但是名称ORIG_HEAD
将被您稍后使用的任何其他Git命令(可能是另一个rebase)覆盖,该命令会像这样猛拉标签,因此,如果您不喜欢结果,您可以使用这种短期权宜之计来恢复
Git还记录分支名的reflog,即分支名的前一个值,即Your branch
用于指向提交L
而不是L'
。这些reflog条目持续30或90天。1尽管它们不是最容易使用的东西:
git reflog your-branch
会把它们都吐出来,但是w