現在のブランチを別のブランチにマージする方法


182

私はmasterとdevの2つのブランチを持っています。私は常に開発に取り組んでおり、本番環境での使用が承認されたら、masterブランチにコードをチェックインします。そうするとき、私は次のことをしなければなりません:

git checkout master
git merge dev
git checkout dev

それはひどく冗長で、私は頻繁に行うので、それを最小限にしたいと思います。最初にマスターブランチをチェックアウトせずに、現在のブランチdevから他のブランチマスターにマージするために使用できるgitコマンドはありますか?多分次のようなもの:

git merge dev to master

素晴らしいだろう。gitのドキュメントを調べても何も見つかりませんでした。


1
これにgit pushを使用してみましたか?
Jay Sullivan

11
プッシュの提案とは何ですか?これは、自分のリポジトリ内でマージするのではなく、リモートを更新するためのものです。
Cascabel

4
Jefromiは正解です。プッシュはここでは役に立ちません。私はリモートブランチではなく、別のローカルブランチについて話しています。
Chris

2
あなたがコミットされていないローカルな変更がある場合であっても悪いことです:git stashgit checkout mastergit merge devgit checkout devgit stash pop
Mu Mind

2
いい質問です 非現在のブランチを利用したかったので、これも必要でした。作業ツリー内のファイルが変更された場合にビルドを開始するプロセスがあるため、ブランチの切り替えを避けたかったのです。
ケルビン

回答:


94

1.ローカルリポジトリのリモートエイリアスを追加します。例:

git remote add self file:///path/to/your/repository

(またはWindowsの場合git remote add self C:\path\to\your\repository

2.セルフリモートにプッシュします例:

git push self dev:master

2
サブモジュール!これは、質問の問題を解決するだけでなく、サブモジュールだけの場合のブランチの切り替えの問題も解決します。すばらしいヒントです。
eddiemoya

2
+1これは創造的であり、作業ツリーにまったく触れません。ただ明確にする/path/to/your/repositoryと、これは作業ツリーへのパス.gitです。つまり、ディレクトリを含めないでください。また、これは言うまでもありません。リポジトリを移動した場合は、リモートを更新する必要があります。
ケルビン

私はこれをWindowsで動作させるための運がありません... git remote add self file:///c/projects使用方法のメモが返されます
Maslow

2
@ JosephK.Strauss最初にマスターを現在のブランチ(dev)にマージし、次にを使用してマージコミットをプッシュできgit push self dev:masterます。
Leonid Shvechikov

4
なぜリモートエイリアスなのですか?.私にとってはうまくいきました:git push . head:master
geon 2016年

60

@zeromeによる現在の最高投票数の回答は良いものですが、少し不必要に冗長です。

git repoのベースでこれを行うことができます: git push . dev:master

ツリーのどこでも機能する、より一般化されたソリューションは次のとおりです。

git push $(git rev-parse --show-toplevel) dev:master

3
git push . dev:master私の人生を大幅に簡略化しました!これまでで最高の答えは、あなたに感謝
ジェレミーBelolo

マージされたマスターをgithubなどのリモートリポジトリにプッシュしますか?実行してステップを保存git push origin dev:master
Alex R

1
merge --no-ffこれで動作を再現することは可能ですか?
exhuma 2017

1
無効なリモート名 "。"を取得しています。Windowsで。私はまだやる必要がありgit remote add self file:///myRepoますか?
kiewic

1
しかし、これは実際にはマージを行いません... devがmasterよりも優先されている場合は機能しますが、そうでない場合はどうなりますか?
トーマスレベスク2018

44

あなたの最善の策は、グローバルgitconfig(~/.gitconfig)に配置されたエイリアスを使用することです:

[alias]
    merge-to = "!f() { git checkout $1 && git merge $2 && git checkout -; }; f"

次のように任意のリポジトリから呼び出すことができます

git merge-to master dev

3
マージが自動ではないがマージ解決が必要な場合はどうなりますか?(この場合、私はマスターで作業が行われないと想定しているので、それは起こりませんが、それでも)...
Stein G. Strindhaug

@Stein:&&ではなくを使用したため;、マージに失敗し、元に戻そうとしませんでした。うまくいけば、ユーザーは「マージに失敗しました」というメッセージを見てそれを処理するのに十分賢いです。
カスカベル

6
私はこのmerge-to = "!f() { export tmp_branch=gitブランチを好みます| grep '*' | TR -d「*」; git checkout $1 && echo git merge $tmp_branch && echo git checkout $tmp_branch; unset $tmp_branch; }; f"私がマージしたい場合、それは、私が上で、現在よブランチで入力する必要がないのを聞かせそうdevmaster、私は上だdev今私はちょうどタイプgit merge-to master
スティーブ・

2
正しいバックmerge-to = "!f() { export tmp_branch=`git branch | grep '* ' | tr -d '* '`; git checkout $1 && git merge $tmp_branch && git checkout $tmp_branch; unset $tmp_branch; }; f"
ティック

2
unsetコマンドは正しくありません。修正済み:merge-to = "!f(){export tmp_branch = git branch | grep '* ' | tr -d '* '; git checkout $ 1 && git merge --no-ff $ tmp_branch && git checkout $ tmp_branch; unset tmp_branch;}; f"
sassman

38

現在のブランチに入力する必要のないJefromiエイリアスからの小さな変更。

したがって、次のように使用しますgit merge-to dev

これはdevブランチに切り替わり、それをCURRENTとマージしてから元に戻ります。

たとえば、masterブランチ上にいると仮定すると、マスターがdevにマージされ、引き続きマスター上にいます。

それは間違いなく私のドットファイルに行きます:)

