1. ホーム
  2. git

[解決済み] gitで、リポジトリに無関係のブランチを導入する簡単な方法はありますか?

2022-03-14 14:28:50

質問

今日、友人のgitの問題を手伝っているときに ブランチと完全に分離する必要があります。 master ブランチです。 このブランチの中身は、本当に出自が異なるものでした。 で開発されていた master ブランチとなる予定でしたが にマージされます。 master ブランチを作成しました。

ジョン・ウィグリーさんの Gitを根本から見直す アップ どのように ブランチとは、基本的にコミットに対するラベルであり、ある一定の法則に従ったものです。 コミットがどのようにファイルのツリーと結びついているか、また、オプションとして を親コミットに追加しました。に対して親レスコミットを作成しました。 既存のリポジトリに、git の配管を使用します。

そこで、インデックスにあるすべてのファイルを削除しました ...

$ git rm -rf .

... tarballからディレクトリとファイルを抽出し、それらを インデックス

$ git add .

... そして、ツリーオブジェクトを作成しました ...

$ git write-tree

( git-write-tree は、作成されたツリーオブジェクトの sha1sum を教えてくれました)。

そして、親コミットを指定せずに、ツリーをコミットしました...

$ echo "Imported project foo" | git commit-tree $TREE

( git-commit-tree は、作成されたコミットオブジェクトの sha1sum を教えてくれました)。

... そして、新しく作成した コミットです。

$ git update-ref refs/heads/other-branch $COMMIT

最後に master ブランチで作業を続けました。

$ git checkout -f master

これは予定通り動作したようです。しかし、これは明らかに というのは、これから始めようとする人に勧めたい手順です。 を使用することは、控えめに言っても、とても重要です。 を簡単に作成する方法はありますか? 新しいブランチは、これまで起こったこととはまったく関係なく を使用することができますか?

解決方法は?

新しい機能(V1.7.2以降)があり、このタスクは他のどの回答にもあるものよりも少しハイレベルなものとなっています。

git checkout がサポートされるようになりました。 --orphan オプションを使用します。から マンページ :

git checkout [-q] [-f] [-m] --orphan <new_branch> [<start_point>]

を新規に作成します。 オーファン という名前のブランチを作成しました。 から始まる。 <start_point> に切り替えてください。このとき この新しいブランチでの最初のコミット は親を持たず 新しい履歴のルート 他のすべての ブランチとコミットです。

これでは まさに からのインデックスと作業ツリーを生成するからです。 <start_point> (これは結局のところ、チェックアウトコマンドであるため)。他に必要なアクションは、作業ツリーとインデックスから不要なアイテムを削除することだけです。残念ながら git reset --hard は機能しませんが git rm -rf . を代わりに使うことができます。 rm .git/index; git clean -fdx 他の回答で紹介されています)。


要約すると

git checkout --orphan newbranch
git rm -rf .
<do work>
git add your files
git commit -m 'Initial commit'

私は <start_point> デフォルトはHEADで、どうせ気にしないので、指定しない。このシーケンスは、基本的に以下のコマンドシーケンスと同じことを行います。 Artemの回答 ただ、怖い配管コマンドに頼らずに済みます。