2013-02-22 13 views
93

このgitリポジトリに新しい "root"ブランチを定義したいと思います。 "ルート"ブランチとは、リポジトリ内の他のすべてのブランチから完全に独立しているブランチを意味します。。新しい(そして空の!) "ルート"ブランチを作成するには?

残念ながら、リポジトリのコミットツリーの根底にあるコミット(これにはAと呼ぶこともあります)にも、かなり成熟したプロジェクトで初期化されたリポジトリがたくさんあります。

これは、新しいブランチの<start-point>としてAを付与したとしても、この新しいブランチは「クリーンスレート」から開始するのではなく、Aでコミットされたすべてのファイルを含むことを意味します。

このレポジトリに完全にベアブランチを作成する方法はありますか?<start-point>はできるだけAに近いものにしますか?


ところで、これは新しいリポジトリを作成することと同じではないです。分離したリポジトリは、多くの理由からあまり便利ではありません。


EDIT:OK、これはvcsjonesに基づいて、私がやったことです」と答えた:

# save rev of the current earliest commit 
OLDBASE=$(git rev-list --max-parents=0 HEAD) 

# create a new orphan branch and switch to it 
git checkout --orphan newbranch 
# make sure it's empty 
git rm -rf . 

# create a new empty commit in the new branch, and 
# save its rev in NEWBASE 
git commit --allow-empty -m 'base commit (empty)' 
NEWBASE=$(git rev-list HEAD) 

# specify $NEWBASE as the new parent for $OLDBASE, and 
# run filter-branch on the original branch 
echo "$OLDBASE $NEWBASE" > .git/info/grafts 
git checkout master 
git filter-branch 

# NOTE: this assumes that the original repo had only one 
# branch; if not, a git-filter-branch -f <branch> command 
# need to be run for each additional branch. 

rm .git/info/grafts 

この手順は少し複雑ですが、最終結果はですベースコミットは、新しい "クリーンスレートブランチ"に対して<start-point>として機能します。常に最初でコミットするように...

git init 
git commit --allow-empty -m 'base commit (empty)' 

を、そして:私は、行う必要があるだろう、すべては

git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD) 

将来的には私はいつもこのように新しいリポジトリを作成しますです新しい独立したブランチを開始するために利用できます。 (これは、私が知っている、非常にほとんど必要ありません施設だろうが、それは容易に利用できるようにすることは非常に簡単です)

+0

重複http://stackoverflow.com/questions/13969050/how-to-create-a-new-empty-branch-for-a-new-project – Anonymoose

+1

@:あなたがすべき念頭に置いたものとAnonymoose:(議論ではなく)記録のためだけに:私はあなたの意見に同意します。 – kjo

+1

'git rebase --onto'に基づくもっと簡単な解決策があるようです。http://stackoverflow.com/questions/645450/insert-a-commit-before-the-root-commit-in-git –

答えて

151

ブランチを作成する際に--orphanを使用します。

git checkout --orphan YourBranchName 

を。これは、新規に作成されますブランチはゼロでコミットされますが、すべてのファイルがステージングされます。その時点でそれらを削除することができます。
(「それらを削除」:git reset --hardは、空の作業ツリーであなたを残して、インデックスを空にします)

は--orphanの詳細については、チェックアウトのためのman pageを見てみましょう。

+0

これは基本的に空白のスレートを作成しますか?のように、ゼロから?それとも、以前の変更をすべて保持しますが、gitの履歴には含まれていませんか? –

+1

@ConAntonakosこれは親なしで新しいブランチを作成します。他のブランチは影響を受けず、すべての変更が保持されます。 – fuz

1

クリーン状態に戻すにはbest practiceを追加するとan initial empty commitが作成されますので、後で分枝を設定する際に簡単に再構築できます。また、クリーンな状態が必要なので、おそらくコミットしてはいけないファイルがあるので、インデックスから削除する必要があります。

$ git checkout --orphan dev2 
Switched to a new branch 'dev2' 
$ git reset # unstage all the files, you probably don't want to commit all of them 
$ git commit --allow-empty -m 'Initial empty commit' 
[dev2 (root-commit) a515c28] Initial empty commit 
関連する問題