19

master と gh-pages の 2 つのブランチを含むプロジェクトがあります。これらは基本的に 2 つの異なるプロジェクトであり、gh-pages プロジェクトはマスター プロジェクトに依存します (その逆はありません)。「master にはソース コードが含まれ、gh-pages にはそれらのソース ファイルからビルドされたバイナリが含まれる」と考えてください。定期的に、マスターに蓄積された変更を取得し、「マスター コミット xxxxxxxx と一致させる」というコミット メッセージを使用して、gh-pages ブランチに新しいコミットを行います。

現在のネットワーク グラフの外観

これをしばらく行った後、gh-pages コミットの「マスター コミット xxxxxxxx と一致させる」が実際に git リポジトリの親として xxxxxxxx を持っていればいいことに気付きました。このように (悪い MSPaint アート):

理想的にはどのように見えるか

リポジトリを上の 2 番目の画像のようにする方法はありますか? 新しいコミットを次のパターンにする方法を知っています: "git merge -s ours master" (そうでなければ空のコミットの親を設定します) の後に "git commit --amend adv550.z8" (ここで adv550.z8は、実際に変更されているバイナリ ファイルです)。しかし、git を使用すると、時間をさかのぼって古いコミットに新しい親を簡単に追加できますか?

ローカルリポジトリが正しく表示されたら、「git push -f」を実行して、Github リポジトリの現在の履歴を吹き飛ばしても構わないと思っています。問題は、ローカル リポジトリを正しく表示できるかどうかです。


数年後に追加して編集:最終的に、git 履歴をそのように見せる試みを断念しましgh-pagesた。私は、利益をゼロにするのは大変な作業だと判断しました。私の新しい習慣は、コミットを積極的に squash することgh-pagesです。私の場合、これらのコミット メッセージを保存することは実際には問題にならないからです。(これは「マスターコミットに合わせて...」という長い行であり、歴史的に興味深いものはありません。)ただし、これをもう一度行う必要がある場合は、次のような回答を聞きます。

git merge $intended_parent_1 $intended_parent_2
git checkout $original_commit -- .
git commit --amend -a -C $original_commit
4

5 に答える 5

2

時間をさかのぼって既存のコミットを変更することはできません。のようなことをしてもgit commit --amend、実際にはコミットを変更していません。ツリーの同じ場所に新しいものを作成し、元のすべてのコンテンツ (および変更) を使用します。--amendの後にコミット ハッシュが変更され、元のハッシュがリポジトリにまだ存在していることに気付くでしょうgit reflog

一方、時間をさかのぼって別の宇宙を作成することもできます。gh-pages基本的に、分岐点に戻り、すべてを (eggit cherry-pickなどを使用して) 並列分岐として再作成します。コミットは異なるオブジェクトであるため、ハッシュは変更されます。

(同じブランチ内の別々のディレクトリではなく、別々のブランチとしてレポを設定している理由に興味があります。コード->ビルドプロセスが面倒になるようです。)

于 2012-05-30T01:07:04.910 に答える