Erstellen eines neuen leeren Zweigs für ein neues Projekt


351

Wir verwenden ein Git-Repository, um unser Projekt zu speichern. Wir haben unsere Filialen, die von der ursprünglichen Filiale abweichen. Aber jetzt wollen wir ein kleines neues Projekt erstellen, um einige Dokumentationen zu verfolgen. Dafür möchten wir einen neuen leeren Zweig erstellen, um mit dem Speichern unserer Dateien zu beginnen, und ich möchte, dass andere Benutzer des Netzwerks diesen Zweig klonen.

Wie können wir das machen?

Ich habe einige Dinge ausprobiert, aber sie haben nicht funktioniert.

$ 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

Es scheint den Zweig in Ordnung zu bringen, aber wenn ich einen Abruf oder Pull mache, werden Informationen aus anderen Zweigen heruntergeladen, und dann erhalte ich auch einige zusätzliche Dateien aus anderen Projekten. Was ist die beste Lösung?


11
Warum müssen Sie dies in einer Filiale speichern? Verzweigungen sind normalerweise für einige Abweichungen von derselben Codebasis. Vielleicht wäre es eine bessere Lösung, nur ein neues Repository zu starten.
Benjamin Bannier

2
Nun, wir haben es schon einmal gemacht, IIRC, und ich würde es gerne noch einmal machen, also bin ich neugierig;)
fazineroso

3
"für ein neues Projekt" - Als @honk würde ich vorschlagen, dies in ein neues Repository zu stellen. Zwei Möglichkeiten von dort, um sie zu integrieren. Machen Sie es zu einem submoduleim ursprünglichen Projekt, z. B. docs/indem Sie auf dieses andere Repo zeigen. Wenn Sie den Code später zusammenführen möchten, fügen Sie ihn als Remote hinzu.
Gertvdijk

1
Ein weiterer Nachteil des Orphan- Ansatzes besteht darin, dass Sie Ihre .gitignore'd-Dateien behalten und ständig zwischen den beiden Wurzeln (Zweigen) wechseln müssen. Ich bin also auch für den neuen Repo-Ansatz, in einem neuen Ordner, mit denselben Fernbedienungen und in einem anderen Zweig.
Simo

Antworten:


666

Sie können einen Zweig als Waise erstellen:

git checkout --orphan <branchname>

Dadurch wird ein neuer Zweig ohne Eltern erstellt. Anschließend können Sie das Arbeitsverzeichnis löschen mit:

git rm --cached -r .

und fügen Sie die Dokumentationsdateien hinzu, schreiben Sie sie fest und übertragen Sie sie auf github.

Durch Ziehen oder Abrufen werden immer die lokalen Informationen zu allen Remote-Zweigen aktualisiert. Wenn Sie nur die Informationen für einen einzelnen Remote-Zweig abrufen / abrufen möchten, müssen Sie diese angeben.


18
Schöne Antwort, aber es ist ärgerlich, dass der neue Zweig mit allen Dateien (aus dem vorherigen Zweig) beginnt.
Matt Fenwick

12
Bei der Ausstellung git checkout --orphan <branch>; Ich sehe keine Auflistung von <branch> in git branch.
Santosh Kumar

51
Danach git checkout --orphankann man git reset --hardübrig gebliebene Dateien löschen.
Ilya Kozhevnikov

16
Der Grund, warum Sie den Zweig danach nicht sehen, git checkout --orphan <branch>ist, dass er noch keine Commits hat. Nach dem ersten Commit wird git branchder neue Zweig gedruckt.
Krøllebølle

13
git clean -fd entfernt nicht verfolgte Dateien.
Stefgosselin

71

Die richtige Antwort besteht darin, einen verwaisten Zweig zu erstellen. Wie das geht, erkläre ich ausführlich in meinem Blog. (Archivierter Link)

...

Aktualisieren Sie vor dem Start auf die neueste Version von GIT. Führen Sie aus, um sicherzustellen, dass Sie die neueste Version ausführen

which git

Wenn eine alte Version ausgegeben wird, müssen Sie Ihren PATH möglicherweise um den Ordner erweitern, der die gerade installierte Version enthält.

Ok, wir sind bereit. Nachdem Sie eine CD in den Ordner mit Ihrer Git-Kaufabwicklung erstellt haben, erstellen Sie einen verwaisten Zweig. In diesem Beispiel werde ich den Zweig "mybranch" nennen.

git checkout --orphan mybranch

Löschen Sie alles im Orphan-Zweig

git rm -rf .

Nehmen Sie einige Änderungen vor

vi README.txt

Fügen Sie die Änderungen hinzu und übernehmen Sie sie

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

Das ist es. Wenn du läufst

git log

Sie werden feststellen, dass der Commit-Verlauf von vorne beginnt. Um zu Ihrem Hauptzweig zurückzukehren, führen Sie einfach aus

git checkout master

Sie können durch Ausführen zum verwaisten Zweig zurückkehren

git checkout mybranch

