0

マスターブランチから新しいブランチを開始しています。しかし、私は新しいブランチの歴史全体を望んでいません。ブランチを開始するためのコミットを1つだけにします。

新しいブランチを作成し、すべてのコミットをリベースしようとしましたが、以前のコミットがないため、機能しません。「前のコミット」というものがわかりません...

たぶん、コミットを潰したほうがいいでしょう。しかし、私の新しいブランチは、作成時にすでにマスターとマージされています。

どうすればいいのかわかりません。アイデアはありますか?

4

2 に答える 2

2

あなたは少しの配管を使用してそれを行うことができます:

tree=$(git log -1 --format=%T master)
commit=$(git commit-tree $tree -m "initial commit")
git checkout -b new_branch $commit

説明:

  1. に現在のコミットからツリー(データ)のみを抽出しmasterます。これは、本当に関心があるためです。ツリーオブジェクトのSHA1は、によって出力されgit log -1 --format=%T、に保存されます。$tree

  2. 親を持たないそのツリーからコミットを作成します。git commit-treeこれは、ツリーオブジェクトとコミットメッセージを受け取り、コミットオブジェクトを作成するplumbingコマンドを使用して実行されます。通常は親のコミットも必要ですが、この場合は親が必要ないため、親を指定しません。このコマンドは、結果のコミットのSHA1を出力し、これをに保存し$commitます。

  3. 3番目の最も簡単なステップは、通常ので行われる、新しいコミットを開始点としてブランチを作成することgit checkout -bです。

編集:これを行うためのはるかに簡単な方法は、git checkout --orphan new_branch master後に続くを使用することgit commit -m "Initial commit"で、まったく同じ結果になります。上記の説明を研究することでgitについていくつかの詳細がわかったので、上記の説明は教育目的のために残しておきます。また、gitは理由のためにこれを行うのを難しくしていることに注意してください-履歴の追跡が強く推奨されます-したがって、これを行う場合は、正当な理由があることを確認してください。

于 2012-09-12T17:44:22.583 に答える
1

私が見るように、あなたはブランチが何であるかを理解していません。ブランチはコミットへの単なるポインタです。マスターからブランチを作成する場合、コミットは作成しません。新しいブランチは、マスターとまったく同じコミットを指しているだけで、どちらも同じものを表します。したがって、潰したりリベースしたりするものはまだなく、歴史もまだありません。

いくつかの変更を行ってブランチにコミットした後でのみ、質問は理にかなっています。ブランチで行われたすべての変更を1つのコミットとしてマスターにマージする方法は?を使用するだけgit merge --squash branchです。

于 2012-09-12T17:44:32.100 に答える