Da dies mit git markiert ist, hoffe ich, dass mein Mangel an SVN-Kenntnissen vernachlässigbar ist.
Derzeit klone ich ein Repo und einen bestimmten Zweig mit gitk.
Sie klonen das gesamte Remote-Repository und nicht nur einen bestimmten Zweig.
Das Repository ist am besten als Datenbank gedacht, sodass Sie einen Klon des aktuellen Status der entfernten Datenbank erstellen. Aber danach arbeiten Sie an Ihrer eigenen Kopie dieser Datenbank. Wenn Sie ein Commit durchführen, ändern Sie Ihre lokale Datenbank.
Der fetch
Befehl wird verwendet, um die lokale Datenbank mit der entfernten Datenbank synchron zu halten.
Normalerweise checken Sie aus dieser lokalen Datenbank einen Zweig aus, an dem Sie arbeiten möchten. Dies ist nichts anderes als ein interner Marker für Git, wo Ihre aktuelle Arbeit begann.
Angenommen, Sie arbeiten an einem einfachen Repository, in dem es keinen Zweig master
gibt. Sie könnten einen Blick in den .git
Ordner werfen , um die "Magie" zu enthüllen:
Angenommen, Ihr letzter Commit (on master
) war 182e8220b404437b9e43eb78149d31af79040c66
, finden Sie genau das unter cat .git/refs/heads/master
.
Von dem Sie einen neuen Zweig abzweigen git checkout -b mybranch
, finden Sie genau den gleichen Zeiger in der Datei cat .git/refs/heads/mybranch
.
Zweige sind nichts anderes als "Zeiger". Der "funktionierende" Marker heißt a HEAD
.
Wenn Sie wissen möchten, wo Sie sich HEAD
befinden:
cat .git/HEAD
was zB sagt ref: refs/heads/mybranch
, was wiederum cat .git/refs/heads/mybranch
auf einen Commit-Hash hinweist ( )78a8a6eb6f82eae21b156b68d553dd143c6d3e6f
Die eigentlichen Commits werden unter dem objects
Ordner gespeichert (das Wie ist ein eigenes Thema).
Der Projektordner enthält nur den Inhalt für diesen Zweig, und ich kann nicht alle Zweige wie in SVN sehen, was für mich etwas verwirrend ist.
Verwechseln Sie das nicht working directory
mit der "Git-Datenbank" als Ganzes. Wie ich oben sagte, ist Ihr Arbeitsverzeichnis nur eine Momentaufnahme (vielleicht) einer Teilmenge.
Angenommen, Sie haben verschiedene Zweige. Ihr Arbeitsverzeichnis ist nur für die Arbeit an diesem Zweig vorgesehen (obwohl Sie die Arbeit von dort aus auch an anderer Stelle ablegen könnten).
In der Regel haben Sie die Möglichkeit zu sehen, welche Zweige für das Projekt definiert sind
git branch
für lokale Niederlassungen
git branch --remote
für entfernte Zweige
git branch -a
für beide
(oder git branch -v
)
Da es sich bei git um ein verteiltes Versionskontrollsystem handelt, ist es nicht nur möglich, sondern auch empfehlenswert, verschiedene Zweigstellen lokal / remote einzurichten.
Mein typischer Workflow ist:
- Verzweigen Sie eine Feature-Verzweigung
- Verzweigen Sie einen WIP-Zweig (Work in Progress) von diesem Zweig
- Arbeiten Sie so, wie Sie möchten - auch wenn Sie nach einer einzelnen Zeile ein Commit ausführen. es spielt keine rolle
Wenn die Funktion abgeschlossen ist:
- squash /
WIP
rework the branch (mit interaktivem rebasing) = mache daraus ein einzelnes commit
- Füge den
WIP
Zweig in den Feature-Zweig ein und biete an, dass (wenn du mit Github arbeitest, würde dieses Angebot eine "Pull-Anfrage" heißen), um in den stabilen (Master-) Zweig integriert zu werden.
Außerdem möchte ich wissen, wie man einen Prozess handhabt, bei dem ich auf zwei Zweigen gleichzeitig wprl muss, wenn ich zum Beispiel einen Hotfix auf dem Master machen muss, aber den Inhalt eines anderen Zweigs auch behalte.
Das hängt davon ab, wie Ihr Projekt aufgebaut ist:
Angenommen, Sie haben einen Stallmeister. Und Features werden nur aus diesem stabilen Zweig entwickelt - also normalerweise hinter einem Feature-Zweig. Dann hätten Sie ein letztes Commit für den Master, das die Wurzel des Feature-Zweigs wäre.
Dann würden Sie eine auf dem Master - Zweig machen begehen und könnte entscheiden, ob fusionieren beiden Zweige zusammen oder rebase (das ist eine Art von Merge für Benutzer mit umfassenderen Anforderungen so zu sagen).
Oder Sie können jederzeit Änderungen an Zweigen vornehmen (z. B. master
) und diese per Cherrypick auf andere Zweige übertragen.
Welche Namenskonventionen werden empfohlen, um Ordner zu erstellen, die den Zweig enthalten, der aus dem Repository in GIT geklont wurde, z. B. myproject-branchname
Es liegt an dir.
In der Regel erhalten Sie den Repository-Namen.
Aber es gibt Situationen, in denen dies nicht erwünscht ist:
zB klonen Sie oh-my-zsh mit git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
Hier .oh-my-zsh
wird explizit als Ziel angegeben.