今日、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
これは計画どおりに機能したようです。しかし、控えめに言っても、これは明らかに Git を使い始めたばかりの人にお勧めできる手順ではありません。リポジトリでこれまでに発生したすべてのこととはまったく関係のない新しいブランチを作成するより簡単な方法はありますか?
ベストアンサー1
このタスクを他の回答よりも少し高度なものにする新しい機能 (V1.7.2 以降) があります。
git checkout
この--orphan
オプションがサポートされるようになりました。マニュアルページ:
git checkout [-q] [-f] [-m] --orphan <new_branch> [<start_point>]
<start_point> から始まる <new_branch> という名前の新しい孤立ブランチを作成し、それに切り替えます。この新しいブランチで行われた最初のコミットには親がなく、他のすべてのブランチやコミットから完全に切り離された新しい履歴のルートになります。
これは質問者が望んでいたこととまったく同じではありません。なぜなら、インデックスと作業ツリーにデータを入力するからです<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なので指定しませんでしたが、いずれにしても気にする必要はありません。このシーケンスは基本的に、アルテムの答えただし、恐ろしい配管コマンドに頼る必要はありません。