Ich möchte einen neuen "Root" -Zweig in diesem Git-Repository definieren. Mit "Root" -Zweig meine ich einen Zweig, der völlig unabhängig von allen anderen Zweigen im Repository ist 1 ist .
Leider auch das Commit (nennen wir es A
) ganz unten im Commit-Baum des Repos viele Dateien (dies war ein Repository, das in einem bereits ziemlich ausgereiften Projekt initialisiert wurde).
Das heißt, auch wenn ich A
als neue Filiale gegeben habe<start-point>
angeben würde, dieser neue Zweig nicht von einem "sauberen Schiefer" ausgehen würde, sondern alle Dateien enthalten würde, die festgeschrieben wurden A
.
Gibt es eine Möglichkeit, einen vollständig leeren Zweig in diesem Repository <start-point>
so nah A
wie möglich zu erstellen ?
1 Übrigens ist dies nicht eine neue repo Schaffung äquivalent. Separate Repos wären aus vielen Gründen weniger bequem.
EDIT : OK, das habe ich getan, basierend auf der Antwort von vcsjones :
# save rev of the current earliest commit
OLDBASE=$(git rev-list --max-parents=0 HEAD)
# create a new orphan branch and switch to it
git checkout --orphan newbranch
# make sure it's empty
git rm -rf .
# create a new empty commit in the new branch, and
# save its rev in NEWBASE
git commit --allow-empty -m 'base commit (empty)'
NEWBASE=$(git rev-list HEAD)
# specify $NEWBASE as the new parent for $OLDBASE, and
# run filter-branch on the original branch
echo "$OLDBASE $NEWBASE" > .git/info/grafts
git checkout master
git filter-branch
# NOTE: this assumes that the original repo had only one
# branch; if not, a git-filter-branch -f <branch> command
# need to be run for each additional branch.
rm .git/info/grafts
Obwohl diese Prozedur etwas kompliziert ist, ist das Endergebnis ein leeres Basis-Commit, das als <start-point>
für jeden neuen "Clean-Slate-Zweig" dienen kann. Alles was ich dann tun müsste ist
git checkout -b cleanslate $(git rev-list --max-parents=0 HEAD)
In Zukunft werde ich immer neue Repositorys wie diese erstellen:
git init
git commit --allow-empty -m 'base commit (empty)'
... damit das erste Commit leer ist und immer zum Starten eines neuen unabhängigen Zweigs verfügbar ist. (Ich weiß, dies wäre eine sehr selten benötigte Einrichtung, aber es ist ziemlich mühelos, sie sofort verfügbar zu machen.)
git rebase --onto
, siehe stackoverflow.com/questions/645450/...Antworten:
Verwenden Sie
--orphan
beim Erstellen des Zweigs Folgendes:Dadurch wird ein neuer Zweig erstellt, auf dem keine Commits ausgeführt werden. Alle Ihre Dateien werden jedoch bereitgestellt. An diesem Punkt können Sie sie einfach entfernen.
("entferne sie": A.
git reset --hard
leert den Index und hinterlässt einen leeren Arbeitsbaum)Weitere Informationen zu --orphan finden Sie auf der Manpage zur Kasse.
quelle
Zur akzeptierten Antwort hinzufügen - Best Practice ist WIEDERHERSTELLEN sauberen Zustand zu schaffen , ein erstes leer begehen , so dass Sie leicht rebase können , während der Zweige für die Nachwelt einrichten. Da Sie einen sauberen Status wünschen, haben Sie wahrscheinlich Dateien festgeschrieben, die Sie nicht sollten, sodass Sie sie aus dem Index entfernen müssen. In diesem Sinne sollten Sie:
quelle
Wenn Sie Git 2.23 oder höher verwenden, sind Sie möglicherweise an
git switch
undgit restore
anstelle von gewöhntgit checkout
. In diesem Fall entspricht die Flagge der in dieser Antwort genannten .quelle
Der tatsächlich zu verwendende Befehl (mit Git 2.28+) lautet:
git switch
ist ab Git 2.23 (August 2019) verfügbar und ersetzt den alten verwirrendengit checkout
Befehl .Aber ich würde Git 2.28 (Q3 2020) empfehlen, da
git switch --discard-changes --orphan
es in dieser Version optimiert wurde.Siehe Commit 8d3e33d , Commit 8186128 (21. Mai 2020) von Brian M. Carlson (
bk2204
) .(Zusammengeführt von Junio C Hamano -
gitster
- in commit ded44af , 09. Juni 2020)Prüfung:
quelle