如何将提交从一个Git回购复制到另一个



上周我创建了一个Github回购,但忘记为回购选择许可证。现在已经有3个大型提交。

我已经询问了3位贡献者,如果我删除回购,然后用相同的名称再次创建它,这次在创建回购时选择许可证,他们是否可以,他们对此很满意。

问题

有没有一种方法可以让提交进入新的repo(这次第一个提交是LICENSE文件),并且仍然保留提交元信息?

有没有办法让提交进入新的repo(这次第一次提交是LICENSE文件),并且仍然保留提交元信息?

是的,在第一次提交的基础上添加一个远程并仔细挑选提交。

# add the old repo as a remote repository 
git remote add oldrepo https://github.com/path/to/oldrepo
# get the old repo commits
git remote update
# examine the whole tree
git log --all --oneline --graph --decorate
# copy (cherry-pick) the commits from the old repo into your new local one
git cherry-pick sha-of-commit-one
git cherry-pick sha-of-commit-two
git cherry-pick sha-of-commit-three
# check your local repo is correct
git log
# send your new tree (repo state) to github
git push origin master
# remove the now-unneeded reference to oldrepo
git remote remove oldrepo

这个答案的其余部分是,如果您仍然想将许可证添加到以前的回购中。

是的。您可以通过重新定基将许可证提交作为第一次提交。

回扣是gits在保持所有提交作者和提交日期不变的情况下重新安排提交顺序的方法。

在处理共享回购时,通常不鼓励这样做,除非你的整个团队都很流利。对于那些没有的人,他们可以克隆存储库的新副本。

以下是如何将许可证提交作为第一次提交。

1.更新并重新设置本地副本的基础

检查您的项目,并将LICENSE文件放在当前3提交堆栈顶部的提交中。

#create LICENSE file, edit, add content, save
git add LICENSE
git commit -m 'Initial commit'

然后在master分支上执行交互式重新基准,以REARRANGE提交。

git rebase -i --root

它将打开一个编辑器。将底线(您的"初始提交"提交,最近的提交)移到文件的顶部。然后保存并退出编辑器。

一旦您退出编辑器,git就会按照您刚才指定的顺序写入提交。

您现在已经更新了存储库的本地副本。do:

git log

以进行验证。

2.强制将您的新回购状态推送到github

现在您的副本已经更新,您必须强制将其推送到github。

git push -f origin master

这将告诉github将主分支移动到其新位置。只有在极少数的情况下,当每个使用它的人都意识到即将发生的更改时,你才应该强制推送,否则会让你的合作者感到困惑。

3.将合作者同步到github

最后,所有合作者都必须同步到此存储库。

首先它们必须具有干净的存储库,因为如果存在未保存的更改,以下命令可能具有破坏性。

# make sure there are no unsaved changes
git status 
# pull the latest version from github
git fetch  
# move their master branch pointer to the one you published to github.
git reset --hard origin/master

就是这样。每个人现在都应该同步。

我也遇到过类似的问题,我忘记将repo分叉到我的github,并在意识到错误之前添加了几次提交。

我找到了一个非常简单的解决方案。

首先删除远程到原始回购

git remote remove origin

第二,在我的github 上的新分叉中添加一个遥控器

git remote add origin <my repo URL>

然后我推到原始主机,我所有的提交都显示在我的github上。

我使用了以下方法:

  • 将源repo克隆到/c/SrcRepo 这样的文件夹中

  • 将目标repo克隆到/c/DstRepo这样的文件夹中,然后切换到目标分支

  • 在目标repo的根文件夹中运行命令:

    gitpull/c/SrcRepo-srcBranch--允许不相关的历史

无需创建额外的远程参考

基于@Moocowmoo的答案,但试图将其简化为更多

这样做的不同之处在于,只要假设远程是正确的,就尽可能避免冲突。

然而,它不能很好地处理已删除的文件,因此仍然有一个手动元素。

# assuming you are already on the branch you want to be
git remote add oldrepo https://github.com/path/to/oldrepo
git fetch oldrepo
# take all or subset of changes from a branch
git cherry-pick --strategy recursive --strategy-option theirs oldestCommitHash^..latestCommitHash
# or take all changes included in a specific merge commit (easiest)
git cherry-pick --strategy recursive --strategy-option theirs mergeCommitHash^..mergeCommitHash
# handling deleted files/unhandled conflicts
# just keep repeating this section
git mergetool
# either c/m or d based on if you want to keep or delete the files
git cherry-pick --continue

您可以尝试一下,它简单明了。这将把您用作<last-commit-hash-from-old-repo>哈希之前(包括)的所有提交推送到另一个repo:

git clone https://github.com/path/to/new-repo.git new-repo
cd new-repo
git remote add old https://github.com/path/to/old-repo.git
git remote update
git merge --allow-unrelated-histories <last-commit-hash-from-old-repo>
git push origin main

如果有人需要将所有提交从一个repo推送到另一个作为单个提交(就像我需要的那样),你可以简单地将--crush添加到merge命令中,如下所示:

git clone https://github.com/path/to/new-repo.git new-repo
cd new-repo
git remote add old https://github.com/path/to/old-repo.git
git remote update
git merge --squash --allow-unrelated-histories <last-commit-hash-from-old-repo>
git push origin main
  • 目标Git=UrlD(现有内容无关紧要)
  • SourceGit=UrlS

    git clone UrlS
    git remote add origin2 UrlD
    git push -f origin2 master
    

现在目的地将具有与源相同的数据(您也可以使用origin而不是origin2)

在我的案例中,我需要找出新旧repos之间的差异。因此,在新的回购中添加了旧的回购。

git remote add old https://gitlab.site.az/old-blog.git

获取所有远程

git fetch --all

查找不同的提交

git log --graph --oneline --pretty=format:"%h%x09%an%x09%ad%x09%s" --abbrev-commit --date=relative develop..old/develop

获取您选择的的提交

git cherry-pick SHA1 SHA2 SHA4

相关内容

  • 没有找到相关文章

最新更新