Machen Sie den aktuellen Commit zu einem einzigen (ursprünglichen) Commit im Git-Repository?

Derzeit habe ich ein lokales Git-Repository, das ich auf das Github-Repository klicke.

Das lokale Repository hat ~ 10 Commits und das Github-Repository ist ein synchronisiertes Duplikat.

Ich möchte ALLEN Versionsverlauf aus dem lokalen Git-Repository entfernen, sodass der aktuelle Repository-Inhalt als einziges Commit angezeigt wird (und daher ältere Versionen der Dateien im Repository nicht gespeichert werden).

Ich möchte diese Änderungen in Github anklicken.

Ich habe Git rebase erkundet, aber dies scheint besser geeignet zu sein, um bestimmte Versionen zu entfernen. Eine andere mögliche Lösung besteht darin, das lokale Repo zu entfernen und ein neues zu erstellen, obwohl dies wahrscheinlich viel Arbeit verursachen würde!

ETA: Es gibt bestimmte Verzeichnisse / Dateien, die nicht überwacht werden. Wenn möglich, möchte ich die Deaktivierung dieser Dateien unterstützen.

460
13 марта '12 в 14:41 2012-03-13 14:41 Kaese wird am 13. März '12 um 14:41 Uhr 2012-03-13 14:41 eingestellt
@ 14 Antworten

Hier ist ein Brute-Force-Ansatz. Es entfernt auch die Repository-Konfiguration.

Hinweis Dies funktioniert NICHT, wenn sich im Repository Submodule befinden! Wenn Sie Submodule verwenden, sollten Sie zum Beispiel einen interaktiven Neustart verwenden.

Schritt 1: Löschen Sie den gesamten Verlauf ( Stellen Sie sicher, dass Sie über eine Sicherung verfügen, die Rückkehr ist unmöglich. )

 rm -rf .git 

Schritt 2: Stellen Sie das Git-Repository nur mit dem aktuellen Inhalt wieder her

 git init git add . git commit -m "Initial commit" 

Schritt 3: Klicken Sie auf GitHub.

 git remote add origin <github-uri> git push -u --force origin master 
747
13 марта '12 в 14:44 2012-03-13 14:44 Die Antwort wird von Fred Foo am 13. März 12 um 14:44 2012-03-13 14:44 gegeben

Die einzige Lösung, die für mich funktioniert (und die Submodule funktionieren), ist

 git checkout --orphan newBranch git add -A # Add all files and commit them git commit git branch -D master # Deletes the master branch git branch -m master # Rename the current branch to master git push -f origin master # Force push master branch to github git gc --aggressive --prune=all # remove the old files 
border=0

Das Entfernen von .git/ verursacht immer große Probleme, wenn ich Submodule habe. Die Verwendung von git rebase --root verursacht für mich irgendwie Konflikte (und ich habe viel Geschichte).

410
27 окт. Antwort an Zeelot vom 27. Oktober. 2012-10-27 21:16 '12 um 21:16 2012-10-27 21:16

Dies ist mein günstiger Ansatz:

 git branch new_branch_name $(echo "commit message" | git commit-tree HEAD^{tree}) 

Dadurch wird ein neuer Zweig mit einem einzigen Commit erstellt, der HEAD alles hinzufügt. Es ändert sich nichts, es ist also absolut sicher.

63
22 марта '13 в 16:53 2013-03-22 16:53 Die Antwort wird gegeben dan_waterworth 22. März 13 um 16:53 2013-03-22 16:53

Eine andere Option, die viel Arbeit bedeuten kann, wenn Sie viele Commits haben, ist eine interaktive Rebase (wenn Ihre Git-Version> 1.7.12 ist): git rebase --root -i

Wenn Sie eine Liste von Commits in Ihrem Editor präsentieren:

  • Ändern Sie "pick" in "umformulieren" für den ersten Commit
  • Ändern Sie "pick" in "fixup" bei jedem zweiten Commit

Speichern und schließen git wird neu gestartet.

Am Ende haben Sie eine neue Wurzelretention, die aus allen Nachkommen besteht.

Der Vorteil ist, dass Sie Ihr Repository nicht löschen müssen, und wenn Sie andere Gedanken haben, haben Sie immer eine Reserve.

