是否有可能从另一个git存储库中挑选一个提交?

Is it possible to cherry-pick a commit from another git repository?

我正在使用一个Git存储库,它需要来自另一个不知道第一个的Git存储库的提交。

通常我会在reflog中使用HEAD@{x}进行cherry pick,但是由于这个.git对reflog条目(不同的物理目录)一无所知,我如何才能cherry pick这个,或者我可以?

我用的是git-svn。我的第一个分支机构使用的是颠覆性回购的trunkgit-svn,下一个分支机构使用的是颠覆性回购的git-svn


给出的答案是使用格式补丁,但由于问题是如何从另一个文件夹中挑选,下面是一段代码:

1
2
3
$ git --git-dir=../<some_other_repo>/.git \
format-patch -k -1 --stdout <commit SHA> | \
git am -3 -k

(explanation from @cong ma)

The git format-patch command creates a patch from some_other_repo's
commit specified by its SHA (-1 for one single commit alone). This
patch is piped to git am, which applies the patch locally (-3 means
trying the three-way merge if the patch fails to apply cleanly). Hope
that explains.


您需要将另一个存储库添加为远程存储库,然后获取其更改。从那里你看到了承诺,你可以选择它。

像这样:

1
2
git remote add other https://example.link/repository.git
git fetch other

现在您有了所有信息,只需执行git cherry-pick

有关使用遥控器的详细信息,请访问:https://git-scm.com/book/en/v2/git-basics-working-with-remotes


下面是一个远程获取合并的示例。

1
2
3
cd /home/you/projectA
git remote add projectB /home/you/projectB
git fetch projectB

然后你可以:

1
git cherry-pick <first_commit>..<last_commit>

或者你甚至可以合并整个分支

1
git merge projectB/master


你可以做到,但这需要两个步骤。以下是如何:

1
git fetch <remote-git-url> <branch> && git cherry-pick FETCH_HEAD

替换为要从中挑选cherry的存储库的URL或路径。

替换为要从远程存储库中挑选的分支或标记名。

你可以用分支机构的Git-Sha替换FETCH_HEAD

更新:根据@pkalinow的反馈修改。


以下是添加远程、获取分支和cherry选择提交的步骤

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Cloning our fork
$ git clone [email protected]:ifad/rest-client.git

# Adding (as"endel") the repo from we want to cherry-pick
$ git remote add endel git://github.com/endel/rest-client.git

# Fetch their branches
$ git fetch endel

# List their commits
$ git log endel/master

# Cherry-pick the commit we need
$ git cherry-pick 97fedac

来源:https://coderwall.com/p/sgpksw


请参阅如何使用Git创建和应用修补程序。(从您问题的措辞来看,我假设这个其他存储库用于完全不同的代码库。如果它是同一代码库的存储库,那么应该按照@charlesb的建议将其作为远程库添加。即使它是用于另一个代码库,我想您仍然可以将它作为远程代码添加,但您可能不想将整个分支放到您的存储库中…)


您可以按以下一行操作。希望您在需要cherry-picked更改的Git存储库中,并且已经签出以更正分支。

1
2
git fetch ssh://[email protected]:7999/repo_to_get_it_from.git branchToPickFrom && git cherry-pick 02a197e9533
#

git fetch[branch url][branch to cherry pick from]&;git cherry pick[commit id]


对。获取存储库,然后从远程分支中选择cherry-pick。


假设A是你想要从中挑选的回购,而B是你想要从中挑选的回购,你可以通过在/.git/objects/info/alternates中添加/.git/objects来实现这一点。如果此alternates文件不存在,则创建它。

这将使repo b访问repo a中的所有git对象,并使cherry-pick为您工作。


我的情况是,我有一个团队推动的空回购,以及紧挨着它的复制品。makefile中的这组行对我来说工作正常:

1
2
3
4
git reset --hard
git remote update --prune
git pull --rebase --all
git cherry-pick -n remotes/origin/$(BRANCH)

通过保持裸回购主数据的最新,我们可以挑选一个发布到裸回购的提议变更。我们也有一种(更复杂的)方法来挑选多个分支进行合并审查和测试。

如果"什么都不知道"的意思是"不能用作遥控器",那么这没有帮助,但是这个问题是在我到处搜索来提出这个工作流程时出现的,所以我想我会做出贡献。