gitで複数のブランチを一度にプルする方法は?


13

リポジトリには、「master」と「develop」などの複数のブランチがあり、リモートブランチ「origin / master」と「origin / develop」を追跡するように設定されています。

マスターと開発の両方を一度にマージ(早送り)することを指定できますか?

私がgit pull今やると、次のようなものが得られます:

remote: Counting objects: 92, done.
remote: Compressing objects: 100% (56/56), done.
remote: Total 70 (delta 29), reused 28 (delta 8)
Unpacking objects: 100% (70/70), done.
From scm.my-site.com:my-repo
   5386563..902fb45  develop    -> origin/develop
   d637d67..ba81fb2  master     -> origin/master
Updating 5386563..902fb45
Fast-forward

すべてのリモートブランチがフェッチされますが、現在作業しているブランチだけが対応するリモートブランチとマージされます。

だから私はしなければなりませんgit checkout master...

Switched to branch 'master'
Your branch is behind 'origin/master' by 106 commits, and can be fast-forwarded.

...そしてgit pull再び、次に開発に切り替えて、望ましい結果を得ます。

これらの手順を実行するエイリアス/スクリプトを作成できることはわかっています。ただし、エラーが発生しやすく、効率が悪いため、可能であればそれを避けたいと思います
編集:わかりました、言い換えましょう。私の目標は、スクリプトやエイリアスのgitのカスタマイズを思いとどまらせたり、眉をひそめたりすることではありませんでした。組み込みのソリューションが存在する場合は、それを優先します:)


私は試しましgit pull origin refs/heads/develop:refs/remotes/origin/develop refs/heads/master:refs/remotes/origin/masterたが、リモートマスターが開発にマージされました
。–スーパーロール

1
エラーが発生しやすい、または非効率的なのはなぜですか?Gitはこのようにカスタマイズすることを目的としています。ところで、各ブランチをチェックアウトする必要がないようにするには、pullをa に分割し、fetch次にa mergeを各ブランチに分割します。
jjlin

@jjlinは、効率を上げるのに役立つ可能性がある各ブランチをチェックアウトせずに実行できる場合は問題ありません。エラーになる可能性のあるもののマトリックスと、それがスクリプトの残りの部分に及ぼす影響はやや複雑なので、エラーが発生しやすくなります。安全にすることは不可能だと言っているわけではありませんが、トレードオフになります。だから私はそれが存在するなら組み込みのソリューションを好みます:)
Superole '24

回答:


11

git fetchrefspecs で使用するエイリアスを設定して、1つのコマンドだけでブランチを早送りマージできます。これをユーザー.gitconfigファイルのエイリアスとして設定します。

[alias]
    sync = "!sh -c 'git checkout --quiet --detach HEAD && \
                    git fetch origin master:master develop:develop ; \
                    git checkout --quiet -'"

使用法:git sync

これが機能する理由は次のとおりです。

  1. git checkout --quiet HEAD現在のコミットを直接チェックアウトし、ヘッド切り離した状態にします。この方法では、masterまたはの場合develop、作業コピーをそれらのブランチポインターから切り離し、それらを移動できるようにします(Gitでは、作業コピーにブランチ参照がチェックアウトされている間はブランチ参照を移動できません)。

  2. git fetch origin master:master develop:developrefspecs with fetchを使用して、ローカルリポジトリのmasterand developブランチを早送りします。構文は基本的にGitに「ここにフォームのrefspecがあり、それを<source>:<destination>取り出し<destination>て同じポイントに早送りします」と伝えます<source>。したがって、エイリアスのソースはからのブランチoriginであり、宛先はこれらのブランチのローカルリポジトリバージョンです。

  3. 最後git checkout --quiet -に、前のコマンドでエラーが発生したかどうかに関係なく、最後にアクセスしたブランチをチェックアウトします。したがって、実行master時にオンになっていてgit sync、すべてが成功した場合は、ヘッドを取り外した状態のままにして、新しく更新されたを確認しmasterます。

gitへの私の回答も参照してください:ローカルブランチをチェックアウトせずに更新しますか?


ここでデタッチドマジックがよくわかりません。開発がチェックアウトされているときに、マスターへのポインタを移動できないのはなぜですか?...とにかくこれを試してみたところ、「あなたのブランチは1つのコミットで 'origin / develop'よりも先になっています」以外は機能するようです。
Superole 2013

...次にプルするときに解決されます
スーパーロール2013

@Superole エイリアスを使用する場合、どのブランチが先origin/developですか?それがあなたの地元のdevelop支店だったとしても意味がありません。また、チェックアウトされている場合はのポインターをmaster 移動できますがdevelopチェックアウトされている場合mastermaster作業コピーに影響するため早送りできないので、作業コピーを切り離します。それを最初に使用してgit checkout head。私はそれを「岩の上に立っている」と説明する別の答えを見ました、あなたはそれを動かす前に岩から降りなければなりません。
40XUserNotFound 2013

それは確かに私の地元の発展でした。そして、その理由は、このフェッチが追跡ブランチを更新しないことです。私が理解しているように; プルはorigin / developにフェッチし、それを開発にマージします。
スーパーロール2013

この答えが原因であることが非常に重要ですfatal: bad config line xx in file xxx。セミコロンが原因です。この問題を回避するには、コマンド全体を二重引用符で囲む必要があります。
William Leung

1

git-upをインストールします。git-upリポジトリ内のすべてのローカルブランチをプルするコマンドを提供します。


甘い!是非チェックしてみます。
Superole、2015年

2
heh:P Windowsがサポートするステートメントは予想外にありません。そして、あなたの代わりにそれが間違いなくあなたのgitセットアップを台無しにしたり、データを削除したり、ハッカーニュースに狂ったドライブを投稿したりしないという厳密な証拠はまだ策定されていません。、Rubyの必要性と相まって、私を追い払った。でもコンセプトは好きです。
Superole 2015年

グラッド方法がありますすべてでは ...ちょっと嫌な、一つ一つの方法は、必要とするものの、いくつかのサードパーティ製のツールを。このようなものと、特定の(プラットフォーム固有の)シェルを使用するシェルコマンド「レシピ」またはエイリアスを持つものなど。
0xC0000022L 2018

0

gitが複数のブランチにプルインする組み込みオプションはないようです。少なくともバージョン1.8.0ではできません。けれども@カップケーキの答えはそれに近いです。

しかし、@ jjlinのコメントから、少なくとも2回プルする必要がないことに気づきました。

したがって、もう少し効率的なシーケンスは次のようになります。

git pull
git checkout master
git merge origin/master
git checkout -

必然的にエイリアスを作成することになりましたが、エイリアスをそのままにして、別のブランチを早送りするだけに集中することにしました。

[alias]
ffwd = "!_() { git checkout $1 && git merge --ff-only origin/$1 && git checkout -; }; _"

もちろん、テストを行わない場合、このエイリアスは最初の引数としてff'ableブランチの有効な名前を指定していることを前提とし、それ以外の場合は未定義の動作をします。また、2つ以上のブランチを持つユースケースには最適ではありませんが、今必要なものは得られます。

git pull
git ffwd master
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.