Wenn Sie Ihre Historie wirklich zerstören möchten, setzen Sie den Master für dieses Commit zurück und löschen Sie alle anderen Zweige.

26
14 марта '12 в 23:24 2012-03-14 23:24 Die Antwort wird von Carl am 14. März 12 um 23:24 Uhr 2012-03-14 23:24 gegeben

Das Löschen des .git-Ordners kann zu Problemen im git-Repository führen. Wenn Sie Ihren gesamten Fixierungsverlauf löschen möchten.

folge diesen Schritten:

Schritt-1 (Kasse)

 git checkout --orphan latest_branch 

Schritt-2 (alle Dateien hinzufügen)

 git add -A 

Schritt 3 (Änderungen übernehmen)

 git commit -am "commit message" 

Schritt-4 (Zweig löschen)

 git branch -D master 

Schritt-5 (den aktuellen Zweig in Master umbenennen)

 git branch -m master 

Schritt 6 (letzter Schritt, Aktualisierung Ihres Repositorys)

 git push -f origin master 

!! Jetzt genießen Sie die Geschichte der Fixierung!

21
14 окт. Die Antwort gibt Shivam Srivastava am 14. Oktober. 2017-10-14 12:08 '17 am 12:08 2017-10-14 12:08

Variante der vorgeschlagenen Larsmans-Methode:

Speichern Sie die Liste der nicht gedruckten Dateien:

 git ls-files --others --exclude-standard > /tmp/my_untracked_files 

Speichern Sie die Git-Konfiguration:

 mv .git/config /tmp/ 

Dann folgen Sie den ersten Schritten von Larsmans:

 rm -rf .git git init git add . 

Stellen Sie die Konfiguration wieder her:

 mv /tmp/config .git/ 

Nicht getestete Dateien verwerfen:

 cat /tmp/my_untracked_files | xargs -0 git rm --cached 

Dann beheben:

 git commit -m "Initial commit" 

Klicken Sie anschließend auf Ihr Repository:

 git push -u --force origin master 
14
19 апр. Antwort von Lalebarde am 19. April 2014-04-19 11:58 '14 um 11:58 2014-04-19 11:58

Erstellen Sie einen Zweig, kopieren Sie den gesamten Inhalt hinein, kopieren Sie ihn und löschen Sie dann den Hauptzweig:

 git checkout --orphan newBranch; git add -A ;git commit -am 'first commit' ;git branch -D master;git branch -m master; git push -f origin master; git gc --aggressive --prune=all 
5
12 марта '17 в 17:53 2017-03-12 17:53 Die Antwort wird gegeben pratik_bhavsar 12. März 17 um 17:53 2017-03-12 17:53

Sie können flache Klone verwenden (git> 1.9):

 git clone --depth depth remote-url 

Weiterführende Literatur: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/

5
04 апр. die antwort gibt Matthias M 04 apr. 2016-04-04 14:05 '16 um 14:05 Uhr 2016-04-04 14:05

Die unten beschriebene Methode ist reproduzierbar, sodass der Klon nicht erneut gestartet werden muss. Wenn beide Seiten konsistent sind, führen Sie das Skript auf der anderen Seite aus.

 git log -n1 --format=%H >.git/info/grafts git filter-branch -f rm .git/info/grafts 

Wenn Sie es bereinigen möchten, probieren Sie das Skript aus:

http://sam.nipl.net/b/git-gc-all-ferocious

Ich habe ein Skript geschrieben, das "Geschichte tötet" für jeden Zweig im Repository:

http://sam.nipl.net/b/git-kill-history

Siehe auch: http://sam.nipl.net/b/confirm

2
06 февр. Die Antwort wurde am 6. Februar von Sam Watkins gegeben . 2013-02-06 19:46 '13 um 19:46 2013-02-06 19:46
 git for-each-ref --format='git update-ref -d %(refname)' \ refs/{heads,tags} | sh -x current=$(git commit-tree -m 'Initial commit' `git write-tree`) git update-ref -m 'Initial commit' `git symbolic-ref HEAD` $current 

