Pomagając dziś znajomemu z problemem git, musiałem wprowadzić gałąź, która musiała być całkowicie oddzielona od master
gałęzi. Zawartość tej gałęzi naprawdę miała inne pochodzenie niż to, co zostało opracowane na master
gałęzi, ale później zostaną połączone z master
gałęzią.
Przypomniałem sobie, jak czytałem Git Johna Wiegleya od podstaw, w jaki sposób gałęzie są w zasadzie etykietą zatwierdzenia zgodnego z pewną konwencją oraz tego, jak zatwierdzenie jest powiązane z drzewem plików i, opcjonalnie, zatwierdzeniem rodzica. Poszliśmy stworzyć bez-rodzicielskie zatwierdzenie do istniejącego repozytorium przy użyciu instalacji hydraulicznej git:
Więc pozbyliśmy się wszystkich plików w indeksie ...
$ git rm -rf .
... wyodrębniłem katalogi i pliki z tarballa, dodałem je do indeksu ...
$ git add .
... i utworzył obiekt drzewa ...
$ git write-tree
( git-write-tree
powiedział nam sha1sum utworzonego obiektu drzewa).
Następnie popełniliśmy drzewo, nie określając zobowiązań rodziców ...
$ echo "Imported project foo" | git commit-tree $TREE
( git-commit-tree
powiedział nam sha1sum utworzonego obiektu zatwierdzenia).
... i utworzył nowy oddział, który wskazuje na nasze nowo utworzone zatwierdzenie.
$ git update-ref refs/heads/other-branch $COMMIT
W końcu wróciliśmy do master
oddziału, aby kontynuować tam pracę.
$ git checkout -f master
Wydaje się, że zadziałało to zgodnie z planem. Ale najwyraźniej nie jest to procedura, którą poleciłbym komuś, kto dopiero zaczyna używać git, delikatnie mówiąc. Czy istnieje łatwiejszy sposób na utworzenie nowej gałęzi, która jest całkowicie niezwiązana ze wszystkim, co do tej pory wydarzyło się w repozytorium?
( git checkout master && git merge --no-commit "orphan-branch" )
Niektóre podobne sztuczki będą działać przy użyciu git-reset lub zabawy z indeksem. Ale to zależy od pożądanego przepływu pracy.--no-commit
zgit merge
spowoduje osiągnięcie tego. Być może konieczne będzie kontynuowaniegit reset origin/master
operacji, aby następne zatwierdzenie poszło tam, gdzie chcesz, ale wtedy pliki z Twojej gałęzi sierocej pojawią się jako „pliki bez śledzenia”, chyba że umieścisz je również w pliku .gitignore.Z Git Community Book :
źródło
rm .git/index
jest brzydka :-)Chociaż rozwiązanie z
git symbolic-ref
indeksem i usuwaniem indeksu działa, może być koncepcyjnie czystsze tworzenie nowego repozytoriumnastępnie pobierz z niego
Teraz możesz usunąć / path / to / nonrelated
źródło
git branch
lubgit checkout
. Cieszę się, że git umożliwia takie rzeczy, ale dlaczego nie powinno być łatwiejsze?git branch
i przełączać się między nimigit checkout BRANCH_NAME
.Github ma funkcję o nazwie Strony projektu, w której możesz utworzyć konkretną nazwaną gałąź w swoim projekcie, aby zapewnić pliki, które będą obsługiwane przez Github. Ich instrukcje są następujące:
Stamtąd masz puste repozytorium, do którego możesz następnie dodać nową zawartość.
źródło
Aktualnie wybrana odpowiedź jest poprawna, dodam tylko, że przypadkowo ...
Dokładnie w ten sposób github.com pozwala użytkownikom tworzyć strony Github dla swoich repozytoriów przez osieroconą gałąź o nazwie
gh-pages
. Ładne kroki podano i wyjaśniono tutaj:https://help.github.com/articles/creating-project-pages-manually
Zasadniczo polecenia git do skonfigurowania tego są następujące:
git checkout --orphan gh-pages
(utwórz gałąź repozytorium o nazwie gh-pages na swoim repozytorium)git rm -rf .
(usuwa wszystkie pliki z drzewa roboczego gałęzi)rm '.gitignore'
(nawet gitignore)Uwaga: możesz także wyznaczyć folder / docs w repozytorium, który będzie źródłem „witryny projektu”, której Github używa do budowy witryny.
Mam nadzieję że to pomoże!
źródło
Czasami chcę po prostu natychmiast utworzyć pustą gałąź w projekcie, a następnie rozpocząć pracę, po prostu wykreślę następujące polecenie:
źródło
Jeśli twoja istniejąca treść została już zatwierdzona, możesz (Git 2.18 Q2 2018) wyodrębnić ją do własnej nowej gałęzi sierocych, ponieważ implementacja „
git rebase -i --root
” została zaktualizowana w celu większego wykorzystania maszyn sekwencera.Ten sekwencer umożliwia teraz przeszczepienie całej topologii grafu zatwierdzeń w innym miejscu .
Zobacz zatwierdzenie 8fa6eea , zatwierdzenie 9c85a1c , zatwierdzenie ebddf39 , zatwierdzenie 21d0764 , zatwierdzenie d87d48b , zatwierdzenie ba97aea (03 maja 2018 r.) Autor: Johannes Schindelin (
dscho
) .(Połączone przez Junio C Hamano -
gitster
- w commit c5aa4bc , 30 maja 2018 r.)źródło
Znalazłem ten skrypt na http://wingolog.org/archives/2008/10/14/merging-in-unrelated-git-branches i działa bardzo dobrze!
źródło
git fetch $REMOTE $REMOTE_BRANCH:$LOCAL_BRANCH
. Czy coś brakuje?