wake-up-neo.com

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

Während ich heute einem Freund bei einem Git-Problem behilflich war, musste ich einen -Zweig einführen, der vom master-Zweig völlig getrennt sein musste .. _. Der Inhalt dieses Zweigs hatte wirklich einen anderen Ursprung als .__ wurde auf dem Zweig master entwickelt, sie wurden jedoch später in den Zweig master eingemischt.

Ich erinnerte mich an das Lesen von John Wiegleys Git von unten Up how - Zweige sind im Wesentlichen eine Bezeichnung für ein Commit, das einer bestimmten - Konvention folgt und wie ein Commit an einen Baum von Dateien und , optionalto für übergeordnete Commits. Wir haben ein Parentless-Commit für das vorhandene Repository erstellt, indem gits Plumbing verwendet wurde:

Also haben wir alle Dateien im Index entfernt ...

$ git rm -rf .

... entpackte Verzeichnisse und Dateien aus einem Tarball, fügte diese dem Index hinzu ...

$ 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 festgeschrieben, ohne die übergeordneten Commits anzugeben ...

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

(git-commit-tree hat uns die Sha1sum des erstellten Commit-Objekts mitgeteilt.)

... und einen neuen Zweig erstellt, der auf unser neu erstelltes Commit verweist.

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

Schließlich kehrten wir zum Zweig master zurück, um dort weiterzuarbeiten.

$ git checkout -f master

Dies scheint wie geplant zu funktionieren. Dies ist jedoch eindeutig nicht die Art von Verfahren, die ich jemandem empfehlen würde, der gerade erst anfängt, mit Git zu arbeiten, um es milde auszudrücken. Gibt es einen einfacheren Weg, um einen neuen Zweig zu erstellen, der völlig unabhängig von allem ist, was bisher geschehen ist im Repository?

296
hillu

Es gibt ein neues Feature (seit V1.7.2), das diese Aufgabe etwas höher macht als in den anderen Antworten.

git checkout unterstützt jetzt die Option --Orphan. Auf der man-Seite :

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

Erstellen Sie einen neuen Orphan-Zweig mit dem Namen <neue_branch>, angefangen von <start_point> und wechseln Sie zu diesem. Das Erstes Commit für diesen neuen Zweig wird keine Eltern haben und es wird die Wurzel einer neuen Geschichte völlig getrennt von allen anderen Zweige und Commits.

Dies tut genau nicht, was der Fragesteller wollte, da er den Index und den Arbeitsbaum von <start_point> auffüllt (da dies immerhin ein Checkout-Befehl ist). Die einzige weitere Aktion ist das Entfernen unerwünschter Elemente aus dem Arbeitsbaum und dem Index. Leider funktioniert git reset --hard nicht, aber stattdessen kann git rm -rf . verwendet werden (ich glaube, das entspricht rm .git/index; git clean -fdx in anderen Antworten).


In Summe:

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

Ich habe <start_point> nicht angegeben, da er standardmäßig auf HEAD gesetzt ist und uns sowieso nicht wirklich interessiert. Diese Sequenz macht im Wesentlichen das gleiche wie die Befehlssequenz in Artem's answer , nur ohne auf furchterregende Klempnerbefehle zurückzugreifen. 

459
tcovo

Aus 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'
30

Obwohl die Lösung mit git symbolic-ref und dem Entfernen des Index funktioniert, könnte es konzeptuell sauberer sein, um new repository zu erstellen

$ 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 abholen

$ 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/nicht verwandt löschen

22
Jakub Narębski

Github hat eine Funktion namens Project Pages , in der Sie einen bestimmten benannten Zweig in Ihrem Projekt erstellen können, um Dateien bereitzustellen, die von Github bereitgestellt werden. Ihre Anweisungen lauten wie folgt:

$ cd /path/to/fancypants
$ git symbolic-ref HEAD refs/heads/gh-pages
$ rm .git/index
$ git clean -fdx

Von dort haben Sie ein leeres Repository, zu dem Sie Ihren neuen Inhalt hinzufügen können.

12
Greg Hewgill

