作業ディレクトリをクリーンアップする必要がないという要件を考えると、スクリプトを使用しても、作業ツリーまたはインデックスをクリーンアップする必要がないことを意味していると思います。その場合、現在のローカル リポジトリの範囲内で解決策を見つけることはできません。Git は、マージ時にインデックスを広範囲に使用します。競合がなければ作業ツリーについてはわかりませんが、一般的に、マージは現在チェックアウトされているブランチと密接に結びついています。
ただし、現在のレポを何も変更する必要がない別の方法があります。ただし、リポジトリのクローンを持っているか作成する必要があります。基本的には、レポを複製してから、クローンでマージを行い、元のレポにプッシュして戻します。これがどのように機能するかの簡単な例です。
まず、使用するサンプル リポジトリが必要です。次の一連のコマンドで作成されます。最終的にmaster
、現在のブランチと、および という名前の変更をマージする準備ができている他の 2 つのブランチになりchange-foo
ますchange-bar
。
mkdir background-merge-example
cd background-merge-example
git init
echo 'from master' > foo
echo 'from master' > bar
git add .
git commit -m "add foo and bar in master"
git checkout -b change-foo
echo 'from foo branch' >> foo
git commit -am "update foo in foo branch"
git checkout -b change-bar master
echo 'from bar branch' >> bar
git commit -am "update bar in bar branch"
git checkout master
で作業していて、 にマージしmaster
たいとします。ここでは、私たちがどこにいるかを半グラフィカルに描写しています。change-bar
change-foo
$ git log --oneline --graph --all
* c60fd41 update bar in bar branch
| * e007aff update foo in foo branch
|/
* 77484e1 add foo and bar in master
次のシーケンスは、現在のマスター ブランチに干渉することなくマージを完了します。これをスクリプトに詰め込むと、素晴らしい「background-merge」コマンドが得られます。
# clone with absolute instead of relative path, or the remote in the clone will
# be wrong
git clone file://`realpath .` tmp
cd tmp
# this checkout auto-creates a remote-tracking branch in newer versions of git
# older versions will have to do it manually
git checkout change-foo
# creating a tracking branch for the other remote branch is optional
# it just makes the commit message look nicer
git branch --track change-bar origin/change-bar
git merge change-bar
git push origin change-foo
cd ..
rm -rf tmp
簡単に言えば、現在のリポジトリをサブディレクトリに複製し、そのディレクトリに入り、マージを実行してから、元のリポジトリにプッシュします。完了後にサブディレクトリを削除します。大規模なプロジェクトでは、毎回新しいクローンを作成するのではなく、最新の状態に保たれる専用のクローンが必要になる場合があります。マージとプッシュの後、最終的には次のようになります。
$ git log --oneline --graph --all
* 24f1916 Merge branch 'change-bar' into change-foo
|\
| * d7375ac update bar in bar branch
* | fed4757 update foo in foo branch
|/
* 6880cd8 add foo and bar in master
質問?