我创建了一个多个人正在处理的功能分支的分支。所以像这样:
/-----my-feat
/-----new-feat
master
new-feat
继续开发,但my-feat
只有我感动。在尝试推送到origin
之前我重新定位,但结果却出现了非快进错误。如果没有其他人接触my-feat
,怎么可能这样呢?我最终关注this github doc,但发现了一些我没有碰过的文件中的合并冲突,还有一些我触摸过的文件中的合并冲突。
我的问题是:
我是应该获取并合并以解决问题还是这是一个错误?
我该怎么办?我是否修复了冲突然后推送到原点?我犹豫不决,因为我不确定它是否会影响其他任何分支机构的工作。
答案 0 :(得分:1)
--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
的副本)。除了新哈希之外,F
和F'
之间存在两个巨大差异:一个是F'
的父级是H
而不是E
,并且另一个是通过提交G
和H
进行的任何源代码更改。但现在图片看起来像这样:
...--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
)。