Dadurch werden alle lokalen Zweigstellen und Tags entfernt, ein Ereignis ohne Historie mit dem Status Ihrer aktuellen Prüfung in einem Zweig der aktuellen erstellt und alles andere in Ihrem Repo bleibt erhalten. Dann können Sie Ihre Fernbedienungen nach Belieben mit Gewalt anklicken.

1
05 апр. Die Antwort wird bis zum 05. April gegeben 2014-04-05 04:42 '14 am 4:42 2014-04-05 04:42

Ich möchte ALLEN Versionsverlauf aus dem lokalen Git-Repository entfernen, sodass der aktuelle Repository-Inhalt als einziges Commit angezeigt wird (und daher ältere Versionen der Dateien im Repository nicht gespeichert werden).

Mehr konzeptionelle Antwort:

git sammelt alte gits automatisch, wenn tags / niederlassungen / links nicht auf sie zeigen. Daher müssen Sie nur alle Tags / Zweige entfernen und ein neues, einem Zweig zugeordnetes Waisenfestlegen erstellen. Nach Vereinbarung gestatten Sie dem Hauptzweig die Angabe dieses Festschreibens.

Alte, unzugängliche Commits werden nie wieder von jedermann gesehen, es sei denn, sie befassen sich mit den Low-Level-Git-Befehlen. Wenn dies für Sie ausreichend ist, höre ich einfach dort auf und überlasse es dem automatischen GC, wann immer er möchte. Wenn Sie sie sofort loswerden möchten, können Sie git gc (vielleicht mit --aggressive --prune=all ). Bei einem Remote-Git-Repository können Sie dies nur, wenn Sie Zugriff auf das Dateisystem haben.

0
04 апр. die antwort wird von anoE 04 apr gegeben. 2016-04-04 14:27 '16 um 14:27 Uhr 2016-04-04 14:27

Verwenden Sie dazu den Befehl Shallow Clone - git clone --depth 1 URL - es wird nur das aktuelle HEAD-Repository geklont

-1
23 авг. Die Antwort wird von kkarki 23 aug gegeben. 2017-08-23 18:55 '17 um 18:55 Uhr 2017-08-23 18:55

Um das letzte Commit von git zu entfernen, können Sie es einfach ausführen

 git reset --hard HEAD^ 

Wenn Sie mehrere Commits von oben löschen, können Sie ausführen

 git reset --hard HEAD~2 

um die letzten beiden Commits zu entfernen. Sie können die Anzahl erhöhen, um noch mehr Commits zu entfernen.

Weitere Informationen hier.

Git tutoturial hier hilft beim Löschen des Repositorys:

Sie möchten die Datei aus dem Verlauf löschen und zu .gitignore hinzufügen, um sicherzustellen, dass sie nicht versehentlich wiederholt wird. Für unsere Beispiele entfernen wir das Rakefile aus dem Github-Gem-Repository.

 git clone https://github.com/defunkt/github-gem.git cd github-gem git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch Rakefile' \ --prune-empty --tag-name-filter cat -- --all 

Nachdem wir die Datei aus der Historie gelöscht haben, können wir garantieren, dass wir dies nicht aus Versehen tun.

 echo "Rakefile" >> .gitignore git add .gitignore git commit -m "Add Rakefile to .gitignore" 

Wenn Sie mit dem Status des Repositorys zufrieden sind, müssen Sie die Änderungen erzwingen, um das entfernte Repository zu überschreiben.

 git push origin master --force 
-1
05 июня '13 в 8:41 2013-06-05 08:41 Die Antwort ist Octoback Juni 05 '13 um 8:41 2013-06-05 08:41 gegeben

Ich löste ein ähnliches Problem, indem ich einfach den .git Ordner aus meinem Projekt entfernte und die Versionskontrolle über IntelliJ wieder integriert. Hinweis Der .git Ordner ist ausgeblendet. Sie können es im Terminal mit ls -a anzeigen und dann mit rm -rf .git löschen.

-1
11 апр. Antwort von JB Lovell am 11. April 2017-04-11 21:54 '17 um 21:54 Uhr 2017-04-11 21:54

Weitere Fragen zu Tags oder Frage stellen