web-dev-qa-db-ja.com

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

今日の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を使い始めたばかりの人にお勧めする種類の手順ではありません。 これまでにリポジトリで発生したこととはまったく関係のない新しいブランチを作成する簡単な方法はありますか?

314
hillu

(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の答え のコマンドシーケンスと同じことを行います。

482
tcovo

Git Community Book から:

git symbolic-ref HEAD refs/heads/newbranch 
rm .git/index 
git clean -fdx 
<do work> 
git add your files 
git commit -m 'Initial commit'
31

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を削除できます

22
Jakub Narębski

Github には Project Pages という機能があります。この機能では、プロジェクトに特定の名前付きブランチを作成して、Githubが提供するファイルを提供できます。手順は次のとおりです。

$ cd /path/to/fancypants
$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx

そこには空のリポジトリがあり、そこに新しいコンテンツを追加できます。

13
Greg Hewgill

現在選択されている答えは正しいです、私は偶然にそれを追加するだけです...

これは実際、github.comがgh-pagesと呼ばれる孤立したブランチを通じて、ユーザーがリポジトリ用のGithubページを作成できるようにする方法です。ここでは、きれいな手順を示して説明します。

https://help.github.com/articles/creating-project-pages-manually

基本的に、これを設定するgitコマンドは次のとおりです。

  1. git checkout --Orphan gh-pages(レポにgh-pagesと呼ばれる親のないブランチを作成します)
  2. git rm -rf .(ブランチの作業ツリーからファイルを削除します)
  3. rm '.gitignore'(gitignoreも)
  4. 次に、Webサイトのコンテンツを追加し(index.htmlなどを追加)、コミットしてプッシュします。
  5. 利益。

/ docsフォルダーを指定 リポジトリーで、GithubがWebサイトの構築に使用する「プロジェクトサイト」のソースになることもできます。

お役に立てれば!

10
unknownprotocol

プロジェクトに空のブランチをすぐに作成して作業を開始したい場合は、次のコマンドを実行します:

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"
3
Sing

既存のコンテンツが既にコミットされている場合、「git rebase -i --root」の実装がシーケンサーマシンをさらに使用するように更新されているため、今(Git 2.18 Q2 2018)独自の新しい孤立ブランチにコンテンツを抽出できます。

そのシーケンサーは、現在のシーケンサーです コミットグラフのトポロジ全体を他の場所に移植できます

commit 8fa6eeacommit 9c85a1ccommit ebddf39commit 21d0764commit d87d48b を参照してください、 commit ba97aea (2018年5月3日)by Johannes Schindelin(dscho .
(2018年5月30日 commit c5aa4bcC浜野順夫-gitster- に合併)

シーケンサー:新しいルートコミットの導入を許可

既存のブランチトポロジを自由に変更できるように特別に設計された新しい--rebase-mergesモードのコンテキストでは、ユーザーは、開始する完全に新しいブランチにコミットを抽出することができます新しく作成されたルートコミット.

これは、ルートコミットになりたいコミットのpickingの前にコマンド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コマンドの他の使用と競合しません。参照名では、開き括弧とスペースの両方が不正です。

1
VonC

このスクリプトは 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
0
Benoît