16
Nur-Link-Antworten werden nicht empfohlen. Wenn der Link verschoben oder entfernt wird, wird Ihre Antwort wertlos. Erwägen Sie, wesentliche Teile direkt in diese Antwort einzufügen. Achten Sie besonders auf Themen, die nicht mit vorherigen Antworten behandelt wurden.
Bytebuster

3
Der Link ist leider nicht mehr gültig.
Alexey

1
Archive sind eine wunderbare Sache.
lucid_dreamer

3
Es ist GEFÄHRLICH, einfach alles im Arbeitsverzeichnis zu entfernen, da jedes nicht triviale Projekt nicht verfolgte Dateien enthält (Konfiguration, Umgebung, Cache usw.).
Slava Fomin II

12

Erstellen Sie einen leeren neuen Zweig wie folgt:

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

Wenn sich Ihre proj-doc-Dateien bereits in einem Commit unter einem einzelnen Unterverzeichnis befinden, können Sie den neuen Zweig folgendermaßen erstellen:

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

die als könnte bequemer sein , git branch --orphanwenn , dass Sie mit viel verlassen würde git rmund git mving zu tun.

Versuchen

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

und sehen Sie, ob dies bei Ihrem Problem hilft, zu viel zu holen. Auch wenn Sie wirklich nur einen einzelnen Zweig abrufen möchten, ist es am sichersten, ihn einfach in der Befehlszeile anzugeben.


1
Diese Antwort ist interessant, da Sie damit einen anderen Zweig / Stamm mit einem völlig leeren ersten Commit starten können.
Stéphane Gourichon

Eine andere Möglichkeit, einen leeren Zweig zu git checkout --orphan new-branch; git reset --hard
erstellen,

Was nützt das xargs?
Fluss

@Flux ist nur eine andere Möglichkeit, die Baum-ID als Commit-Tree-Argument einzubetten.
Bis zum

Dieser Ansatz gefällt mir sehr gut, da hiermit ein leerer neuer Zweig erstellt werden kann, ohne den aktuellen Zweig zu verlassen. Außerdem gibt es ein leeres Commit als Startpunkt.
Brice

8

Wenn Ihre Git-Version nicht über die Option --orphan verfügt, sollte diese Methode verwendet werden:

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

Nach einiger Arbeit:

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

2
Seien Sie vorsichtig, git cleankönnen Sie Dateien löschen, die Sie nicht löschen möchten! Führen Sie git clean -ndxzuerst aus, um zu sehen, welche Dateien gelöscht werden, bevor Sie sie mit der -fOption real ausführen .
Lassi

7

Angenommen, Sie haben einen masterZweig mit Dateien / Verzeichnissen:

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

Schritt für Schritt, wie man einen leeren Zweig macht:

  1. git checkout —orphan new_branch_name
  2. Stellen Sie sicher, dass Sie sich im richtigen Verzeichnis befinden, bevor Sie den folgenden Befehl ausführen:
    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

In Schritt 2 entfernen wir einfach alle Dateien lokal, um Verwechslungen mit den Dateien in Ihrem neuen Zweig und denjenigen, die Sie im masterZweig behalten, zu vermeiden . Dann heben wir die Verknüpfung aller dieser Dateien in Schritt 3 auf. Schließlich arbeiten Schritt 4 und danach mit unserem neuen leeren Zweig.

Sobald Sie fertig sind, können Sie ganz einfach zwischen Ihren Filialen wechseln:

git checkout master 
git checkout new_branch

1

Auf Basis dieser Antwort von Hiery Nomus .

Sie können einen Zweig als Waise erstellen:

git checkout --orphan <branchname>

Dadurch wird ein neuer Zweig ohne Eltern erstellt. Anschließend können Sie das Arbeitsverzeichnis löschen mit:

git rm --cached -r .

Und dann schreiben Sie einfach einen Zweig mit leerem Commit fest und drücken dann

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

1

Schauen Sie sich diese Dokumentation an , sie enthält klare Details zu

--orphan <new_branch>
Erstellen Sie einen neuen verwaisten Zweig mit dem Namen <new_branch>, ab dem<start_point> und wechseln Sie zu diesem. Das erste Commit für diesen neuen Zweig hat keine Eltern und ist die Wurzel einer neuen Geschichte, die von allen anderen Zweigen und Commits völlig getrennt ist.

Der Index und der Arbeitsbaum werden so angepasst, als hätten Sie zuvor git checkout ausgeführt. Auf diese Weise können Sie einen neuen Verlauf starten, der eine Reihe von Pfaden aufzeichnet, die denen ähneln, indem Sie git commit -a einfach ausführen, um das Root-Commit durchzuführen.


1
Ein Link zu einer Lösung ist willkommen, aber stellen Sie bitte sicher, dass Ihre Antwort ohne sie nützlich ist: Fügen Sie dem Link einen Kontext hinzu, damit Ihre Mitbenutzer eine Vorstellung davon haben, was es ist und warum es dort ist, und zitieren Sie dann den relevantesten Teil der Seite, die Sie verwenden. erneutes Verknüpfen mit, falls die Zielseite nicht verfügbar ist. Antworten, die kaum mehr als ein Link sind, können gelöscht werden.
Yunnosch

1

Ich fand diese Hilfe:

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"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.