私は他のgitリポジトリからコミットする必要があるgitリポジトリを使って作業しています。
通常、私はreflogでHEAD@{x}
を使ってチェリーピックしますが、この.git
はこのreflogエントリ(別の物理ディレクトリ)を認識していないので、これをチェリーピックできますか、それともどうすればいいですか。
私はgit-svn
を使っています。私の最初のブランチはSubversionリポジトリのtrunk
のgit-svn
を使っています、そして次のブランチはSubversionブランチのgit-svn
を使っています。
他のリポジトリをリモートとして追加してから、その変更を取得する必要があります。そこからあなたはコミットを見て、あなたはそれをチェリーピックすることができます。
そのように:
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
答えは、与えられたように、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者間マージを試みることを意味します)。それが説明してくれることを願っています。
これが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
それはできますが、2つのステップが必要です。方法は次のとおりです。
git fetch <remote-git-url> <branch> && git cherry-pick FETCH_HEAD
<remote-git-url>
を、チェリーピックしたいリポジトリのURLまたはパスに置き換えます。
<branch>
をリモートリポジトリから選択したいブランチ名またはタグ名に置き換えます。
FETCH_HEAD
をブランチのgit SHAに置き換えることができます。
更新:@ pkalinowのフィードバックに基づいて修正。
これが、リモートを追加し、ブランチを取得し、コミットをチェリーピックする手順です。
# 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
Gitでパッチを作成して適用する方法 を参照してください。 (あなたの質問の文言から、私はこの他のリポジトリが全く異なるコードベースのためのものであると仮定しました。それが同じコードベースのためのリポジトリなら、あなたは@CharlesBによって提案されるようにリモートとしてそれを追加するべきです。コードベース、私はあなたがまだリモートとしてそれを追加することができると思いますが、あなたはあなたのリポジトリにブランチ全体を入れたくないかもしれません...)
次のように一行でそれをすることができます。あなたが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]
はい。リポジトリを取得し、リモートブランチからチェリーピックします。
私の状況は、私がチームが推し進める裸のレポと、その隣に座っているそのクローンを持っているということでした。 Makefile内のこの一連の行は、私にとっては正しく機能します。
git reset --hard
git remote update --Prune
git pull --rebase --all
git cherry-pick -n remotes/Origin/$(BRANCH)
ベアリポジトリのマスターを最新の状態に保つことで、ベアリポジトリに対して公開された変更案を簡単に選択することができます。私たちはまた、統合されたレビューとテストのために複数のブランチをチェリーピックする(より複雑な)方法を持っています。
「何も知らない」ことが「リモートとして使用できない」ことを意味するのであれば、これは役に立ちませんが、このワークフローを思いつくためにグーグルしていたときにこのSO質問が起こりました。私は貢献したいと思います。
A
がチェリーピックしたいレポであり、B
がチェリーピックしたいレポであると仮定すると、</path/to/repo/A/>/.git/objects
に</path/to/repo/B>/.git/objects/info/alternates
を追加することによってこれを行うことができます。このalternates
ファイルが存在しない場合は作成します。
これにより、リポジトリBはリポジトリAのすべてのgitオブジェクトにアクセスできるようになり、チェリーピック作業が自動的に行われます。