仅在我工作的分支上的非快进问题

时间:2016-12-19 17:55:29

标签: git

我创建了一个多个人正在处理的功能分支的分支。所以像这样:

            /-----my-feat
  /-----new-feat
master

new-feat继续开发,但my-feat只有我感动。在尝试推送到origin之前我重新定位,但结果却出现了非快进错误。如果没有其他人接触my-feat,怎么可能这样呢?我最终关注this github doc,但发现了一些我没有碰过的文件中的合并冲突,还有一些我触摸过的文件中的合并冲突。

我的问题是:

  1. 我是应该获取并合并以解决问题还是这是一个错误?

  2. 我该怎么办?我是否修复了冲突然后推送到原点?我犹豫不决,因为我不确定它是否会影响其他任何分支机构的工作。

2 个答案:

答案 0 :(得分:1)

TL; DR:你需要强迫推(最好是--force-with-lease)。

  

new-feat继续开发,但my-feat只有我感动。

my-feat也被推回到某个集中式服务器,是吗?

  

我在尝试推送到origin之前重新定位,但结果却出现了非快进错误。

这不足为奇。

要了解git rebase的事情是它复制提交。

让我们重新绘制您的示例以显示一些实际的提交。而不是像face0ff...cafebab...这样的巨型40个字符的SHA-1哈希,让我们给它们一个字母的名字:

...--A--B             <-- master
         \
          C--D--E     <-- new-feat
                 \
                  F   <-- my-feat

现在各种开发者都向new-feat添加了新的提交:

...--A--B                 <-- master
         \
          C--D--E--G--H   <-- new-feat
                 \
                  F       <-- my-feat

所以你git rebase my-feat提交F提交给新提交F'(之所以这样命名是因为它是F的副本)。除了新哈希之外,FF'之间存在两个巨大差异:一个是F'的父级是H而不是E,并且另一个是通过提交GH进行的任何源代码更改。但现在图片看起来像这样:

...--A--B                   <-- master
         \
          C--D--E--G--H     <-- new-feat
                 \     \
                  \     F'  <-- my-feat
                   \
                    F       [abandoned]

默认情况下,您仍然可以通过您的reflog保存F至少30天。与此同时,您一直推送到 服务器已经F,因为您已将其发送给他们。

您现在调出服务器并发送F'副本F。所有它知道的F'是它有其他哈希,父,源树等 - 所有通常的任何提交的东西。它知道F'旨在作为F替换。然后,您要求服务器将 的<{1}}想法设置为my-feat,并说明:

“如果我这样做,我将丢失一些提交。”

这就是“拒绝(非快进)”的意思:“我会失去一些提交。”具体来说,它会丢失F',即您有意放弃的提交。

那很好 - 所以你需要做的是告诉服务器。 (并且,不知何故,对于其他任何人使用F,这是Git无法帮助您的。由于没有其他人应该使用它,您可以计算人数告诉没有脚的手指。)要告诉服务器这没关系,你必须使用某种强制操作。理想的一个是my-feat,它会验证他们的 --force-with-lease实际上是否指向my-feat,因此F是唯一的提交“放弃但由于您是唯一使用F的人,因此您可以使用更简单,更旧的全力选项。

答案 1 :(得分:0)

如果你创建一个分支并推送它,然后重新定义这个分支并推送它,根据定义它不是快进的,因为你将分支的历史记录更改为基于另一个提交而不是最初的提交。只要这是一个分支,只有你正在使用而且没有其他人基于他的分支,这不是问题。但是如果有人拿走你的分支机构并在其上建立了自己的分支机构,他必须手动将这些分支机构重新绑定到新重写的历史记录上。如果您不关心或没有人根据您的分支做任何事情,您可以在变基后强行推送(-f)您的分支。

遵循GitHub Doc确实是完全错误的,因为它不适用于您的情况。如果你有一个分支,其他人也在推动你并且你不是最新的,你必须首先通过合并或rebase将这些更改记录到你的历史记录中,这样就不会因为你覆盖和丢失提交而丢失提交其他开发者的提交。

在您的情况下,您会收到非快进错误,因为您通过重新定位完全重写了分支的历史记录。在这种情况下,采用简单的推力方式(当然要考虑上面的警告)。

您现在应该中止您所在的合并(git merge --abort)并简单地强制推送(当然,请考虑上面的警告git push -f origin)。