Создание новой пустой ветки для нового проекта


351

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

Как мы можем сделать это?

Я пробовал некоторые вещи, но они не работали.

$ mkdir proj_doc; cd proj_doc
$ git init
$ git add .
$ git commit -m 'first commit'
$ git br proj_doc
$ git co proj_doc
$ git br -d master
$ git push origin proj_doc

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


11
Зачем вам хранить это в ветке? Ветви, как правило, имеют некоторые отклонения от одной и той же кодовой базы. Может быть, просто запуск нового хранилища будет лучшим решением.
Бенджамин Банье

2
Что ж, мы делали это раньше, IIRC, и я хотел бы сделать это снова, поэтому мне любопытно;)
fazineroso

3
«для нового проекта» - как @honk, я бы предложил поместить это в новый репозиторий. Оттуда есть два варианта их интеграции. Сделайте это submoduleв оригинальном проекте, например, docs/указав на этот другой репо. Или, если вы хотите объединить код позже, добавьте его как удаленный.
gertvdijk

1
Еще один недостаток сиротского подхода заключается в том, что вам нужно сохранять свои .gitignoreфайлы, а также постоянно переключаться между двумя корнями (ветвями). Так что я также за новый подход к репо, в новой папке, с теми же пультами и перемещением в другую ветку.
Симо

Ответы:


666

Вы можете создать ветку как сирота:

git checkout --orphan <branchname>

Это создаст новую ветку без родителей. Затем вы можете очистить рабочий каталог с помощью:

git rm --cached -r .

и добавьте файлы документации, зафиксируйте их и отправьте в github.

Функция извлечения или извлечения всегда обновляет локальную информацию обо всех удаленных ветвях. Если вы хотите получить / извлечь информацию только для одной удаленной ветви, вам нужно указать ее.


18
Хороший ответ, но немного раздражает, что новая ветка начинается со всех файлов (из предыдущей ветки).
Мэтт Фенвик

12
При выдаче git checkout --orphan <branch>; Я не вижу в списке <branch> в git branch.
Сантош Кумар

51
После git checkout --orphanможно использовать git reset --hardдля удаления оставшихся файлов.
Илья Кожевников

16
Причина, по которой вы не видите ветку после, git checkout --orphan <branch>заключается в том, что у нее еще нет коммитов. После первого коммита git branchпечатается новая ветка.
Krøllebølle

13
git clean -fd удаляет неотслеживаемые файлы.
stefgosselin

71

Правильный ответ - создать сиротскую ветвь. Я объясняю, как это сделать, подробно в моем блоге. (Архивная ссылка)

...

Перед запуском обновите GIT до последней версии. Чтобы убедиться, что вы используете последнюю версию, запустите

which git

Если он выдает старую версию, вам может потребоваться увеличить PATH с помощью папки, содержащей версию, которую вы только что установили.

Хорошо мы готовы После того, как вы сделали компакт-диск в папку, содержащую ваш git checkout, создайте потерянную ветку. Для этого примера я назову ветку «mybranch».

git checkout --orphan mybranch

Удалить все в сиротской ветке

git rm -rf .

Внести некоторые изменения

vi README.txt

Добавить и зафиксировать изменения

git add README.txt
git commit -m "Adding readme file"

Вот и все. Если вы бежите

git log

вы заметите, что история коммитов начинается с нуля. Чтобы вернуться к вашей основной ветке, просто запустите

git checkout master

Вы можете вернуться в сиротскую ветку, запустив

git checkout mybranch

16
Ответы только на ссылки не приветствуются. Если ссылка перемещена или удалена, ваш ответ становится бесполезным. Подумайте о добавлении важных частей прямо в этот самый ответ. Обратите особое внимание на вопросы, не охваченные предыдущими ответами.
Bytebuster

3
Ссылка больше не действительна, к сожалению.
Алексей

1
Архивы замечательная вещь.
lucid_dreamer

3
ОПАСНО просто удалять все в рабочем каталоге, потому что у любого нетривиального проекта будут неотслеживаемые файлы (конфигурация, окружение, кеш и т. Д.).
Слава Фомин II

12

