2010-06-22 13 views
12

Kann mir jemand sagen, wie man den ersten Commit klont? Ich möchte die letzten Commits nicht löschen, sondern nur eine Kopie des Anfangszustands erstellen, damit ich einige der Dateien packen kann.Git: Wie klont man das erste Commit?

+0

ein Git Repository mehrere ‚erste Commits‘ – knittl

+8

Okay, ihr Jungs haben kann, nicht machen einen solchen Gestank über die erste begehen Sache.Es gibt immer mindestens ein Root-Commit, und es ist sehr selten, dass es mehrere gibt, besonders in einem Repository eines Benutzers, der eine grundlegende Frage wie diese stellt. – Cascabel

Antwort

9

die Frage zu beantworten, ich glaube, Sie zu fragen, gemeint:

Sie können Ihre gesamte Repository in den Zustand des bekommen zuerst mit commit:

git checkout <commit SHA1> 

Nach Herumspielen fertig sind, können Sie kann git checkout master tun, um dorthin zurückzukehren, wo Sie waren.

Und können Sie einzelne Dateien in ihrem Zustand von der ersten bekommen begehen mit:

git checkout <commit SHA1> <file or directory> ... 

wieder, nachdem Sie fertig sind, können Sie git checkout master <file or directory> tun können, um zurück, wo Sie waren.

Es gibt keine Notwendigkeit zu „klonen“ ein commit (von denen ich annehmen, dass Sie das Repository bedeuten klonen, und schauen Sie sich die erste begehen?). Natürlich, wenn Sie es aus irgendeinem Grund nicht ertragen könnten, irgendwelche Dateien in Ihrem Repository zu verändern (zB wollen Sie Ihr Build nicht veraltet machen), könnten Sie es natürlich klonen, dann machen Sie dasselbe im geklonten Repo .

-1

denke ich, alles, was Sie tun müssen, ist eine Niederlassung von der ursprünglichen erstellen verpflichten Sie wollen prüfen, ob, und dann in den Kopf der Branche verschmelzen wieder auf dem Sie arbeiten.

Wenn abcxyz ... ist die SHA1 von der Commit Sie wollen, und Sie in der Master-Zweig arbeiten, dies ist in der Regel, was Sie tun wollen würde:

git branch oldskool abcxyz... # creates a new branch called oldskool from the commit 
git checkout oldskool 
#make changes 
git rebase master #bring the oldskool branch up to the HEAD of the master branch (shouldn't overwrite the changes in the files you edited) 
git checkout master 
git merge oldskool 
+0

Sie erstellen oldskool von einem Vorfahren des Masters, also wird die Rebase es nur vorspulen, und dann ist die Zusammenführung ein No-Op. Keine Änderung zum Master. Wenn Sie die Rebase überspringen, wird die Zusammenführung auch ein schneller Vorlauf sein, und wieder keine Änderung an Master. – Cascabel

14

Ich glaube, ich möchte mach das selbe. Überprüfen Sie das initiale Commit und verzweigen Sie von dort. Ich bin mir nicht sicher, ob die Antwort akzeptiert wird. Aber ich denke, es könnte (teilweise) die ursprüngliche Frage erfüllen. Nach diesem Thread zu lesen, aber ich werde mit einigen Bash Scripting geht um

git log --pretty=oneline master | tail -1 

Ich glaube, ich es erhofft habe dieses einig Engage- oder Baum-ish Referenz wäre.

Daher können Sie die ersten Commit mit dem folgenden Befehl Kasse:

git checkout `git log --pretty=oneline | tail -1 | sed 's/ .*$//'` 

2017 Update: seit '12 (GIT 1.8.1), haben wir eine bessere Option haben: git rev-list. Siehe andere Antworten hier oder KyleMit at superuser für eine bessere Art des Skripting.

+3

Wenn Sie 'git rev-list --all' anstelle von 'git log --pretty = oneline master' verwendet haben, müssten Sie die Commit-Nachricht nicht analysieren, da sie nur sas zurückgibt. Siehe meine Antwort zu [Verwenden von Git, wie gehe ich zurück zum ersten Commit] (http://superuser.com/a/773366/180163) – KyleMit

11

Wenn Sie mit "first commit" das Parent-Commit einer Verzweigung meinen, die selbst keine Eltern hat, dann möchten Sie die git-rev-Liste dazu verwenden. Verwenden Sie einfach

git rev-list --max-parents=0 HEAD

Das Ihr bekommt für den aktuellen HEAD "Initial zu begehen". Verwenden Sie bei der Auflistung Master oder eine andere untergeordnete Revisionsspezifikation. wickeln, dass in $(...) damit in einem Ausdruck zu verwenden, wie zum Beispiel:

git checkout $(git rev-list --max-parents=0 HEAD)

+2

Danke, dies ist die einzige Antwort, die den allgemeinen Fall ohne eine Zwischenkopie abdeckt/Schritt einfügen. –

+0

Danke für die Lösung Jesse! –

Verwandte Themen