<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Git on livingIT</title>
		<link>https://livingit.de/de/tags/git/</link>
		<description>Recent content in Git on livingIT</description>
		<generator>Hugo</generator>
		<language>de</language>
		
		
		
		
			<lastBuildDate>Thu, 01 Oct 2026 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://livingit.de/de/tags/git/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>Bookmarks sind keine Branches, und das ist der Punkt</title>
				<link>https://livingit.de/de/software/jj-08-bookmarks-vs-branches/</link>
				<pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/de/software/jj-08-bookmarks-vs-branches/</guid>
				<description>&lt;h1 id=&#34;bookmarks-sind-keine-branches-und-das-ist-der-punkt&#34;&gt;Bookmarks sind keine Branches, und das ist der Punkt&lt;/h1&gt;&#xA;&lt;p&gt;Teil 8 von 9.&lt;/p&gt;&#xA;&lt;p&gt;jjs benannte Zeiger &amp;ldquo;Bookmarks&amp;rdquo; statt &amp;ldquo;Branches&amp;rdquo; zu nennen sah anfangs nach&#xA;unnötigem Vokabular aus. Ist es nicht. Ein Git-Branch rückt jedes Mal automatisch&#xA;vor, wenn du committest, während er ausgecheckt ist, das Ref und deine aktuelle&#xA;Arbeitslinie sind dasselbe, bis du explizit wechselst. Ein jj-Bookmark ist davon&#xA;entkoppelt: Du kannst mehrere Commits über der letzten Stelle arbeiten, auf die ein&#xA;Bookmark zeigt, und es bleibt einfach dort, bis du es mit &lt;code&gt;jj bookmark set&lt;/code&gt;&#xA;verschiebst oder indem du den Commit rebasierst, an den es angehängt ist.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Teammitglieder, die jj nie anfassen, müssen nicht wissen, dass es existiert</title>
				<link>https://livingit.de/de/software/jj-09-git-only-teammates-dont-need-to-care/</link>
				<pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/de/software/jj-09-git-only-teammates-dont-need-to-care/</guid>
				<description>&lt;h1 id=&#34;teammitglieder-die-jj-nie-anfassen-müssen-nicht-wissen-dass-es-existiert&#34;&gt;Teammitglieder, die jj nie anfassen, müssen nicht wissen, dass es existiert&lt;/h1&gt;&#xA;&lt;p&gt;Teil 9 von 9.&lt;/p&gt;&#xA;&lt;p&gt;Das war die Frage, die vor der Übernahme von all dem für echte Arbeit am meisten&#xA;zählte: Was passiert, wenn ein PR-Review-Kommentar von jemandem kommt, der schlichtes&#xA;&lt;code&gt;git&lt;/code&gt; verwendet, oder wenn ich selbst aus Gewohnheit auf einen schlichten&#xA;&lt;code&gt;git&lt;/code&gt;-Befehl zurückfalle. Die Antwort stellte sich als der undramatischste Teil der&#xA;ganzen Serie heraus, nichts Besonderes passiert, weil der Colocated-Modus bedeutet,&#xA;dass jj dieselbe Git-Objektdatenbank liest und schreibt wie alle anderen. Ein mit&#xA;&lt;code&gt;git push&lt;/code&gt; gepushter Commit und ein mit &lt;code&gt;jj git push&lt;/code&gt; gepushter Commit sind am&#xA;anderen Ende dieselbe Art von Objekt.&lt;/p&gt;</description>
			</item>
			<item>
				<title>History bearbeiten, ohne die Luft anzuhalten</title>
				<link>https://livingit.de/de/software/jj-07-editing-history-without-holding-my-breath/</link>
				<pubDate>Mon, 28 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/de/software/jj-07-editing-history-without-holding-my-breath/</guid>
				<description>&lt;h1 id=&#34;history-bearbeiten-ohne-die-luft-anzuhalten&#34;&gt;History bearbeiten, ohne die Luft anzuhalten&lt;/h1&gt;&#xA;&lt;p&gt;Teil 7 von 9.&lt;/p&gt;&#xA;&lt;p&gt;Die drei Züge, die diese Lektion behandelt, neue Arbeit beginnen, bestehende Arbeit&#xA;bearbeiten, neue Arbeit von einem Punkt in der Vergangenheit aus beginnen, bilden&#xA;Dinge ab, die ich in Git ohnehin ständig getan habe. Der Unterschied ist, wie sehr&#xA;ich mich früher darauf gefasst gemacht habe.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;jj new&lt;/code&gt;, das die aktuelle Arbeitskopie abschließt und eine leere öffnet, ist&#xA;unspektakulär, im Grunde &lt;code&gt;git commit&lt;/code&gt; mit entferntem Staging-Schritt. Der, der&#xA;verändert hat, wie ich arbeite, ist &lt;code&gt;jj edit &amp;lt;change-id&amp;gt;&lt;/code&gt;. Etwas zwei Commits zurück&#xA;zu korrigieren bedeutete früher &lt;code&gt;git rebase -i&lt;/code&gt;, &lt;code&gt;edit&lt;/code&gt; in der richtigen Zeile&#xA;auswählen, die Korrektur machen, &lt;code&gt;git rebase --continue&lt;/code&gt; und hoffen, dass unterwegs&#xA;nichts weiter unten in Konflikt geriet. Mit jj verschiebt &lt;code&gt;jj edit&lt;/code&gt; einfach die&#xA;Arbeitskopie auf diesen Commit. Jede Datei, die ich anfasse, ergänzt ihn direkt.&#xA;Nachfahren werden automatisch rebasiert, sobald jj mir den Graphen das nächste Mal&#xA;zeigen muss. Kein Detached-HEAD-Zustand, kein mehrstufiger Rebase, den man auf halbem&#xA;Weg abbrechen muss, wenn ich meine Meinung ändere, &lt;code&gt;jj undo&lt;/code&gt; deckt das ab.&lt;/p&gt;</description>
			</item>
			<item>
				<title>jj log dazu bringen, über das Remote zu sprechen</title>
				<link>https://livingit.de/de/software/jj-06-a-log-that-tells-me-about-the-remote/</link>
				<pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/de/software/jj-06-a-log-that-tells-me-about-the-remote/</guid>
				<description>&lt;h1 id=&#34;jj-log-dazu-bringen-über-das-remote-zu-sprechen&#34;&gt;jj log dazu bringen, über das Remote zu sprechen&lt;/h1&gt;&#xA;&lt;p&gt;Teil 6 von 9.&lt;/p&gt;&#xA;&lt;p&gt;Was mich &lt;code&gt;jj log&lt;/code&gt; als Alltagswerkzeug vertrauen ließ statt als Spielerei, war zu&#xA;sehen, wie der Remote-Zustand ohne zusätzliche Zeremonie darin auftaucht.&#xA;&lt;code&gt;jj git fetch&lt;/code&gt; aktualisiert jjs Sicht auf jedes Remote-Bookmark, und das&#xA;Standard-Log-Template annotiert Commits bereits mit den Bookmarks, ob lokal, remote&#xA;oder beides, die auf sie zeigen.&lt;/p&gt;&#xA;&lt;p&gt;Die Marker zu lesen brauchte einen Moment der Gewöhnung. &lt;code&gt;main main@origin&lt;/code&gt; in&#xA;derselben Zeile bedeutet, dass das lokale und das Remote-Bookmark derzeit&#xA;übereinstimmen. &lt;code&gt;old-experiment@origin&lt;/code&gt; ohne ein bloßes &lt;code&gt;old-experiment&lt;/code&gt; bedeutet,&#xA;dass es ein Bookmark ist, das niemand lokal hat, nur sichtbar, weil es auf dem Remote&#xA;existiert. Ein Sternchen an einem von beiden bedeutet, dass sie divergiert sind.&lt;/p&gt;</description>
			</item>
			<item>
				<title>jj wie Tokyo Night aussehen lassen</title>
				<link>https://livingit.de/de/software/jj-05-tokyo-night-in-the-terminal/</link>
				<pubDate>Tue, 22 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/de/software/jj-05-tokyo-night-in-the-terminal/</guid>
				<description>&lt;h1 id=&#34;jj-wie-tokyo-night-aussehen-lassen&#34;&gt;jj wie Tokyo Night aussehen lassen&lt;/h1&gt;&#xA;&lt;p&gt;Teil 5 von 9.&lt;/p&gt;&#xA;&lt;p&gt;Das ist die am wenigsten essenzielle Lektion der Serie und die, an der ich das meiste&#xA;unmittelbare Vergnügen hatte. jj liefert keine Theme-Presets, es liefert eine&#xA;&lt;code&gt;[colors]&lt;/code&gt;-Konfigurationstabelle, in der jeder Schlüssel ein Style-Label ist, das an&#xA;getemplatete Ausgabe angehängt ist (&lt;code&gt;change_id&lt;/code&gt;, &lt;code&gt;bookmarks&lt;/code&gt;, &lt;code&gt;conflict&lt;/code&gt; und so&#xA;weiter), und der Wert ein Farbname, ein Hex-String oder eine Tabelle für fett, kursiv,&#xA;unterstrichen. Das ist ein allgemeinerer Mechanismus als ein fester Theme-Schalter,&#xA;zum Preis, das Theme selbst bauen zu müssen.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Repositories forken mit jj</title>
				<link>https://livingit.de/de/software/working-with-forked-repositories/</link>
				<pubDate>Mon, 21 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/de/software/working-with-forked-repositories/</guid>
				<description>&lt;h1 id=&#34;repositories-forken-mit-jj&#34;&gt;Repositories forken mit jj&lt;/h1&gt;&#xA;&lt;p&gt;&amp;ldquo;Fork&amp;rdquo; ist eines der meistgenutzten Wörter in der täglichen Arbeit mit GitHub,&#xA;GitLab, Gitea, Forgejo oder Bitbucket - und es existiert weder in git noch in jj.&#xA;&lt;code&gt;git help&lt;/code&gt; kennt keinen &lt;code&gt;fork&lt;/code&gt;-Befehl, &lt;code&gt;jj help&lt;/code&gt; genauso wenig. Alles, was Forken&#xA;wie eine natürliche Erweiterung der Versionsverwaltung wirken lässt, ist ein&#xA;Feature der Hosting-Plattform, aufgesetzt auf ein Werkzeug, das nur Repositories,&#xA;Commits und Refs kennt - und diese Grenze rührt jj gar nicht erst an. Die&#xA;Beispiele unten nutzen durchgehend jj, im Colocated Mode.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Wie jj darunter tatsächlich gebaut ist</title>
				<link>https://livingit.de/de/software/jj-04-how-jj-is-built/</link>
				<pubDate>Sat, 19 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/de/software/jj-04-how-jj-is-built/</guid>
				<description>&lt;h1 id=&#34;wie-jj-darunter-tatsächlich-gebaut-ist&#34;&gt;Wie jj darunter tatsächlich gebaut ist&lt;/h1&gt;&#xA;&lt;p&gt;Teil 4 von 9.&lt;/p&gt;&#xA;&lt;p&gt;Das mentale Modell aus dem letzten Beitrag (Arbeitskopie als Commit, Change-ID&#xA;getrennt von der Commit-ID) ist die nach außen sichtbare Geschichte. Nachdem ich jjs&#xA;eigene Design-Dokumente und den Quellcode-Aufbau etwas länger als unbedingt nötig&#xA;durchgegangen bin, erklärt die zugrunde liegende Architektur, &lt;em&gt;warum&lt;/em&gt; dieses Modell&#xA;zusammenhält und warum sich der Colocated-Modus nicht anfühlt wie das Betreiben&#xA;zweier zusammengeklebter Versionskontrollsysteme.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Der Commit-Store ist ein austauschbares Backend, und Git ist eine Implementierung&#xA;davon.&lt;/strong&gt; jj definiert seinen eigenen internen Begriff eines Commits, und ein&#xA;Backend-Trait entscheidet, wie das in Bytes auf der Platte verwandelt wird. Das&#xA;Git-Backend ist der Standard und dasjenige, das dieser ganze Kurs verwendet; es&#xA;speichert jjs Commits zufällig als echte Git-Commit-Objekte. Das ist der eigentliche&#xA;Mechanismus hinter &amp;ldquo;alles ist darunter immer noch ein normales Git-Repo&amp;rdquo;, es ist&#xA;keine nachträglich angeschraubte Übersetzungsschicht, es ist der primäre&#xA;Speicherpfad.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Das Vokabular, das jj von Git übernimmt, verändert und weglässt</title>
				<link>https://livingit.de/de/software/jj-vocabulary-vs-git/</link>
				<pubDate>Fri, 18 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/de/software/jj-vocabulary-vs-git/</guid>
				<description>&lt;h1 id=&#34;das-vokabular-das-jj-von-git-übernimmt-verändert-und-weglässt&#34;&gt;Das Vokabular, das jj von Git übernimmt, verändert und weglässt&lt;/h1&gt;&#xA;&lt;p&gt;Die Falle bei &lt;code&gt;jj&lt;/code&gt; ist, dass es mehrere Git-Begriffe für etwas anderes wiederverwendet,&#xA;statt durchgängig neue zu erfinden. Das ist zu Beginn schlimmer als ein sauberer Schnitt&#xA;gewesen wäre: Ein wirklich neues Wort zwingt dazu, nachzuschlagen, ein vertrautes lässt&#xA;einen annehmen, man kenne es schon.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Branch wurde zu Bookmark, und der Unterschied ist nicht kosmetisch.&lt;/strong&gt; Ein Git-Branch&#xA;folgt immer seiner Spitze - committest du darauf, rückt er automatisch mit vor. Ein&#xA;jj-Bookmark tut das nicht; es bleibt dort stehen, wo du es hingesetzt hast, bis du es mit&#xA;&lt;code&gt;jj bookmark set&lt;/code&gt; bewegst. Als ich zum ersten Mal dreimal committete und erwartete, dass&#xA;mein Feature-Bookmark mitwandert, und feststellte, dass es immer noch auf den ersten&#xA;Commit zeigte, hörte das auf, eine Namenskuriosität zu sein, und wurde zu einer Tatsache,&#xA;die ich tatsächlich verinnerlichen musste.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Die Arbeitskopie ist ein Commit</title>
				<link>https://livingit.de/de/software/jj-03-working-copy-as-a-commit/</link>
				<pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/de/software/jj-03-working-copy-as-a-commit/</guid>
				<description>&lt;h1 id=&#34;die-arbeitskopie-ist-ein-commit-und-andere-dinge-die-einen-moment-brauchten-bis-es-klick-machte&#34;&gt;Die Arbeitskopie ist ein Commit, und andere Dinge, die einen Moment brauchten, bis es klick machte&lt;/h1&gt;&#xA;&lt;p&gt;Teil 3 von 9.&lt;/p&gt;&#xA;&lt;p&gt;Gits mentales Modell hat drei Schichten: Arbeitsverzeichnis, Index (Staging-Bereich)&#xA;und Commits. Die meiste alltägliche Reibung, die ich mit Git verbinde, &lt;code&gt;git add -p&lt;/code&gt;,&#xA;das Vergessen, eine Datei zu stagen, &lt;code&gt;git status&lt;/code&gt;, das überlappende &amp;ldquo;staged&amp;rdquo;- und&#xA;&amp;ldquo;unstaged&amp;rdquo;-Abschnitte für dieselbe Datei zeigt, kommt vom Verwalten der Grenze&#xA;zwischen den ersten beiden.&lt;/p&gt;&#xA;&lt;p&gt;jj entfernt diese Grenze. Das Arbeitsverzeichnis ist der Inhalt eines echten Commits,&#xA;adressiert als &lt;code&gt;@&lt;/code&gt;. Jeder Befehl macht zuerst einen Snapshot davon. Es gibt kein&#xA;&lt;code&gt;jj add&lt;/code&gt;. Der Wunsch, &amp;ldquo;manche, aber nicht alle&amp;rdquo; der aktuellen Änderungen zu committen,&#xA;wird von &lt;code&gt;jj split&lt;/code&gt; erledigt, was ein expliziter Akt am Commit selbst ist statt einer&#xA;laufenden Nebenverhandlung mit einem Index.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Colocated-Modus</title>
				<link>https://livingit.de/de/software/jj-02-colocated-mode-first-impressions/</link>
				<pubDate>Sun, 13 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/de/software/jj-02-colocated-mode-first-impressions/</guid>
				<description>&lt;h1 id=&#34;colocated-modus-zwei-speicher-ein-verzeichnis&#34;&gt;Colocated-Modus: zwei Speicher, ein Verzeichnis&lt;/h1&gt;&#xA;&lt;p&gt;Teil 2 von 9.&lt;/p&gt;&#xA;&lt;p&gt;Die Installation selbst ist ein Nicht-Ereignis, ein Paketmanager oder ein&#xA;&lt;code&gt;cargo install&lt;/code&gt;, dann eine &lt;code&gt;user.name&lt;/code&gt;/&lt;code&gt;user.email&lt;/code&gt;-Konfiguration, dieselbe Form wie&#xA;Gits eigenes Erst-Setup. Der interessante Teil beginnt bei &lt;code&gt;jj git init --colocate&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Führe das innerhalb eines bestehenden Git-Checkouts aus, und es legt ein&#xA;&lt;code&gt;.jj&lt;/code&gt;-Verzeichnis neben &lt;code&gt;.git&lt;/code&gt; an, fügt &lt;code&gt;.jj/&lt;/code&gt; zu &lt;code&gt;.git/info/exclude&lt;/code&gt; hinzu, damit es&#xA;nie als untracked auftaucht, und importiert die aktuellen Branches und &lt;code&gt;HEAD&lt;/code&gt; als&#xA;jj-Commits. Nichts in &lt;code&gt;.git&lt;/code&gt; wird umgeschrieben. Wenn ich &lt;code&gt;.jj&lt;/code&gt; jetzt sofort löschte,&#xA;wäre das Repository genau das schlichte Git-Repo, das es vorher war, nichts verloren.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Warum überhaupt einen Blick auf Jujutsu werfen</title>
				<link>https://livingit.de/de/software/jj-01-why-jj/</link>
				<pubDate>Thu, 10 Sep 2026 00:00:00 +0000</pubDate>
				<guid>https://livingit.de/de/software/jj-01-why-jj/</guid>
				<description>&lt;h1 id=&#34;warum-überhaupt-einen-blick-auf-jujutsu-werfen&#34;&gt;Warum überhaupt einen Blick auf Jujutsu werfen&lt;/h1&gt;&#xA;&lt;p&gt;Teil 1 von 9 einer Serie über das Erlernen von &lt;code&gt;jj&lt;/code&gt; im Colocated-Modus.&lt;/p&gt;&#xA;&lt;p&gt;Git funktioniert. Fünfzehn Jahre später ist das Ökosystem drumherum enorm, und jeder&#xA;im Team kennt es bereits. Das ist eine hohe Hürde für alles, was beansprucht, es zu&#xA;ersetzen, und Jujutsu (&lt;code&gt;jj&lt;/code&gt;) versucht gar nicht erst, diese Hürde in einem Sprung zu&#xA;nehmen. Es versucht, auf denselben Git-Repositories aufzusitzen, die alle ohnehin&#xA;schon haben, sodass die Einführung eine persönliche Entscheidung ist statt einer&#xA;Team-Migration.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