Создайте пустую новую ветку вот так:

true | git mktree | xargs git commit-tree | xargs git branch proj-doc

Если ваши файлы proj-doc уже находятся в коммите в одном подкаталоге, вы можете создать новую ветку следующим образом:

git commit-tree thatcommit:path/to/dir | xargs git branch proj-doc

который может быть более удобным , чем git branch --orphanесли бы оставить вас с большим количеством git rmи git mvING делать.

Пытаться

git branch --set-upstream proj-doc origin/proj-doc

и посмотрим, поможет ли это с вашей проблемой извлечения слишком много. Также, если вы действительно хотите получить только одну ветку, лучше всего указать ее в командной строке.


1
Этот ответ интересен тем, что позволяет запустить другую ветку / корень с полностью пустым первым коммитом.
Стефан Гурихон

Еще один способ сделать пустую ветку, если вы не против, переключиться на нееgit checkout --orphan new-branch; git reset --hard
Jthill

Какая польза от xargs?
Поток

@Flux - это просто еще один способ добавить идентификатор дерева в качестве аргумента дерева коммитов.
до

Мне очень нравится этот подход, так как он позволяет создать пустую новую ветку, не покидая текущей ветви, плюс тот факт, что в качестве начальной точки есть пустой коммит.
Брайс

8

Если ваша версия git не имеет опции --orphan, этот метод следует использовать:

git symbolic-ref HEAD refs/heads/<newbranch> 
rm .git/index 
git clean -fdx 

После некоторой работы:

git add -A
git commit -m <message>
git push origin <newbranch>

2
Будьте осторожны, git cleanможете удалять файлы, которые вы не хотите удалять! git clean -ndxСначала запустите, чтобы увидеть, какие файлы будут удалены, прежде чем запускать его по-настоящему с -fопцией.
Ласси

7

Допустим, у вас есть masterветка с файлами / каталогами:

> git branch  
master
> ls -la # (files and dirs which you may keep in master)
.git
directory1
directory2
file_1
..
file_n

Шаг за шагом, как сделать пустую ветку:

  1. git checkout —orphan new_branch_name
  2. Убедитесь, что вы находитесь в правильном каталоге, прежде чем выполнять следующую команду:
    ls -la |awk '{print $9}' |grep -v git |xargs -I _ rm -rf ./_
  3. git rm -rf .
  4. touch new_file
  5. git add new_file
  6. git commit -m 'added first file in the new branch'
  7. git push origin new_branch_name

На шаге 2 мы просто удаляем все файлы локально, чтобы избежать путаницы с файлами в вашей новой ветке и теми, которые вы храните в masterветке. Затем мы отсоединяем все эти файлы в шаге 3. Наконец, шаг 4 и после работают с нашей новой пустой веткой.

Как только вы закончите, вы можете легко переключаться между ветками:

git checkout master 
git checkout new_branch

1

На основании этого ответа от Hiery Nomus .

Вы можете создать ветку как сирота:

git checkout --orphan <branchname>

Это создаст новую ветку без родителей. Затем вы можете очистить рабочий каталог с помощью:

git rm --cached -r .

И тогда вы просто фиксируете ветку с пустым коммитом и затем нажимаете

git commit -m <commit message> --allow-empty
git push origin <newbranch>

1

Проверьте эту документацию , она имеет четкую информацию о

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

Индекс и рабочее дерево настраиваются так, как если бы вы ранее запустили git checkout. Это позволяет вам начать новую историю, которая записывает набор путей, аналогичных простому запуску git commit -a для создания корневого коммита.


1
Ссылка на решение приветствуется, но, пожалуйста, убедитесь, что ваш ответ полезен без нее: добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели представление о том, что это такое и почему, а затем процитируйте наиболее релевантную часть страницы, которую вы ' Повторная ссылка на случай, если целевая страница недоступна. Ответы, которые немного больше, чем ссылка, могут быть удалены.
Yunnosch

1

я нашел эту помощь:

git checkout --orphan empty.branch.name
git rm --cached -r .
echo "init empty branch" > README.md
git add README.md
git commit -m "init empty branch"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.