今日のgit問題で友人を助けている間、私はmaster
ブランチから完全に分離する必要があるブランチを導入しなければなりませんでした。このブランチの内容は、実際にmaster
ブランチで開発されたものとは異なるOriginを持ちましたが、後でmaster
ブランチにマージされる予定でした。
John Wiegleyの Git from the bottom up を読んだことを思い出しました。ブランチは基本的に、特定の規則に従うコミットへのラベルであり、コミットがファイルのツリーおよびオプションで親コミットに結び付けられている方法です。 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を使い始めたばかりの人にお勧めする種類の手順ではありません。 これまでにリポジトリで発生したこととはまったく関係のない新しいブランチを作成する簡単な方法はありますか?
(V1.7.2以降の)新しい機能があり、これにより、このタスクは他のどの回答よりも少し高レベルになります。
git checkout
が--Orphan
オプションをサポートするようになりました。 manページ から:
git checkout [-q] [-f] [-m] --Orphan <new_branch> [<start_point>]
<start_point>から開始された<new_branch>という名前の新しいOrphanブランチを作成し、それに切り替えます。この新しいブランチで行われた最初のコミットには親がなく、他のすべてのブランチとコミットから完全に切り離された新しい履歴のルートになります。
これは、(これがチェックアウトコマンドであるため)インデックスと作業ツリーに<start_point>
を取り込むため、askerが望んだことを正確には行いません。必要な他のアクションは、作業ツリーとインデックスから不要なアイテムを削除することだけです。残念ながら、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の答え のコマンドシーケンスと同じことを行います。
git symbolic-ref HEAD refs/heads/newbranch
rm .git/index
git clean -fdx
<do work>
git add your files
git commit -m 'Initial commit'
git symbolic-ref
とインデックスの削除を使用したソリューションは機能しますが、newリポジトリを作成することは概念的にクリーナーかもしれません
$ cd /path/to/unrelated
$ git init
[edit and add files]
$ git add .
$ git commit -m "Initial commit of unrelated"
[master (root-commit) 2a665f6] Initial commit of unrelated
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 foo
それからフェッチ
$ cd /path/to/repo
$ git fetch /path/to/unrelated master:unrelated-branch
warning: no common commits
remote: Counting objects: 3, done.
Unpacking objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
From /path/to/unrelated
* [new branch] master -> unrelated-branch
これで/ path/to/unrelatedを削除できます
Github には Project Pages という機能があります。この機能では、プロジェクトに特定の名前付きブランチを作成して、Githubが提供するファイルを提供できます。手順は次のとおりです。
$ cd /path/to/fancypants
$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx
そこには空のリポジトリがあり、そこに新しいコンテンツを追加できます。
現在選択されている答えは正しいです、私は偶然にそれを追加するだけです...
これは実際、github.comがgh-pages
と呼ばれる孤立したブランチを通じて、ユーザーがリポジトリ用のGithubページを作成できるようにする方法です。ここでは、きれいな手順を示して説明します。
https://help.github.com/articles/creating-project-pages-manually
基本的に、これを設定するgitコマンドは次のとおりです。
git checkout --Orphan gh-pages
(レポにgh-pagesと呼ばれる親のないブランチを作成します)git rm -rf .
(ブランチの作業ツリーからファイルを削除します)rm '.gitignore'
(gitignoreも)/ docsフォルダーを指定 リポジトリーで、GithubがWebサイトの構築に使用する「プロジェクトサイト」のソースになることもできます。
お役に立てれば!
プロジェクトに空のブランチをすぐに作成して作業を開始したい場合は、次のコマンドを実行します:
git checkout --Orphan unrelated.branch.name
git rm --cached -r .
echo "init unrelated branch" > README.md
git add README.md
git commit -m "init unrelated branch"
既存のコンテンツが既にコミットされている場合、「git rebase -i --root
」の実装がシーケンサーマシンをさらに使用するように更新されているため、今(Git 2.18 Q2 2018)独自の新しい孤立ブランチにコンテンツを抽出できます。
そのシーケンサーは、現在のシーケンサーです コミットグラフのトポロジ全体を他の場所に移植できます 。
commit 8fa6eea 、 commit 9c85a1c 、 commit ebddf39 、 commit 21d0764 、 commit d87d48b を参照してください、 commit ba97aea (2018年5月3日)by Johannes Schindelin(dscho
) .
(2018年5月30日 commit c5aa4bc で C浜野順夫-gitster
- に合併)
シーケンサー:新しいルートコミットの導入を許可
既存のブランチトポロジを自由に変更できるように特別に設計された新しい
--rebase-merges
モードのコンテキストでは、ユーザーは、開始する完全に新しいブランチにコミットを抽出することができます新しく作成されたルートコミット.これは、ルートコミットになりたいコミットの
pick
ingの前にコマンドreset [new root]
を挿入することで可能になりました。例:
reset [new root]
pick 012345 a commit that is about to become a root commit
pick 234567 this commit will have the previous one as parent
[new root]
は有効な参照名(の一部)ではないため、これはreset
コマンドの他の使用と競合しません。参照名では、開き括弧とスペースの両方が不正です。
このスクリプトは http://wingolog.org/archives/2008/10/14/merging-in-unrelated-git-branches にあり、非常にうまく機能しています!
#!/bin/bash
set -e
if test -z "$2" -o -n "$3"; then
echo "usage: $0 REPO BRANCHNAME" >&2
exit 1
fi
repo=$1
branch=$2
git fetch "$repo" "$branch"
head=$(git rev-parse HEAD)
fetched=$(git rev-parse FETCH_HEAD)
headref=$(git rev-parse --symbolic-full-name HEAD)
git checkout $fetched .
tree=$(git write-tree)
newhead=$(echo "merged in branch '$branch' from $repo" | git commit-tree $tree -p $head -p $fetched)
git update-ref $headref $newhead $head
git reset --hard $headref