[alias]
  merge-to = "!gitmergeto() { export tmp_branch=`git branch | grep '* ' | tr -d '* '` && git checkout $1 && git merge $tmp_branch && git checkout $tmp_branch; unset tmp_branch; }; gitmergeto"

6

これは古いですが...

上記の@ kevin-lydaと@ dmytrii-nagirniakのソリューションを組み合わせる。このエイリアスは、現在のブランチを指定されたブランチにマージします。これは、remotesメソッドを使用し、gitコマンドを使用してコンテキストを取得します。

[alias]
    merge-to = "!gitmergeto() { git push \"`git rev-parse --show-toplevel`\" `git rev-parse --abbrev-ref HEAD`:$1; } && gitmergeto"

次のように使用します:

git merge-to other-branch-name

4

他のブランチをチェックアウトせずに現在のブランチを別のブランチにマージするには:

早送りマージ

これは本当に簡単です。定義により、早送りマージは、ブランチポインタがコミットツリーの前に移動することを意味します。だからあなたがする必要があるのは単にそれをシミュレートすることです:

git branch -f master dev

警告:これはmasterdevブランチまたは他のブランチにあるコミットをポイントすることを前提としています。そうしないと、作業を失うリスクがあります!git merge早送りが不可能な場合にマージコミットを作成する(または不平を言う)とは異なり、このメソッドは暗黙的にブランチポインターを強制的に別のコミットにポイントします。

これは、あなたがリポジトリで作業している唯一の人である、および/またはあなたが何をしているのかを知っていると仮定しています。

ヒント: aを実行し、にgit fetch新しいコミットがorigin/masterある場合は、masterチェックアウトせずにブランチを移動できます。

git branch -f master origin/master

マージコミットによるマージ

これは常に可能であるとは限りません。マージコミットを作成するには、マージ操作を行う必要があります。マージ操作を行うには、現在のブランチにない他のブランチにコミットする必要があります。

あなたがコミット持っている場合はmasterあるブランチではないdevブランチを、次のことができます。

免責事項:これは単なる概念実証であり、チェックアウトせずに他のブランチへのマージが可能な場合があることを示しています。毎日使用する場合は、シェルリダイレクトを使用してエイリアスを作成するか、シェルスクリプトを作成する必要があります。次に、質問に示した短いプロセス用のシェルスクリプトを作成することもできます。

git checkout -b temp
git merge --no-ff -e master
git branch -f master temp
git checkout dev
git branch -D temp

説明:

  1. 現在のブランチと同じコミットを指す一時的なブランチをチェックアウトします。
  2. master一時的なブランチにマージし、コミットメッセージエディターを起動します。マージコミットをブランチをにマージしたようにしたい場合は、次のように編集します。devmaster

    Merge branch 'master' into temp
    

    これに:

    Merge branch 'dev'
    

    ヒント:-m "Merge branch 'dev'"代わりに-eを使用すると、処理が速くなります。

  3. masterマージコミットを指すようにブランチポインターを更新します。
  4. devブランチをチェックしてください。
  5. 一時的なブランチを強制的に削除します。

これはまだ作業ツリーに影響しますが、最小限です。ツリーを元の状態にロールバックmasterして、開発の変更をもう一度導入することはありません。気にしない人もいれば、重要な人もいます。


1

多くの場合、現在のブランチをマージしたいブランチから来ています。その場合、次のことができます。

git co - && git merge @{-1}

例えば:

git checkout somebranch      // (while on master)

// add some commits

git co - && git merge @{-1}  // will merge somebranch into master

1

私の解決策は他の回答と似ていますが、次の点が異なります。

  • 関数は読みやすくするために複数行に分割されています
  • 関数が呼び出されるset -exため、各コマンドが出力され、コマンドが失敗した場合、関数はすぐに終了します。
  • エイリアスは、最初の(ターゲットブランチ)以外の引数を git merge
  • 関数にはnullコマンド: git mergeが含まれており、これにより、一部のシェルセットアップ(gitfastoh-my-zshなど)でタブ補完が確実に機能するようになります。
[alias]
  merge-to = "!f() { : git merge ; \
      set -ex ; \
      local this=$(git rev-parse --abbrev-ref HEAD) ; \
      local target=$1 ; \
      shift ; \
      git checkout $target ; \
      git merge $this \"$@\" ; \
      git checkout $this ; \
    } ; f"
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.