両方のブランチが と履歴を共有しておりmaster
、ここでのあなたの間違いは を使用しgit checkout -b branch2
ている間
に行ったものであると想定していますbranch1
。そうでない場合は、別の方法で修正する必要があります。
したがって、 と の両方がbranch1
とbranch2
履歴を共有していることを考えると、次のようにしてmaster
修正できます。branch2
$ git checkout branch2
$ git rebase --onto master branch1 branch2
これにより、 で導入されたコミットが取得されbranch2
、 から派生するようにリベースされmaster
ます。言い換えると、これgit rebase
は で導入されたコミットをドロップしますが、 では導入されbranch1
ず、 でmaster
導入されたコミットのみを残しbranch2
ます。
あなたの質問の 2 番目の部分については、いいえ、Git に特定のディレクトリを保持し、他のディレクトリを保持しないように指示する方法はありません。Git はツリーのコミットとスナップショットを扱い、git branch
単に「このコミットに基づいて新しいブランチを開始する」と言っています。履歴が完全に切断されることを意図している場合は、孤立したブランチ (親コミットのないコミットを持つブランチ) を作成できます。
$ git checkout --orphan NAME
これにより、現在のツリーが事前設定された新しいブランチが作成されます。次に、不要なディレクトリを削除することを選択できますgit rm -rf <path>
。または、 ですべてを完全に削除しますgit rm -rf .
。
ただし、これを行うことにはいくつかの結果があります。互いに切断されたブランチをマージすると、多くの競合が発生する可能性があります。Git は、一部のデータがどのようにそこに到達したか、およびデータをスマートにマージする方法を知らないためです。一方、それらをマージするつもりがない場合 ( gh-pages
GitHub のブランチなど)、そのままにしておくことはまったく問題ありません。
ただし、ここでさらにいくつかの提案を行います。1 つ目は、これらが完全に別々の履歴を持つ別々のブランチであることが実際に想定されている場合、おそらくそれらを別々のリポジトリに配置する必要があるということです。
また、ブランチ上にいて、たとえば、branch10
に基づいて新しいブランチを作成したい場合は、次のmaster
方法で簡単に行うことができます。
$ git checkout -b NAME master
つまり、開始点として使用するコミットまたはブランチを選択できます。
最後に、異なるブランチにディレクトリを保持する理由が明確でないため、一歩下がって、何を達成しようとしているのかを検討することをお勧めします。Git には多くの可能性がありますが、その強みに反する方法論を選択すると、ツールの使用がはるかに難しくなり、リポジトリの共有が難しくなる可能性があります。