Tworzenie nowej pustej gałęzi dla nowego projektu

351

Używamy repozytorium git do przechowywania naszego projektu. Nasze oddziały odbiegają od pierwotnego. Ale teraz chcemy stworzyć mały nowy projekt do śledzenia dokumentacji. W tym celu chcielibyśmy utworzyć nową pustą gałąź, aby rozpocząć przechowywanie naszych plików, i chciałbym, aby inni użytkownicy sieci sklonowali tę gałąź.

Jak możemy to zrobić?

Próbowałem pewnych rzeczy, ale one nie działały.

$ 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

Wydaje się, że wypycha gałąź w porządku, ale kiedy wykonuję pobieranie lub pobieranie, pobiera informacje z innych gałęzi, a następnie otrzymuję dodatkowe pliki z innych projektów. Jakie jest najlepsze rozwiązanie?

fazineroso
źródło
11
Dlaczego musisz przechowywać to w oddziale? Gałęzie są zwykle dla niektórych odchyleń od tej samej podstawy kodu. Być może założenie nowego repozytorium byłoby lepszym rozwiązaniem.
Benjamin Bannier,
2
Cóż, zrobiliśmy to wcześniej, IIRC, i chciałbym to zrobić jeszcze raz, więc jestem ciekawy;)
fazineroso 20.12
3
„dla nowego projektu” - jako @honk sugerowałbym umieszczenie tego w nowym repozytorium. Dwie opcje stamtąd je zintegrować. Zrób to submodulew oryginalnym projekcie, np. docs/Wskazując na inne repozytorium. Lub, jeśli chcesz scalić kod później, dodaj go jako zdalny.
gertvdijk
1
Dodatkowym minusem sierocego podejścia jest to, że musisz zachować swoje .gitignorepliki, a także stale przełączać się między dwoma katalogami głównymi (gałęziami). Więc jestem także za nowym podejściem do repo, w nowym folderze, z tymi samymi pilotami i pchaniem do innej gałęzi.
simo

Odpowiedzi:

666

Możesz stworzyć oddział jako sierota:

git checkout --orphan <branchname>

Spowoduje to utworzenie nowego oddziału bez rodziców. Następnie możesz wyczyścić katalog roboczy za pomocą:

git rm --cached -r .

i dodaj pliki dokumentacji, zatwierdź je i wypchnij do github.

Ciągnięcie lub pobieranie zawsze aktualizuje lokalne informacje o wszystkich zdalnych oddziałach. Jeśli chcesz tylko pobrać / pobrać informacje dla jednego zdalnego oddziału, musisz je podać.

Ognisty Nomus
źródło
18
Dobra odpowiedź, ale to trochę denerwujące, że nowa gałąź zaczyna się od zainscenizowania wszystkich plików (z poprzedniej gałęzi).
Matt Fenwick
12
Przy wydawaniu git checkout --orphan <branch>; Nie widzę żadnej pozycji <granch> w git branch.
Santosh Kumar,
51
Po git checkout --orphanmożna użyć git reset --harddo usunięcia pozostałych plików.
Ilya Kozhevnikov
16
Powodem, dla którego nie widzisz gałęzi po, git checkout --orphan <branch>jest to, że nie ma jeszcze żadnych zatwierdzeń. Po pierwszym zatwierdzeniu git branchdrukuje nową gałąź.
Krøllebølle,
13
git clean -fd usuwa nieśledzone pliki.
stefgosselin
71

Prawidłowa odpowiedź to utworzenie gałęzi osieroconej. Wyjaśniam szczegółowo, jak to zrobić na moim blogu. (Zarchiwizowany link)

...

Przed rozpoczęciem uaktualnij do najnowszej wersji GIT. Aby upewnić się, że korzystasz z najnowszej wersji, uruchom

which git

Jeśli wypluje starą wersję, może być konieczne rozszerzenie PATH o folder zawierający właśnie zainstalowaną wersję.

Ok, jesteśmy gotowi. Po zrobieniu płyty CD w folderze zawierającym kasę git utwórz gałąź osieroconą. W tym przykładzie nadam nazwę gałęzi „mybranch”.

git checkout --orphan mybranch

Usuń wszystko z sierocej gałęzi

git rm -rf .

Wprowadź zmiany

vi README.txt

Dodaj i zatwierdź zmiany

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

Otóż ​​to. Jeśli uciekniesz

git log

zauważysz, że historia zatwierdzeń zaczyna się od zera. Aby wrócić do głównej gałęzi, po prostu uruchom

git checkout master

Możesz powrócić do oddziału osieroconego, uruchamiając

