В git существует ли простой способ введения в репозиторий несвязанной ветки?

Помогая другу с проблемой 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 созданного объекта commit.)

... и создал новую ветку, которая указывает на наш недавно созданный совершить.

$ git update-ref refs/heads/other-branch $COMMIT

Наконец, мы вернулись в ветвь master, чтобы продолжить работу там.

$ git checkout -f master

Кажется, что это сработало так, как планировалось. Но это явно не тот вид процедуры, которую я бы рекомендовал тому, кто только начинает используя git, мягко говоря. Есть ли более простой способ создания новая отрасль, которая полностью не связана со всем, что произошло в хранилище до сих пор?

Ответ 1

Появилась новая функция (начиная с версии V.1.7.2), которая делает эту задачу немного более высокой, чем в любом из других ответов.

git checkout теперь поддерживает параметр --orphan. На странице :

git checkout [-q] [-f] [-m] --orphan <new_branch> [<start_point>]

Создайте новую сиротскую ветвь с именем <new_branch > , начато с <start_point > и переключитесь на него. первая фиксация, сделанная на этой новой ветке не будет родителей, и это будет корень новой истории полностью отключен от всех остальных ветвей и коммитов.

Это не делает то, чего хотел ассер, потому что он заполняет индекс и рабочее дерево из <start_point> (так как это, в конце концов, команда checkout). Единственное необходимое действие - удалить любые нежелательные элементы из рабочего дерева и индекса. К сожалению, 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, и нам все равно. Эта последовательность делает практически то же самое, что и командная последовательность в Артемском ответе, просто не прибегая к страшным командам сантехники.

Ответ 2

Из 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'

Ответ 3

Несмотря на то, что решение с git symbolic-ref и удалением индекса работает, возможно, было бы концептуально более чисто создать новый репозиторий

$ 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

Ответ 4

Github имеет функцию Страницы проекта где вы можете создать конкретную именованную ветвь в своем проекте для предоставления файлов, которые будут обслуживаться Github. Их инструкции таковы:

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

Оттуда у вас есть пустой репозиторий, который вы можете добавить в свой новый контент.

Ответ 5

Текущий выбранный ответ правильный, я бы просто добавил, что случайно...

На самом деле именно так github.com позволяет пользователям создавать страницы Github для своих репозиций через сиротскую ветвь с именем gh-pages. Симпатичные шаги даны и объясняются здесь:

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

Надеюсь, это поможет!

Ответ 6

Иногда я просто хочу создать пустую ветку в проекте мгновенно, а затем начать работу, я просто вычлю следующую команду:

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"

Ответ 7

Нашел это script в 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