В 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