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

时间:2011-02-25 16:47:42

标签: git cherry-pick

我正在使用一个git存储库,需要从另一个不知道第一个存储库的git存储库提交。

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

我正在使用git-svn。我的第一个分支是使用Subversion repo的git-svn trunk,而下一个分支在Subversion分支上使用git-svn

12 个答案:

答案 0 :(得分:803)

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

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

(来自@cong ma的解释)

     

git format-patch命令可以从some_other_repo创建补丁   由SHA(-1指定的提交仅用于一次提交)。这个   补丁通过管道传输到git am,它会在本地应用补丁(-3表示   如果补丁无法干净地应用,则尝试三向合并。希望   这解释了。

答案 1 :(得分:459)

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

就像那样:

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

答案 2 :(得分:133)

这是一个remote-fetch-merge的例子。

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

答案 3 :(得分:115)

你可以做到,但它需要两个步骤。方法如下:

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

<remote-git-url>替换为您希望挑选的存储库的网址或路径。

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

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

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

答案 4 :(得分:56)

以下是添加远程,获取分支和樱桃选择提交的步骤

# 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

答案 5 :(得分:17)

How to create and apply a patch with Git。 (根据你的问题的措辞,我假设这个其他存储库是用于完全不同的代码库。如果它是相同代码库的存储库,你应该将其添加为@CharlesB建议的远程存储库。即使它是另一个代码库,我想您仍然可以将其添加为远程,但您可能不希望将整个分支添加到您的存储库中...)

答案 6 :(得分:10)

您可以在一行中执行以下操作。希望你在git资源库中,需要樱桃挑选的更改,你已经检查出正确的分支。

git fetch ssh://git@stash.mycompany.com:7999/repo_to_get_it_from.git branchToPickFrom && git cherry-pick 02a197e9533
# 

git fetch [分支网址] [分支到樱桃挑选] &amp;&amp; git cherry-pick [提交ID]

答案 7 :(得分:5)

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

答案 8 :(得分:1)

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

例如

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

为此,

<块引用>

$ cd repo2

<块引用>

repo2 $ git fetch

<块引用>

repo2 $ git cherry-pick

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

答案 9 :(得分:0)

我的情况是,我有一个团队推动的裸仓库,以及紧挨着它的克隆。 Makefile中的这组行对我来说正常工作:

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

通过保持裸仓库的主人更新,我们能够挑选出一个发布到裸仓库的建议变更。我们还有一种(更复杂的)方式来挑选多个分支进行综合审查和测试。

如果“什么都不知道”意味着“不能用作遥控器”,那么这没有用,但是这个问题出现了,因为我正在谷歌上搜索这个工作流程所以我想我会回馈。

答案 10 :(得分:0)

假设A是你要挑选的回购,B是你要挑选的回购,你可以通过</path/to/repo/A/>/.git/objects添加</path/to/repo/B>/.git/objects/info/alternates来实现这一目标。 {1}}。如果不存在,请创建此alternates个文件。

这将使repo B访问repo A中的所有git对象,并为你做出樱桃挑选。

答案 11 :(得分: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