Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git重定基址-其他人可以为我重定远程分支的基址吗?_Git - Fatal编程技术网

Git重定基址-其他人可以为我重定远程分支的基址吗?

Git重定基址-其他人可以为我重定远程分支的基址吗?,git,Git,场景: 我正在和一个20多人的团队一起开发一个远程git存储库。经常创建、提交和合并分支以掌握 我和一位同事在一家分店共事了几天。他重新调整了分支机构的基础,解决了所有冲突,并推动了这一进程 当我尝试拉取时,会得到“自动合并失败”和解决所有冲突的提示 当我选择“git状态”时,我发现我已经偏离了原点/分支,并且每个都有100多个不同的提交 问题: 到目前为止,他已经完成了我所有的承诺,刚刚重新设定了基础,然后推动了,如果我继续合并,我可能会重做他已经完成的冲突解决方案 问题 这是怎么回事 怎么办

场景:

我正在和一个20多人的团队一起开发一个远程git存储库。经常创建、提交和合并分支以掌握

我和一位同事在一家分店共事了几天。他重新调整了分支机构的基础,解决了所有冲突,并推动了这一进程

当我尝试拉取时,会得到“自动合并失败”和解决所有冲突的提示

当我选择“git状态”时,我发现我已经偏离了原点/分支,并且每个都有100多个不同的提交

问题:

到目前为止,他已经完成了我所有的承诺,刚刚重新设定了基础,然后推动了,如果我继续合并,我可能会重做他已经完成的冲突解决方案

问题

这是怎么回事

怎么办?为什么?

Asides

我已经读了大量关于git的书,我还在学习,希望能得到一个直接的答案,关于git逻辑,而不是与相关命令相关的问题

提前谢谢。

不,不能这样做(回答问题标题中的问题)

在通过推、拉或克隆与其他人共享变更集之前,应进行重定基

例如,一个程序员提交5个变更集:

(1)---(2)---(3)---(4)---(5)
这些变更集与另一个开发人员共享,该开发人员最初有一个只包含第一个变更集的克隆,因此他在他的存储库中有自己的变更集。一旦他拉了或者你推了,下面是他的情况:

(1)---(2)---(3)---(4)---(5)
  \
   \
    (A)---(B)---(C)
因为他想要一个线性历史,他在他的基础上重新调整您的变更集,得到以下结果:

(1)---(A)---(B)---(C)---(2')---(3')---(4')---(5')
请注意,我现在在他的存储库中用记号标记了您的变更集,以表明它们是“您的”变更集,但现在受到他早期变更的影响,因此不再与您的变更集相同(哈希或其他)

然后你拉,这里是你得到的:

(1)---(A)---(B)---(C)---(2')---(3')---(4')---(5')
  \
   \
    (2)---(3)---(4)---(5)
现在您有了这些变更集的两个“副本”

如果您在存储库中的第5个变更集之后没有做任何事情,您可能只需要将它们从存储库中删除,但请标记“可能”一词,这意味着您需要了解存储库的状态,并且需要了解存储库的每个克隆

在一切都恢复到坏状态之前,不需要一次以上的pull-merge-push操作

结论:除非您知道自己在做什么,否则不要重新设置变更集的基础,并且几乎肯定不会重新设置共享变更集的基础


实际上:这一警告应该针对所有形式的历史重写。任何重写历史的操作都必须独立进行,并且所有克隆都必须无效,否则您将拥有不同的历史和受影响变更集的多个“副本”。你不想在这里

什么拉塞夫。卡尔森说没关系。因为他重新调整了树枝的基调,你不可能真的把它拔出来,然后把所有的东西都重新缝合

如果您没有更多的“新”提交,只需删除您试图拉取的分支并拉取它。由于所有变更集都存在,只需将分支重置为与服务器上的分支完全相同,然后继续。如果您有新的提交,那么它将有点困难

首先创建分支机构的副本:

git checkout [branch]
git checkout -b branchCopy
删除分支(如果由于未合并而不想删除它,请使用-f)

获取服务器上的内容(源站可以是另一个远程站点)并使用服务器上的内容重新创建分支

git fetch [origin]
git checkout origin/branch
git checkout -b branch
现在您将拥有
分支
分支复制

使用git日志,检查要添加到分支的提交。并使用
cherry pick
添加它们

git checkout branch
git cherry-pick "commit"
添加所有未合并的提交后,只需推送到服务器。并删除“branchCopy”

如果在branchCopy和branch之间有很多不同的变更集。我想有一种方法可以将一组提交从
branchCopy
重新设置到
branch
上,但是如果您只是重新设置它的基础。它将添加每个更改,因为复制的提交具有不同的哈希

所以,是的,除非你知道自己在做什么,否则不要重新设定基准。如果你想重新设定基准并与许多人一起工作。最好的办法是确保每个人都知道你正在重新定基

我想对于任何一个好的时间旅行者来说,第一条规则就是“不要改变历史”

提示 这里有一个建议,让时间旅行比以往任何时候都更安全。在工作中,我使用了这种流程:

在“我的要素”分支上工作,并在完成后在“主控”中合并

当您处理您的分支时,它几乎可以保证您不会对主分支上存在的提交进行重基化。完成后,你必须做出选择。您可以在master中合并分支或在master上重新设置分支的基础

如果要重新设置分支的基址,则必须获取最后一个主提交并对其重新设置基址,并尽可能快地推送它。当人们拉它的时候,它应该仍然是快速前进的,因为你没有改变大师的历史,而是你分支的历史

但老实说,在使用了bitbucket之后,(关于github就没什么可说的了)。我处理拉请求。即使分支是快进的,它也会执行合并提交。在大多数情况下,避免重定基址可能更容易。Pullrequest是一个非常好的创建,如果您使用的是一个拥有它的系统,那么应该使用它


它可能会创建一个合并提交,但它会留下合并提交的历史记录,由谁和您可以对其进行注释。人们可以处理要合并的特性,有人可以在需要时使用pull请求来检查代码,并将代码合并到master中

回答得很好。正是我想要的。谢谢你,Lasse这正是我读了Lasse的帖子后所做的。我在日志中看到了我以前的提交,所以我进行了一次硬签出(使用-f,它总是让我无法使用)。谢谢。当我知道我的推送不是fa时,我在做什么
git checkout branch
git cherry-pick "commit"