git checkout mybranch
Sid Jain
źródło
16
Odpowiedzi tylko z linkiem nie są zachęcane. Jeśli link zostanie przeniesiony lub usunięty, twoja odpowiedź stanie się bezwartościowa. Zastanów się nad dodaniem zasadniczych części bezpośrednio do tej odpowiedzi. Zwróć szczególną uwagę na kwestie nieobjęte wcześniejszymi odpowiedziami.
bytebuster
3
Link nie jest już niestety ważny.
Alexey,
1
Archiwa to cudowna rzecz.
lucid_dreamer
3
NIEBEZPIECZNE jest po prostu usunięcie wszystkiego z katalogu roboczego, ponieważ każdy nietrywialny projekt będzie miał nieśledzone pliki (konfiguracja, środowisko, pamięć podręczna itp.).
Slava Fomin II
12

Utwórz pustą nową gałąź w ten sposób:

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

Jeśli twoje pliki proj-doc są już w zatwierdzeniu w jednym podkatalogu, możesz utworzyć nowy oddział w ten sposób:

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

co może być wygodniejsze niż git branch --orphangdyby miało to zostawiają cię z partii git rmi git mving zrobić.

Próbować

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

i sprawdź, czy to pomoże w rozwiązaniu zbyt dużego problemu z pobieraniem. Również jeśli naprawdę chcesz pobrać tylko jedną gałąź, najbezpieczniej jest po prostu podać ją w wierszu poleceń.

jthill
źródło
1
Ta odpowiedź jest interesująca, ponieważ pozwala na uruchomienie innej gałęzi / katalogu głównego z całkowicie pustym pierwszym zatwierdzeniem.
Stéphane Gourichon
Innym sposobem, aby pusty oddział, jeśli nie masz nic przeciwko włączeniu do niej jestgit checkout --orphan new-branch; git reset --hard
jthill
Jaki jest pożytek z xargs?
Flux
@Flux to po prostu inny sposób na umieszczenie identyfikatora drzewa jako argumentu drzewa zatwierdzającego.
jthill
Naprawdę podoba mi się to podejście, ponieważ pozwala na utworzenie pustej nowej gałęzi bez opuszczania bieżącej gałęzi, a ponadto faktem jest, że punktem wyjścia jest puste zatwierdzenie.
Brice
8

Jeśli twoja wersja git nie ma opcji --orphan, należy użyć tej metody:

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

Po wykonaniu pracy:

git add -A
git commit -m <message>
git push origin <newbranch>
cyb0k
źródło
2
Uważaj, git cleanmożesz usunąć pliki, których nie chcesz usuwać! Uruchom git clean -ndxnajpierw, aby zobaczyć, jakie pliki zostaną usunięte, zanim uruchomisz go naprawdę z -fopcją.
Lassi
7

Załóżmy, że masz masteroddział z plikami / katalogami:

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

Krok po kroku, jak zrobić pustą gałąź:

  1. git checkout —orphan new_branch_name
  2. Upewnij się, że jesteś we właściwym katalogu przed wykonaniem następującego polecenia:
    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

W kroku 2 po prostu usuwamy wszystkie pliki lokalnie, aby uniknąć pomyłek z plikami w nowym oddziale i tymi, które trzymasz w masteroddziale. Następnie odłączamy wszystkie te pliki w kroku 3. Wreszcie, krok 4 i później pracujemy z naszą nową pustą gałęzią.

Po zakończeniu możesz łatwo przełączać się między oddziałami:

git checkout master 
git checkout new_branch
użytkownik1723157
źródło
1

Na podstawie tej odpowiedzi Hiery Nomus .

Możesz stworzyć oddział jako sierota:

git checkout --orphan <branchname>

Spowoduje to utworzenie nowego oddziału bez rodziców. Następnie możesz wyczyścić katalog roboczy za pomocą:

git rm --cached -r .

A potem po prostu zatwierdzasz gałąź z pustym zatwierdzeniem, a następnie wypychasz

git commit -m <commit message> --allow-empty
git push origin <newbranch>
Liniowiec
źródło
1

Sprawdź tę dokumentację , ma jasne szczegóły na temat

--orphan <new_branch>
Utwórz nową gałąź osieroconą, nazwaną <new_branch>, uruchomioną <start_point>i przełącz na nią. Pierwsze zatwierdzenie dokonane w tej nowej gałęzi nie będzie miało rodziców i będzie źródłem nowej historii całkowicie odłączonej od wszystkich innych gałęzi i zobowiązań.

Indeks i drzewo robocze są dostosowywane tak, jakbyś wcześniej uruchomił git checkout. Pozwala to na rozpoczęcie nowej historii, która rejestruje zestaw ścieżek podobnych do łatwego uruchomienia polecenia git commit -a w celu zatwierdzenia przez root.

Kamal Hossain
źródło
1
Link do rozwiązania jest mile widziany, ale upewnij się, że Twoja odpowiedź jest przydatna bez niego: dodaj kontekst wokół linku, aby inni użytkownicy mieli pojęcie, co to jest i dlaczego tam jest, a następnie zacytuj najbardziej odpowiednią część strony, którą „ ponowne linkowanie na wypadek, gdyby strona docelowa była niedostępna. Odpowiedzi, które są niewiele więcej niż link, mogą zostać usunięte.
Yunnosch
1

znalazłem tę pomoc:

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"
齐 化 恒
źródło