Die aktuell gewählte Antwort ist richtig, ich würde das zufällig hinzufügen ...

Auf genau diese Weise können Benutzer mit Github.com Github-Seiten für ihre Repos erstellen, durch einen verwaisten Zweig mit dem Namen gh-pages. Die hübschen Schritte werden hier erläutert und erläutert:

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

Grundsätzlich sind die git-Befehle zum Einrichten wie folgt:

  1. git checkout --Orphan gh-pages (Erstellen Sie einen übergeordneten Zweig mit dem Namen gh-pages in Ihrem Repo).
  2. git rm -rf . (entfernt alle Dateien aus dem Zweigbaum)
  3. rm '.gitignore' (auch der gitignore)
  4. Fügen Sie nun den Inhalt der Website hinzu (fügen Sie index.html usw. hinzu) und bestätigen Sie mit.
  5. Profitieren.

Hinweis: Sie können auch einen/docs-Ordner angeben auf Ihrem Repo als Quelle der "Project Site" angeben, die Github zum Erstellen der Website verwendet.

Hoffe das hilft!

6
unknownprotocol

Manchmal möchte ich einfach einen leeren Zweig in einem Projekt erstellen und dann mit der Arbeit beginnen. Ich werde einfach den folgenden Befehl ausführen: 

git checkout --Orphan unrelated.branch.name
git rm --cached -r .
echo "init unrelated branch" > README.md
git add README.md
git commit -m "init unrelated branch"
3
Sing

Wenn Ihr vorhandener Inhalt bereits festgeschrieben wurde, können Sie ihn jetzt (Git 2.18 Q2 2018) in einen eigenen neuen Orphan-Zweig extrahieren, da die Implementierung von "git rebase -i --root" Aktualisiert wurde, um die Sequenzer-Maschinerie besser zu nutzen.

Dieser Sequenzer ist jetzt derjenige der es ermöglicht, die gesamte Topologie des Festschreibungsgraphen an einer anderen Stelle zu verpflanzen .

Siehe Festschreiben 8fa6eea , Festschreiben 9c85a1c , Festschreiben ebddf39 , Festschreiben 21d0764 , Festschreiben d87d48b , commit ba97aea (03. Mai 2018) von Johannes Schindelin (dscho) .
(Zusammengeführt von Junio ​​C Hamano - gitster - in Commit c5aa4bc , 30. Mai 2018)

sequenzer: Ermöglicht das Einfügen neuer Root-Commits

Im Zusammenhang mit dem neuen Modus --rebase-merges, Der speziell dafür entwickelt wurde, die vorhandene Verzweigungstopologie großzügig zu ändern , möchte ein Benutzer möglicherweise Commits in eine völlig neue Verzweigung extrahieren, die Beginnt mit einem neu erstellten Root-Commit .

Dies ist jetzt möglich, indem Sie den Befehl reset [new root] Vor pick dem Commit einfügen, das ein Root-Commit werden soll. Beispiel:

reset [new root]
pick 012345 a commit that is about to become a root commit
pick 234567 this commit will have the previous one as parent

Dies steht nicht im Widerspruch zu anderen Verwendungen des Befehls reset, da [new root] Kein gültiger Referenzname (Teil davon) ist: Sowohl die öffnende Klammer als auch das Leerzeichen sind in Referenznamen unzulässig.

1
VonC

Fand dieses Skript unter http://wingolog.org/archives/2008/10/10/14/merging-in-unrelated-git-branches und es funktioniert sehr gut!

#!/bin/bash

set -e

if test -z "$2" -o -n "$3"; then
    echo "usage: $0 REPO BRANCHNAME" >&2
    exit 1
fi

repo=$1
branch=$2

git fetch "$repo" "$branch"

head=$(git rev-parse HEAD)
fetched=$(git rev-parse FETCH_HEAD)
headref=$(git rev-parse --symbolic-full-name HEAD)

git checkout $fetched .

tree=$(git write-tree)

newhead=$(echo "merged in branch '$branch' from $repo" | git commit-tree $tree -p $head -p $fetched)
git update-ref $headref $newhead $head
git reset --hard $headref
0
Benoît