添加新的远程,每次拉动都会创建新的合并提交

时间:2019-12-16 19:50:15

标签: git github gitlab

我有一个连接到gitlab存储库的远程项目。 gitlab出于某种原因变得无法使用,我想转到github。因此,我克隆了存储库并将其推送到github,从而摆脱了该过程中的所有分支历史记录。之所以这样做是有目的的,因为该项目在闲置了约4年之后现在仍在维护中,我们希望重新开始。分支将暂时保存在gitlab历史记录中。

问题是我想将gitlab保留一段时间。我添加了github远程对象,并在进行更改时从该远程对象中拉出,但是每次它告诉我我需要进行合并提交,这会使提交历史变得混乱。拉动之间我没有进行任何本地更改,那么是什么原因造成的呢?与分支机构有关吗?还是具有两个遥控器的产品?我不知道。

2 个答案:

答案 0 :(得分:1)

我会用樱桃挑选的。

这是将提交从github复制到gitlab的方法:

将两个远程服务器都拉到一个仓库中,分为两个不同的分支(对于GitHub,ghB对于GitLab,glB;对于GitHub Remote,ghR),对于{ GitLab遥控器)

设置:

glR

获取github-commit的提交哈希:

git init
git remote add glR <gitlab url>
git remote add ghR <github url>
git pull glR glB
git pull ghR ghB

检出gitlab分支

git checkout ghB
git log

Cherry-pick(复制)github分支的提交

git checkout glB

按下

git cherry-pick <commit hash>

答案 1 :(得分:1)

这不是具有两个遥控器的结果。但是,这可能是由于同一分支尝试具有两个历史记录的结果。你不能那样做。

因此您拥有原始回购。可能看起来像

... x -- x -- O <--(master)
     \
       x ... <--(some_branch)

现在您说您想重新开始,所以我认为这意味着您的新存储库将只有与O上的内容匹配的一次提交。请注意,我不是说“相同的提交”,而是说“匹配内容的提交”。这是因为更改历史记录需要创建一个新的提交。[1]

现在,您没有指定创建新存储库的方式,但是几乎每种处理方式都会以这样的方式结束

O' <--(github/master)

... x -- x -- O <--(gitlab/master)
     \
       x ... <--(gitlab/some_branch)

(其中gitlab和github将替换为您使用的任何远程名称)。您可以通过类似

的方法进行验证
git show gitlab/master
git show github/master

并且请注意,提交的SHA标识符(由40个数字和字母组成的字符串)几乎肯定是不同的。

问题是,当您尝试从这些远程分支之一中拉出时,在本地检出了什么?如果master指向O(即轨道gitlab/master)并且您拉动github/master,那么这将需要合并无关的历史记录-您绝对不想这样做

因此,如果您想要两个具有不同历史记录的远程服务器,则链接到两个历史记录的单个远程服务器将需要维护一组与每个历史记录相对应的本地分支。这意味着应用于一个历史的更改将不容易迁移到另一个历史。当然,如果所有更改都将转移到新的仓库中,那可能没问题。一旦在github中至少有一个新提交,就可以在本地存储库中使用类似git replace的东西,以使所有内容在本地显示为一个统一的历史记录。

例如,您可以执行类似的操作

git checkout github/master
git branch -D master
git checkout -b master -t github/master
git checkout gitlab/master
git branch old/master
# maybe do similar renamings for other old branches

然后,当您master签出后,可以照常推(拉到github)。您并不是真的想要从gitlab推入或拉出-它只是供参考,对不对?因此,唯一的问题是您是否想在本地简化与较早历史的交互。如上所述,我认为您真的想等到github存储库中有一些新的提交。但是一旦有了

O' -- A <--(master)(github/master)

... x -- x -- O <--(refs/heads/old/master)(gitlab/master)
     \
       x ... <--(gitlab/some_branch)

(请注意,我拼出了old / master的完整引用名称,以避免与远程引用名称混淆)...

目前,您可以在本地使用git replaceO代替O'

git replace master^ gitlab/master

(其中master^是一些解析为O'的表达式-在此示例中master^起作用是因为master指向其父为{{ 1}}。)

有些使用git replace的怪癖,所以如果您想使用它,建议您阅读文档。 (https://git-scm.com/docs/git-replace

这种结合历史的方式纯粹是烟熏和镜像,必须在每个需要它的本地仓库中设置;因此,如果您希望今后继续这样做,则应在A处放置一个标签,以便以后参考。


[1]我在这里假设您不是在尝试使用浅浅的历史。如果这个假设是错误的,请纠正我,我将进行相应的更新。

现在我只想说:创建一个gitlab的浅表克隆并将其用于填充github乍一看对于您的用例来说是一个有吸引力的选择,特别是因为它允许共享O'提交并使用它作为回购历史之间的联系。但我相信,将整个历史意外地推入浅层仓库的可能性很大,尤其是如果您保留任何包含完整历史记录的本地人,并且同时使用两个遥控器。