git 跨存储库移动更改的最佳实践

fnvucqvd  于 2023-09-29  发布在  Git
关注(0)|答案(1)|浏览(117)

我在github中有一段代码(commit A),一个同事复制到了gitlab(commit D)。假设两者都是各自的main。然后不同的提交在它们之上。

= A --- B --- C     (Github main)
   
    = D --- E         (Gitlab main)

这里,=表示Gitlab中保存了GitHub的历史。
现在我想在Gitlab中提交C,一个简单的方法是从C复制内容并提交F(我还将gitlab中的main作为temp分支移动到了temp分支)。

= A --- B --- C     (Github main)
               \
   = D --- E --- F    (Gitlab main)
            \
            (Gitlab temp)

除了提交F,还有更好的方法吗(比如从Github保存历史)?
理想情况下,我正在寻找:

= A --- B --- C     (Github main) // remains same

  = A --- B --- C     (Gitlab main)
   
    = D --- E         (Gitlab temp)
gev0vcfq

gev0vcfq1#

首先,你可以创建一个本地仓库,其中有两个远程仓库,一个代表GitHub仓库,另一个代表GitLab仓库。

# create a new repository and add the remotes
# it would also be possible in a similar way by cloning one and adding the other remote
git init
# make sure to change the username/reponame
# For self-hosted instances, you also need to change the domain names
git remote add github https://github.com/githubusername/reponame
git remote add gitlab https://gitlab.com/gitlabusername/reponame

# fetch content from remotes
git fetch --all

这样,您就可以使用git命令与存储库进行交互。具体来说,您可以将一个合并到另一个中。

合并

您可以从两个存储库的main分支创建两个分支(github_maingitlab_main):

git checkout -b github_main github/main
git checkout -b gitlab_main gitlab/main

请注意,github_main是在gitlab_main之前创建的,这意味着分支gitlab_main当前已 checkout (当前 checkout 的是您要对其进行更改的分支)。
然后,您可以将github_main合并为gitlab_main

git merge github_main

这将创建一个新的合并提交到你的当前分支(gitlab_main),其中包含两个祖先:两个分支的HEAD提交。
在这一点上,您可能需要检查您的更改,例如。关于git log --all --graph
之后,您可以将更改推送到gitlab远程。

git push -u gitlab gitlab_main:main

用力推一个到另一个

如果你只是想将GitLab上的main更改为与GitHub上的main分支相同,只需从GitLab checkout 分支并将其推送到GitHub。因为你正在重写历史,你需要使用一个强制推送:

git checkout -b github_main github/main
git push gitlab github_main:main --force-with-lease

相关问题