916

我正在使用一个 git 存储库,该存储库需要来自另一个对第一个一无所知的 git 存储库的提交。

通常我会在 reflog 中使用 进行挑选HEAD@{x},但是因为这.git对这个 reflog 条目(不同的物理目录)一无所知,我该如何挑选这个,或者我可以吗?

我正在使用git-svn. 我的第一个分支正在使用git-svnSubversiontrunk存储库,下一个分支正在使用git-svnSubversion 分支。

4

12 回答 12

976

给出的答案是使用格式补丁,但由于问题是如何从另一个文件夹中挑选,这里有一段代码可以做到这一点:

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

来自马聪评论的解释 2014 年 8 月 28 日

git format-patch 命令从 some_other_repo 由其 SHA 指定的提交创建一个补丁(-1 仅用于单个提交)。此补丁通过管道传送到 git am,后者在本地应用补丁(-3 表示如果补丁无法干净应用,则尝试三向合并)。

于 2012-02-29T22:06:43.730 回答
768

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

像那样:

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

现在您有了所有的信息来简单地做git cherry-pick

完成后,如果您不再需要它,您可能需要再次移除遥控器,使用

git remote remove other

有关在此处使用遥控器的更多信息:https ://git-scm.com/book/en/v2/Git-Basics-Working-with-Remotes

于 2011-02-25T16:50:46.200 回答
180

这是远程获取合并的示例。

cd /home/you/projectA
git remote add projectB /home/you/projectB
git fetch projectB

那么你就可以:

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

或者您甚至可以合并整个分支(仅当您确实需要合并所有内容时)

git merge projectB/master
于 2012-07-13T20:20:11.450 回答
168

你可以做到,但它需要两个步骤。就是这样:

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

替换<remote-git-url>为您想要从中挑选的存储库的 url 或路径。

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

您可以用FETCH_HEAD分支中的 git SHA 替换。

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

于 2013-03-14T22:40:58.260 回答
64

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

# Cloning our fork
$ git clone git@github.com: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

于 2014-09-16T20:16:37.783 回答
18

请参阅如何使用 Git 创建和应用补丁。(根据您问题的措辞,我假设这个其他存储库用于完全不同的代码库。如果它是相同代码库的存储库,您应该按照@CharlesB 的建议将其添加为远程。即使它是另一个代码库,我想您仍然可以将其添加为远程,但您可能不想将整个分支放入您的存储库中......)

于 2011-02-25T16:51:08.343 回答
13

您可以按照以下方式在一行中执行此操作。希望您在 git 存储库中需要精心挑选的更改,并且您已签出正确的分支。

git fetch ssh://git@stash.mycompany.com: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]

于 2015-09-17T09:47:50.190 回答
5

是的。获取存储库,然后从远程分支中挑选。

于 2011-02-25T16:51:07.417 回答
2

假设A是您要从中挑选的仓库,并且B是您想要挑选的仓库,您可以通过添加</path/to/repo/A/>/.git/objects</path/to/repo/B>/.git/objects/info/alternates. alternates如果此文件不存在,请创建此文件。

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

于 2016-04-08T19:14:24.830 回答
2

对于这种情况,对于某些本地化验证,必须“挑选”提交。对于相同的存储库签出,也可能是本地提交(即尚未推送到服务器)。

例如

  • 回购1similar到回购2
  • repo1 有分支b1- HEAD 在本地进行了 2 次提交(包括commit_x)。
  • repo2 有分支bb1- 需要to cherry-pickcommit_x。

为了这,

$ cd repo2

repo2 $ git fetch <path_to_repo1>

repo2 $ git cherry-pick <commit_x>

在上述情况下,commit_x现在可以识别和拾取(借助fetch)。

于 2021-07-12T09:32:22.273 回答
0

我的情况是,我有一个团队推送到的裸仓库,以及它旁边的一个克隆。Makefile 中的这组行对我来说可以正常工作:

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

通过保持裸 repo 的 master 为最新,我们能够挑选出发布到裸 repo 的提议更改。我们还有一种(更复杂的)方法来挑选多个分支进行综合审查和测试。

如果“什么都不知道”意味着“不能用作遥控器”,那么这无济于事,但是当我在谷歌上搜索以提出这个工作流程时,这个 SO 问题出现了,所以我想我会做出贡献。

于 2013-05-31T19:04:58.427 回答
0

如果您想为给定文件挑选多个提交,直到达到给定提交,请使用以下内容。

# Directory from which to cherry-pick
GIT_DIR=...
# Pick changes only for this file
FILE_PATH=...
# Apply changes from this commit
FIST_COMMIT=master
# Apply changes until you reach this commit
LAST_COMMIT=...

for sha in $(git --git-dir=$GIT_DIR log --reverse --topo-order --format=%H $LAST_COMMIT_SHA..master -- $FILE_PATH ) ; do 
  git --git-dir=$GIT_DIR  format-patch -k -1 --stdout $sha -- $FILE_PATH | 
    git am -3 -k
done
于 2020-01-23T15:04:41.943 回答