私は自分のニーズに合わせて変更したgitリポジトリ内にワードプレスのテーマを持っています。現在、テーマのバージョンアップデートがリリースされています。テーマの更新用に新しいブランチを作成し、そこに更新をコミットしました。master
今、マージ時にブランチの変更を保持したいと思います。
しかし、どのように?
ブランチを にマージするmaster
とgit merge theme
、保存したい変更が上書きされます!
では、どうすればいいのでしょうか?
theme
テーマへの変更をコミットした後に分岐した場合、それらはすでに分岐バージョン(git用)になっているため、上書きされます。しかし、あなたはそれを修正することができます。まず、すでにマージしている場合は、へのtheme
ブランチをmaster
通過してgit log
(またはgitkを使用して)、マージする前theme
にマスターがあったコミットを見つけます(git reflog
これも知っているかもしれません)。実行git reset --hard $commitid
します。ここ$commitid
で、見つけたコミットのIDです。これは(悪い)マージを元に戻すためです。
次に、まだマスターで、テーマに変更を加える前にgit log
、最初のコミットを確認します。コミットIDを書き留めて実行し、メモしたIDに置き換えます。COMMITID
git checkout COMMITID
Gitは、切り離されたHEADなどについて何かを発声しますが、今のところそれを無視します。今、あなたは再び分岐します:
git checkout -b theme-new # equivalent to git branch theme-new
これにより、マスターがであったのとまったく同じ状態でブランチが作成されCOMMITID
ます。ここで、新しいテーマバージョンを再度ダウンロードして、リポジトリにコピーします。その変更をコミットします。マスターに戻ります。
git checkout master
マスターが最後にコミットしたことを確認します。次に、次のことを行います。
git merge theme-new
競合が発生する可能性があります。競合の管理方法については、gitbookのこの役立つリファレンスを参照してください。マージを行った後、あなたはまさにあなたが望むものを手に入れるはずです。
これが機能する理由:カスタムテーマを既にコミットした後、マスターから分岐しました。それによって、gitは、新しいブランチに、カスタマイズされたテーマがすでに含まれていると想定します。更新されたテーマをアップストリームからコピーして(そしてそれをコミットして)、ダウンロードしたバージョンでカスタマイズしたバージョンを完全に上書きすることをgitに伝えます。マージ時に、gitは2つのブランチが持つ最新の共通コミット(カスタマイズを含む)を探し、その後に行われたコミットのみを適用します。
したがって、テーマ全体をアップストリームバージョンで上書きする正確なコミットが適用されます。あなたは明らかにそれを望んでいません。上で説明したことを実行することで、アップストリームバージョンが実際に作成したバージョンと「並行して」作成されたことをgitに伝えることができます。したがって、より注意深く、変更をマージする方法を確認します。素敵な図を描きます。
G---H theme
/
A---B---C---D master
\
E---F theme-new
コミットし、テーマをカスタマイズする前のデータと開発の最初のチェックインであると想定しA
ますB
。C
さらに、それがテーマをカスタマイズしたコミットであり、別のものであると想定しD
ます。G
とは、アップストリームからパッケージをダウンロードして適用するためにH
行ったコミットですが、実際には同じですが、別のブランチにあります。theme
E
F
theme
マージとマスターの違いはtheme-new
、ブランチが実際に分岐する場所だけmaster
です。これは非常に重要です。ご覧のとおり、カスタマイズ後に分岐したため、gitはカスタマイズがに含まれていると想定しています。しかし、では、変更前に分岐したため、gitはそれを想定していません。したがって、カスタマイズとの実際のマージを試みます。theme
theme-new