web-dev-qa-db-ja.com

他のgitリポジトリからコミットを選択することは可能ですか?

私は他のgitリポジトリからコミットする必要があるgitリポジトリを使って作業しています。

通常、私はreflogでHEAD@{x}を使ってチェリーピックしますが、この.gitはこのreflogエントリ(別の物理ディレクトリ)を認識していないので、これをチェリーピックできますか、それともどうすればいいですか。

私はgit-svnを使っています。私の最初のブランチはSubversionリポジトリのtrunkgit-svnを使っています、そして次のブランチはSubversionブランチのgit-svnを使っています。

626
gitcoder182

他のリポジトリをリモートとして追加してから、その変更を取得する必要があります。そこからあなたはコミットを見て、あなたはそれをチェリーピックすることができます。

そのように:

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

458
CharlesB

答えは、与えられたように、format-patchを使うことですが、問題は他のフォルダからチェリーピッキングする方法であったので、これをするためのコードの一部です:

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

@cong ma からの説明)

git format-patchコマンドは、そのSHAで指定されたsome_other_repoのコミットからパッチを作成します(単一のコミットのみの場合は-1)。このパッチは、パッチをローカルに適用するgit amにパイプされます(パッチが正しく適用されない場合、-3は3者間マージを試みることを意味します)。それが説明してくれることを願っています。

796
Robert Wahler

これが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
132
Brian

それはできますが、2つのステップが必要です。方法は次のとおりです。

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

<remote-git-url>を、チェリーピックしたいリポジトリのURLまたはパスに置き換えます。

<branch>をリ​​モートリポジトリから選択したいブランチ名またはタグ名に置き換えます。

FETCH_HEADをブランチのgit SHAに置き換えることができます。

更新:@ pkalinowのフィードバックに基づいて修正。

113
docwhat

これが、リモートを追加し、ブランチを取得し、コミットをチェリーピックする手順です。

# 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

55
jaredwilli

Gitでパッチを作成して適用する方法 を参照してください。 (あなたの質問の文言から、私はこの他のリポジトリが全く異なるコードベースのためのものであると仮定しました。それが同じコードベースのためのリポジトリなら、あなたは@CharlesBによって提案されるようにリモートとしてそれを追加するべきです。コードベース、私はあなたがまだリモートとしてそれを追加することができると思いますが、あなたはあなたのリポジトリにブランチ全体を入れたくないかもしれません...)

16

次のように一行でそれをすることができます。あなたがgitリポジトリにいてチェリーな変更を必要としていて、あなたが正しいブランチにチェックアウトしていることを願っています。

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

git fetch [ブランチURL] [チェリーピックへのブランチ] && git cherry-pick [コミットID]

7
Don

はい。リポジトリを取得し、リモートブランチからチェリーピックします。

4
wilhelmtell

私の状況は、私がチームが推し進める裸のレポと、その隣に座っているそのクローンを持っているということでした。 Makefile内のこの一連の行は、私にとっては正しく機能します。

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

ベアリポジトリのマスターを最新の状態に保つことで、ベアリポジトリに対して公開された変更案を簡単に選択することができます。私たちはまた、統合されたレビューとテストのために複数のブランチをチェリーピックする(より複雑な)方法を持っています。

「何も知らない」ことが「リモートとして使用できない」ことを意味するのであれば、これは役に立ちませんが、このワークフローを思いつくためにグーグルしていたときにこのSO質問が起こりました。私は貢献したいと思います。

0
Paul Hulett

Aがチェリーピックしたいレポであり、Bがチェリーピックしたいレポであると仮定すると、</path/to/repo/A/>/.git/objects</path/to/repo/B>/.git/objects/info/alternatesを追加することによってこれを行うことができます。このalternatesファイルが存在しない場合は作成します。

これにより、リポジトリBはリポジトリAのすべてのgitオブジェクトにアクセスできるようになり、チェリーピック作業が自動的に行われます。

0
pranavk