401 Stimmen

Gibt es in Git eine einfache Möglichkeit, einen nicht verwandten Zweig in ein Repository einzuführen?

Als ich heute einem Freund bei einem Git-Problem half, musste ich eine Zweig einführen, der völlig getrennt von der master Zweigstelle. Der Inhalt dieser Verzweigung hatte tatsächlich einen anderen Ursprung als das, was entwickelt worden war. master Zweig, aber sie sollten in den master Zweigstelle zu einem späteren Zeitpunkt.

Ich erinnerte mich nach der Lektüre von John Wiegleys Git von unten oben wie Zweige sind im Wesentlichen ein Etikett für eine Übergabe, die einer bestimmten Konvention folgt und wie ein Commit mit einem Baum von Dateien und optional zu übergeordneten Commits. Wir haben einen elternlosen Commit zum bestehenden Repository mit Hilfe von Git zu erstellen:

Wir sind also alle Dateien im Index losgeworden ...

$ git rm -rf .

... extrahierte Verzeichnisse und Dateien aus einem Tarball und fügte diese dem Index hinzugefügt ...

$ git add .

... und ein Baumobjekt erstellt ...

$ git write-tree

( git-write-tree hat uns die sha1sum des erstellten Baumobjekts mitgeteilt).

Dann haben wir den Baum committed, ohne die übergeordneten Commits anzugeben...

$ echo "Imported project foo" | git commit-tree $TREE

( git-commit-tree die Sha1-Summe des erstellten Commit-Objekts).

... und einen neuen Zweig erstellt, der auf unsere neu erstellte Übergabe verweist.

$ git update-ref refs/heads/other-branch $COMMIT

Schließlich kehrten wir zum master Zweigstelle, um die Arbeit dort fortzusetzen.

$ git checkout -f master

Dies scheint wie geplant funktioniert zu haben. Aber das ist eindeutig nicht die Art von Verfahren, das ich jemandem empfehlen würde, der gerade erst anfängt Git zu verwenden, um es milde auszudrücken. Gibt es einen einfacheren Weg zur Erstellung einer neuen Zweig zu erstellen, der nichts mit dem zu tun hat, was bisher bisher im Projektarchiv passiert ist?

591voto

tcovo Punkte 7370

Es gibt eine neue Funktion (seit V1.7.2), die diese Aufgabe ein wenig anspruchsvoller macht als die in den anderen Antworten.

git checkout unterstützt jetzt die --orphan Option. Vom Manpage :

git checkout [-q] [-f] [-m] --orphan <new_branch> [<start_point>]

Erstellen Sie eine neue verwaist b <neuer_Zweig>, gestartet von <Startpunkt> und wechseln Sie zu ihm. Die erste Übergabe in diesem neuen Zweig wird keine Eltern haben und wird die Wurzel einer völlig neuen Geschichte völlig losgelöst von allen anderen Zweigen und Übertragungen.

Das reicht nicht aus genau das, was der Fragesteller wollte, denn es füllt den Index und den Arbeitsbaum aus <start_point> (da es sich schließlich um einen Checkout-Befehl handelt). Die einzige andere notwendige Aktion ist das Entfernen aller unerwünschten Elemente aus dem Arbeitsbaum und dem Index. Leider, git reset --hard funktioniert nicht, aber git rm -rf . kann stattdessen verwendet werden (ich glaube, dies ist gleichbedeutend mit rm .git/index; git clean -fdx die in anderen Antworten gegeben wurden).


Zusammengefasst:

git checkout --orphan newbranch
git rm -rf .
<do work>
git add your files
git commit -m 'Initial commit'

Ich bin gegangen <start_point> unspezifiziert, weil es standardmäßig HEAD ist und es uns sowieso nicht wirklich interessiert. Diese Sequenz tut im Wesentlichen das Gleiche wie die Befehlssequenz in Artem's Antwort ohne dabei auf unheimliche Klempnerbefehle zurückzugreifen.

37voto

Artem Tikhomirov Punkte 21027

De 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'

32voto

Jakub Narębski Punkte 286531

Obwohl die Lösung mit git symbolic-ref und das Entfernen des Index funktioniert, könnte es sein konzeptionell sauberer zu erstellen neu Repository

$ 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

dann holen Sie daraus

$ 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

Jetzt können Sie /path/to/unrelated löschen

27voto

Daniel Reis Punkte 12406

In neueren Git-Versionen, mindestens 2.27, kann dies sauber mit der Option switch Befehl:

git switch --orphan <new-branch>

Offizielle Dokumentation: https://www.git-scm.com/docs/git-switch

21voto

unknownprotocol Punkte 400

Die derzeit ausgewählte Antwort ist richtig, ich möchte nur hinzufügen, dass zufällig...

Das ist genau die Art und Weise, wie github.com die Benutzer Github Pages für ihre Repos erstellen lässt, und zwar durch einen verwaisten Zweig namens gh-pages . Die hübschen Schritte sind hier angegeben und erklärt:

https://help.github.com/articles/creating-project-pages-manually

Die Git-Befehle zur Einrichtung lauten im Wesentlichen wie folgt:

  1. git checkout --orphan gh-pages (Erstellen Sie einen übergeordneten Zweig namens gh-pages in Ihrem Repository)
  2. git rm -rf . (entfernt alle Dateien aus dem Arbeitsbaum des Zweigs)
  3. rm '.gitignore' (auch der Gitignore)
  4. Fügen Sie nun den Inhalt der Website hinzu (index.html usw.), übertragen Sie die Datei und schieben Sie sie hoch.
  5. Gewinn.

Sie können auch einen /docs-Ordner zu benennen auf Ihrem Projektarchiv als Quelle für die "Projektseite", die Github zur Erstellung der Website verwendet.

Ich hoffe, das hilft!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X