0

私は私の手に奇妙な状況を持っています。git_test という名前の git リポジトリがあるとします。3 つのブランチがあります。

  1. 主人
  2. 支店1
  3. ブランチ2

2 つのフォルダー (dir1、dir2) と README ファイルがあります。

現在、master ブランチには README ファイルのみが含まれています。branch1 には dir1 があります。しかし、branch2 を作成してチェックアウトすると、dir1 と dir2 の両方がありました。(この時点でブランチをリモートリポジトリにプッシュしていました)

私の質問には2つの部分があります。

  1. branch2 から dir1 を削除するにはどうすればよいですか? (つまり、branchN にはリポジトリ内の他のディレクトリではなく、dirN のみが必要です)

  2. 将来、ブランチの作成時にこれを回避する方法はありますか? (その特定のブランチに含めたいディレクターを選択しますか?

ティア

4

2 に答える 2

0

両方のブランチが と履歴を共有しておりmaster、ここでのあなたの間違いは を使用しgit checkout -b branch2ている間 に行ったものであると想定していますbranch1。そうでない場合は、別の方法で修正する必要があります。

したがって、 と の両方がbranch1branch2履歴を共有していることを考えると、次のようにして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-pagesGitHub のブランチなど)、そのままにしておくことはまったく問題ありません。

ただし、ここでさらにいくつかの提案を行います。1 つ目は、これらが完全に別々の履歴を持つ別々のブランチであることが実際に想定されている場合、おそらくそれらを別々のリポジトリに配置する必要があるということです。

また、ブランチ上にいて、たとえば、branch10に基づいて新しいブランチを作成したい場合は、次のmaster方法で簡単に行うことができます。

$ git checkout -b NAME master

つまり、開始点として使用するコミットまたはブランチを選択できます。

最後に、異なるブランチにディレクトリを保持する理由が明確でないため、一歩下がって、何を達成しようとしているのかを検討することをお勧めします。Git には多くの可能性がありますが、その強みに反する方法論を選択すると、ツールの使用がはるかに難しくなり、リポジトリの共有が難しくなる可能性があります。

于 2013-09-29T13:55:16.887 に答える