1

私は自分のニーズに合わせて変更したgitリポジトリ内にワードプレスのテーマを持っています。現在、テーマのバージョンアップデートがリリースされています。テーマの更新用に新しいブランチを作成し、そこに更新をコミットしました。master今、マージ時にブランチの変更を保持したいと思います。

しかし、どのように?

ブランチを にマージするmastergit merge theme、保存したい変更が上書きされます!

では、どうすればいいのでしょうか?

4

1 に答える 1

1

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ますBCさらに、それがテーマをカスタマイズしたコミットであり、別のものであると想定しDます。Gとは、アップストリームからパッケージをダウンロードして適用するためにH行ったコミットですが、実際には同じですが、別のブランチにあります。themeEF

themeマージとマスターの違いはtheme-new、ブランチが実際に分岐する場所だけmasterです。これは非常に重要です。ご覧のとおり、カスタマイズに分岐したため、gitはカスタマイズに含まれていると想定しています。しかし、では、変更前に分岐したため、gitはそれを想定していません。したがって、カスタマイズとの実際のマージを試みます。themetheme-new

于 2012-12-12T19:46:15.950 に答える