162

このgitリポジトリに新しい「ルート」ブランチを定義したいと思います。「ルート」ブランチとは、リポジトリ1内の他のすべてのブランチから完全に独立しているブランチを意味します。

A残念ながら、リポジトリのコミットツリーの一番下にあるコミット(それを呼びましょう)でさえ、多くのファイルが含まれています(これはすでにかなり成熟したプロジェクトで初期化されたリポジトリでした)。

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

<start-point>このリポジトリに、可能な限り近い状態で完全にベアブランチを作成する方法はありますAか?


1ところで、これは新しいリポジトリを作成することと同じではありません。個別のリポジトリは、多くの理由であまり便利ではありません。


編集: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 checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)

将来的には、常に次のような新しいリポジトリを作成します。

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

...最初のコミットがになり、新しい独立したブランチを開始するために常に使用できるようにします。(これは、ごくまれに必要になる施設ですが、すぐに利用できるようにするのは非常に簡単です。)

4

4 に答える 4

259

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

git checkout --orphan YourBranchName

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

--orphanの詳細については、チェックアウトのマニュアルページを参照してください。

于 2013-02-22T22:41:09.207 に答える
18

受け入れられた回答に追加するには-クリーンな状態に戻すためのベストプラクティスは、後世のためにブランチを設定するときに簡単にリベースできるように、最初の空のコミットを作成することです。さらに、クリーンな状態が必要なため、コミットしてはいけないファイルをコミットしている可能性があります。そのため、それらをインデックスから削除する必要があります。それらを念頭に置いて、次のことを行う必要があります。

$ 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
于 2017-10-24T16:57:20.997 に答える
6

このリポジトリに完全に裸のブランチを作成する方法はありますか?

(Git 2.28+で)使用する実際のコマンドは次のとおりです。

git switch --discard-changes --orphan newBranch
# or
git switch -f --orphan newBranch

git switchGit 2.23(2019年8月)から利用可能であり、古い紛らわしいgit checkoutコマンドを置き換えます。

ただし、Git 2.28(2020年第3四半期)git switch --discard-changes --orphanはそのバージョンで最適化されているため、お勧めします。

ブライアンmによるコミット8d3e33dコミット8186128(2020年5月21日)を参照してください。カールソン(bk2204( Junio C Hamano
によってマージされました---コミットded44af、2020年6月9日gitster

builtin/checkout:メタデータの初期化を簡素化

サインオフ-作成者:brianm。カールソンレビュー-投稿者:Derrick Stolee

呼び出すときはinit_checkout_metadatareset_tree,問題のコミットのオブジェクトIDを渡して、フィルターに渡すことができるようにします。コミットがない場合は、ツリーに渡します。

この後者のケースは、チェックアウトコードの他の場所で発生する可能性があると予想していましたが、ここでは発生しません。

コミットオブジェクトがない唯一のケースは、で呼び出す場合git switchです--orphan

--forceさらに、またはのいずれかを追加してコミットオブジェクトを使用せずに、このコードパスをヒットすることしかできません--discard-changes

このような場合、コミットまたはツリーを使用してチェックアウトメタデータを初期化しても意味がありません。

  • (a)コミットはなく、空のツリーのみであり、
  • (b)ファイルのないブランチをチェックアウトするときにファイルが汚れることがないため、データを使用することはありません。

この場合、有効なポインタである値が必要なだけなので、すべてゼロのオブジェクトIDを渡します。

テスト:

git switch master
echo foo >foo.txt
git switch --discard-changes --orphan new-orphan2
git ls-files >tracked-files
# test_must_be_empty tracked-files
于 2020-06-13T15:42:18.903 に答える
4

git 2.23以降を使用している場合はgit switchgit restoreの代わりに慣れている可能性がありgit checkoutます。その場合、フラグはこの回答で言及されているものと同じです。

git switch --orphan YourBranchHere
于 2020-03-23T20:37:01.433 に答える