[{"data":1,"prerenderedAt":2792},["ShallowReactive",2],{"/de-de/blog/what-s-new-in-git-2-50-0":3,"navigation-de-de":2009,"banner-de-de":2440,"footer-de-de":2448,"blog-post-authors-de-de-Justin Tobler":2689,"blog-related-posts-de-de-what-s-new-in-git-2-50-0":2704,"blog-promotions-de-de":2728,"next-steps-de-de":2782},{"id":4,"title":5,"authors":6,"body":8,"category":1990,"date":1991,"description":1992,"extension":1993,"externalUrl":1994,"faq":1994,"featured":136,"heroImage":1995,"meta":1996,"navigation":136,"path":1997,"seo":1998,"slug":2001,"stem":2002,"tags":2003,"template":2007,"updatedDate":1994,"__hash__":2008},"blogPosts/de-de/blog/what-s-new-in-git-2-50-0.md","Was gibt es Neues in Git 2.50.0?",[7],"Justin Tobler",{"type":9,"value":10,"toc":1982},"minimark",[11,22,27,36,48,79,82,85,88,99,102,184,193,196,199,202,209,215,218,221,240,243,246,249,252,255,258,261,272,275,278,315,320,323,328,333,336,339,342,345,352,363,378,382,392,399,402,405,408,411,414,719,722,725,728,731,734,744,747,750,758,761,854,860,863,874,877,883,892,896,907,910,916,1102,1105,1108,1111,1117,1165,1168,1173,1176,1186,1189,1196,1207,1213,1216,1261,1264,1267,1270,1273,1276,1284,1290,1293,1296,1299,1306,1315,1319,1322,1332,1335,1338,1346,1349,1352,1361,1364,1367,1374,1377,1380,1383,1386,1389,1392,1398,1401,1408,1411,1417,1424,1428,1435,1438,1441,1448,1451,1461,1464,1467,1473,1481,1484,1492,1909,1912,1915,1918,1921,1924,1927,1930,1933,1939,1948,1952,1955,1958,1967,1975,1978],[12,13,14,15,21],"p",{},"Das Git-Projekt hat kürzlich\n",[16,17,20],"a",{"href":18,"rel":19},"https://lore.kernel.org/git/xmqq1prj1umb.fsf@gitster.g/T/#u",[],"Git Version 2.50.0","\nveröffentlicht. Werfen wir einen Blick auf die Highlights dieser\nVeröffentlichung, die Beiträge des Git-Teams von GitLab und der gesamten\nGit-Community enthält.",[23,24,26],"h2",{"id":25},"neuer-befehl-git-diff-pairs1","Neuer Befehl git-diff-pairs(1)",[12,28,29,30,35],{},"Diffs sind das Herzstück jeder Code Review und zeigen alle Änderungen, die zwischen zwei Revisionen vorgenommen wurden. GitLab zeigt Diffs an verschiedenen Stellen an, am häufigsten aber auf der ",[16,31,34],{"href":32,"rel":33},"https://docs.gitlab.com/user/project/merge_requests/changes/",[],"Registerkarte „Änderungen“ (in englischer Sprache verfügbar)"," eines Merge Requests.",[12,37,38,39,47],{},"Im Hintergrund wird die Diff-Generierung von ",[16,40,43],{"href":41,"rel":42},"https://git-scm.com/docs/git-diff/de",[],[44,45,46],"code",{},"git-diff(1)"," verwendet. Ein Beispiel:",[49,50,55],"pre",{"className":51,"code":52,"language":53,"meta":54,"style":54},"language-shell shiki shiki-themes github-light","$ git diff HEAD~1 HEAD\n","shell","",[44,56,57],{"__ignoreMap":54},[58,59,62,66,70,73,76],"span",{"class":60,"line":61},"line",1,[58,63,65],{"class":64},"s7eDp","$",[58,67,69],{"class":68},"sYBdl"," git",[58,71,72],{"class":68}," diff",[58,74,75],{"class":68}," HEAD~1",[58,77,78],{"class":68}," HEAD\n",[12,80,81],{},"Dieser Befehl gibt das vollständige Diff für alle geänderten Dateien zurück. Dies kann eine Herausforderung für die Skalierbarkeit darstellen, vor allem, wenn die Anzahl der Dateien, die innerhalb einer Reihe von Revisionen geändert wurden, sehr groß ist. Dies kann dazu führen, dass der Befehl selbst auferlegte Zeitlimits für das GitLab-Backend erreicht. Bei großen Änderungen wäre es besser, wenn",[12,83,84],{},"es eine Möglichkeit gäbe, die Diff-Berechnung in kleinere, leichter verarbeitbare Blöcke zu unterteilen.",[12,86,87],{},"Eine Möglichkeit dafür ist die Verwendung von",[12,89,90,98],{},[16,91,94,97],{"href":92,"rel":93},"https://git-scm.com/docs/git-diff-tree",[],[44,95,96],{},"git-diff-tree(1)"," (in englischer Sprache verfügbar)",", um Informationen",[12,100,101],{},"über alle geänderten Dateien abzurufen:",[49,103,105],{"className":51,"code":104,"language":53,"meta":54,"style":54},"$ git diff-tree -r -M --abbrev HEAD~ HEAD\n\n:100644 100644 c9adfed339 99acf81487 M      Documentation/RelNotes/2.50.0.adoc\n\n:100755 100755 1047b8d11d 208e91a17f M      GIT-VERSION-GEN\n",[44,106,107,131,138,159,164],{"__ignoreMap":54},[58,108,109,111,113,116,120,123,126,129],{"class":60,"line":61},[58,110,65],{"class":64},[58,112,69],{"class":68},[58,114,115],{"class":68}," diff-tree",[58,117,119],{"class":118},"sYu0t"," -r",[58,121,122],{"class":118}," -M",[58,124,125],{"class":118}," --abbrev",[58,127,128],{"class":68}," HEAD~",[58,130,78],{"class":68},[58,132,134],{"class":60,"line":133},2,[58,135,137],{"emptyLinePlaceholder":136},true,"\n",[58,139,141,144,147,150,153,156],{"class":60,"line":140},3,[58,142,143],{"class":64},":100644",[58,145,146],{"class":118}," 100644",[58,148,149],{"class":68}," c9adfed339",[58,151,152],{"class":68}," 99acf81487",[58,154,155],{"class":68}," M",[58,157,158],{"class":68},"      Documentation/RelNotes/2.50.0.adoc\n",[58,160,162],{"class":60,"line":161},4,[58,163,137],{"emptyLinePlaceholder":136},[58,165,167,170,173,176,179,181],{"class":60,"line":166},5,[58,168,169],{"class":64},":100755",[58,171,172],{"class":118}," 100755",[58,174,175],{"class":68}," 1047b8d11d",[58,177,178],{"class":68}," 208e91a17f",[58,180,155],{"class":68},[58,182,183],{"class":68},"      GIT-VERSION-GEN\n",[12,185,186,187,192],{},"Git bezeichnet diese Ausgabe als ",[16,188,191],{"href":189,"rel":190},"https://git-scm.com/docs/git-diff-tree#_raw_output_format",[],"„unbearbeitetes“ Format (in englischer Sprache verfügbar)",".",[12,194,195],{},"Kurz gesagt, listet jede Zeile der Ausgabe Dateipaare und die dazugehörigen Metadaten",[12,197,198],{},"darüber auf, was sich zwischen dem Anfangscode und der letzten Revision geändert hat. Im Vergleich zur",[12,200,201],{},"Erzeugung der „Patch“-Ausgabe für große Änderungen verläuft dieser Prozess relativ",[12,203,204,205,208],{},"schnell und liefert eine Zusammenfassung aller Änderungen. Dieser Befehl kann optional eine Umbenennungserkennung durchführen, indem das Flag ",[44,206,207],{},"-M"," angehängt wird. So kannst du überprüfen, ob identifizierte Änderungen auf eine Dateiumbenennung zurückzuführen sind.",[12,210,211,212,214],{},"Mit diesen Informationen könnten wir ",[44,213,46],{}," verwenden, um jedes der",[12,216,217],{},"Dateipaar-Diffs einzeln zu erstellen. Zum Beispiel können wir die Blob-IDs",[12,219,220],{},"direkt angeben:",[49,222,224],{"className":51,"code":223,"language":53,"meta":54,"style":54},"$ git diff 1047b8d11de767d290170979a9a20de1f5692e26 208e91a17f04558ca66bc19d73457ca64d5385f\n",[44,225,226],{"__ignoreMap":54},[58,227,228,230,232,234,237],{"class":60,"line":61},[58,229,65],{"class":64},[58,231,69],{"class":68},[58,233,72],{"class":68},[58,235,236],{"class":68}," 1047b8d11de767d290170979a9a20de1f5692e26",[58,238,239],{"class":68}," 208e91a17f04558ca66bc19d73457ca64d5385f\n",[12,241,242],{},"Wir können diesen Vorgang für jedes der Dateipaare wiederholen, aber es ist nicht sehr effizient, für jede einzelne Datei einen",[12,244,245],{},"separaten Git-Prozess zu starten.",[12,247,248],{},"Außerdem verliert das Diff bei der Verwendung von Blob-IDs einige Kontextinformationen,",[12,250,251],{},"wie den Änderungsstatus und die Dateimodi, die im übergeordneten",[12,253,254],{},"Baumobjekt gespeichert sind. Was wir wirklich möchten, ist ein Mechanismus, um „unbearbeitete“ Dateipaarinformationen einzuspeisen und",[12,256,257],{},"die entsprechende Patch-Ausgabe zu generieren.",[12,259,260],{},"Mit der Version 2.50 bietet Git einen neuen integrierten Befehl mit der Bezeichnung",[12,262,263,271],{},[16,264,267,270],{"href":265,"rel":266},"https://git-scm.com/docs/git-diff-pairs",[],[44,268,269],{},"git-diff-pairs(1)"," (in englischer Sprache verfügbar",". Dieser Befehl",[12,273,274],{},"akzeptiert „unbearbeitete“ formatierte Dateipaarinformationen als Eingabe auf stdin, um exakt zu bestimmen, welche Patches ausgegeben werden sollen. Das folgende Beispiel zeigt, wie dieser Befehl",[12,276,277],{},"verwendet werden kann:",[49,279,281],{"className":51,"code":280,"language":53,"meta":54,"style":54},"$ git diff-tree -r -z -M HEAD~ HEAD | git diff-pairs -z\n",[44,282,283],{"__ignoreMap":54},[58,284,285,287,289,291,293,296,298,300,303,307,309,312],{"class":60,"line":61},[58,286,65],{"class":64},[58,288,69],{"class":68},[58,290,115],{"class":68},[58,292,119],{"class":118},[58,294,295],{"class":118}," -z",[58,297,122],{"class":118},[58,299,128],{"class":68},[58,301,302],{"class":68}," HEAD",[58,304,306],{"class":305},"sD7c4"," |",[58,308,69],{"class":64},[58,310,311],{"class":68}," diff-pairs",[58,313,314],{"class":118}," -z\n",[12,316,317,318,192],{},"Bei dieser Nutzung ist die resultierende Ausgabe identisch mit der Verwendung von ",[44,319,46],{},[12,321,322],{},"Durch einen separaten Befehl zur Generierung der Patch-Ausgabe kann die „unbearbeitete“ Ausgabe von",[12,324,325,327],{},[44,326,96],{}," in kleinere Chargen von Dateipaaren aufgeteilt und separaten",[12,329,330,332],{},[44,331,269],{},"-Prozessen zugeführt werden. Dies löst das zuvor erwähnte",[12,334,335],{},"Skalierbarkeitsproblem, da die Diffs nicht länger alle auf einmal berechnet werden müssen. Zukünftige",[12,337,338],{},"GitLab-Versionen könnten auf diesem Mechanismus aufbauen, um die Leistung der",[12,340,341],{},"Diff-Generierung zu verbessern, insbesondere wenn es sich um große Änderungssätze",[12,343,344],{},"handelt. Weitere Informationen zu dieser Änderung findest du im entsprechenden",[12,346,347,192],{},[16,348,351],{"href":349,"rel":350},"https://lore.kernel.org/git/20250228213346.1335224-1-jltobler@gmail.com/",[],"Mailinglisten-Thread",[12,353,354],{},[355,356,357,358,362],"em",{},"Dieses Projekt wurde von ",[16,359,7],{"href":360,"rel":361},"https://gitlab.com/justintobler",[]," geleitet.",[364,365,366],"blockquote",{},[12,367,368,372,373],{},[369,370,371],"strong",{},"Über 6,4 Mio. Builds pro Monat: So transformiert Siemens seine Softwareentwicklung mit GitLab"," Über 40.000 Entwickler(innen) bei Siemens nutzen GitLab, um weltweit zusammenzuarbeiten und jeden Monat mehr als 6,4 Millionen Software-Versionen automatisch bereitzustellen. Erfahre, wie eine offene DevOps-Kultur und eine zentrale Plattform die Effizienz und Sicherheit steigern. ",[16,374,377],{"href":375,"rel":376},"https://about.gitlab.com/de-de/customers/siemens/",[],"Erfolgsstory lesen",[23,379,381],{"id":380},"gesammelte-referenz-updates","Gesammelte Referenz-Updates",[12,383,384,385],{},"Mit dem Git-Befehl ",[16,386,389,97],{"href":387,"rel":388},"https://git-scm.com/docs/git-update-ref",[],[44,390,391],{},"git-update-ref(1)",[12,393,394,395,398],{},"kannst du Referenzaktualisierungen durchführen. Bei Verwendung mit dem Flag ",[44,396,397],{},"--stdin"," können",[12,400,401],{},"mehrere Referenzaktualisierungen in einer einzigen Transaktion gebündelt werden, indem Anweisungen für jede Referenzaktualisierung",[12,403,404],{},"angegeben werden, die auf stdin durchgeführt werden soll.",[12,406,407],{},"Die Massenaktualisierung von Referenzen auf diese Weise zeigt auch ein atomares Verhalten, bei dem ein",[12,409,410],{},"einzelner Fehler bei der Referenzaktualisierung eine Transaktion abbricht und",[12,412,413],{},"Referenzen nicht aktualisiert werden. Hier ist ein Beispiel für dieses Verhalten:",[49,415,417],{"className":51,"code":416,"language":53,"meta":54,"style":54},"# Erstelle ein Repository mit drei leeren Commits und einem Branch mit dem Namen „foo“\n\n$ git init\n\n$ git commit --allow-empty -m 1\n\n$ git commit --allow-empty -m 2\n\n$ git commit --allow-empty -m 3\n\n$ git branch foo\n\n\n# Gib die Commit-IDs aus\n\n$ git rev-list HEAD\n\ncf469bdf5436ea1ded57670b5f5a0797f72f1afc\n\n5a74cd330f04b96ce0666af89682d4d7580c354c\n\n5a6b339a8ebffde8c0590553045403dbda831518\n\n\n# Versuche, eine neue Referenz zu erstellen und die vorhandene Referenz in der Transaktion zu aktualisieren.\n\n# Es wird erwartet, dass die Aktualisierung fehlschlägt, da die angegebene alte Objekt-ID nicht richtig ist.\n\n$ git update-ref --stdin \u003C\u003CEOF\n\n> create refs/heads/bar cf469bdf5436ea1ded57670b5f5a0797f72f1afc\n\n> update refs/heads/foo 5a6b339a8ebffde8c0590553045403dbda831518 5a74cd330f04b96ce0666af89682d4d7580c354c\n\n> EOF\n\nfatal: cannot lock ref 'refs/heads/foo': is at cf469bdf5436ea1ded57670b5f5a0797f72f1afc but expected 5a74cd330f04b96ce0666af89682d4d7580c354c\n\n\n# Die Referenz „bar“ wurde nicht erstellt.\n\n$ git switch bar\n\nfatal: invalid reference: bar\n",[44,418,419,425,429,438,442,460,465,481,486,502,507,520,525,530,536,541,553,558,564,569,575,580,586,591,596,602,607,613,618,637,642,648,653,659,664,670,675,681,686,691,697,702,708,713],{"__ignoreMap":54},[58,420,421],{"class":60,"line":61},[58,422,424],{"class":423},"sAwPA","# Erstelle ein Repository mit drei leeren Commits und einem Branch mit dem Namen „foo“\n",[58,426,427],{"class":60,"line":133},[58,428,137],{"emptyLinePlaceholder":136},[58,430,431,433,435],{"class":60,"line":140},[58,432,65],{"class":64},[58,434,69],{"class":68},[58,436,437],{"class":68}," init\n",[58,439,440],{"class":60,"line":161},[58,441,137],{"emptyLinePlaceholder":136},[58,443,444,446,448,451,454,457],{"class":60,"line":166},[58,445,65],{"class":64},[58,447,69],{"class":68},[58,449,450],{"class":68}," commit",[58,452,453],{"class":118}," --allow-empty",[58,455,456],{"class":118}," -m",[58,458,459],{"class":118}," 1\n",[58,461,463],{"class":60,"line":462},6,[58,464,137],{"emptyLinePlaceholder":136},[58,466,468,470,472,474,476,478],{"class":60,"line":467},7,[58,469,65],{"class":64},[58,471,69],{"class":68},[58,473,450],{"class":68},[58,475,453],{"class":118},[58,477,456],{"class":118},[58,479,480],{"class":118}," 2\n",[58,482,484],{"class":60,"line":483},8,[58,485,137],{"emptyLinePlaceholder":136},[58,487,489,491,493,495,497,499],{"class":60,"line":488},9,[58,490,65],{"class":64},[58,492,69],{"class":68},[58,494,450],{"class":68},[58,496,453],{"class":118},[58,498,456],{"class":118},[58,500,501],{"class":118}," 3\n",[58,503,505],{"class":60,"line":504},10,[58,506,137],{"emptyLinePlaceholder":136},[58,508,510,512,514,517],{"class":60,"line":509},11,[58,511,65],{"class":64},[58,513,69],{"class":68},[58,515,516],{"class":68}," branch",[58,518,519],{"class":68}," foo\n",[58,521,523],{"class":60,"line":522},12,[58,524,137],{"emptyLinePlaceholder":136},[58,526,528],{"class":60,"line":527},13,[58,529,137],{"emptyLinePlaceholder":136},[58,531,533],{"class":60,"line":532},14,[58,534,535],{"class":423},"# Gib die Commit-IDs aus\n",[58,537,539],{"class":60,"line":538},15,[58,540,137],{"emptyLinePlaceholder":136},[58,542,544,546,548,551],{"class":60,"line":543},16,[58,545,65],{"class":64},[58,547,69],{"class":68},[58,549,550],{"class":68}," rev-list",[58,552,78],{"class":68},[58,554,556],{"class":60,"line":555},17,[58,557,137],{"emptyLinePlaceholder":136},[58,559,561],{"class":60,"line":560},18,[58,562,563],{"class":64},"cf469bdf5436ea1ded57670b5f5a0797f72f1afc\n",[58,565,567],{"class":60,"line":566},19,[58,568,137],{"emptyLinePlaceholder":136},[58,570,572],{"class":60,"line":571},20,[58,573,574],{"class":64},"5a74cd330f04b96ce0666af89682d4d7580c354c\n",[58,576,578],{"class":60,"line":577},21,[58,579,137],{"emptyLinePlaceholder":136},[58,581,583],{"class":60,"line":582},22,[58,584,585],{"class":64},"5a6b339a8ebffde8c0590553045403dbda831518\n",[58,587,589],{"class":60,"line":588},23,[58,590,137],{"emptyLinePlaceholder":136},[58,592,594],{"class":60,"line":593},24,[58,595,137],{"emptyLinePlaceholder":136},[58,597,599],{"class":60,"line":598},25,[58,600,601],{"class":423},"# Versuche, eine neue Referenz zu erstellen und die vorhandene Referenz in der Transaktion zu aktualisieren.\n",[58,603,605],{"class":60,"line":604},26,[58,606,137],{"emptyLinePlaceholder":136},[58,608,610],{"class":60,"line":609},27,[58,611,612],{"class":423},"# Es wird erwartet, dass die Aktualisierung fehlschlägt, da die angegebene alte Objekt-ID nicht richtig ist.\n",[58,614,616],{"class":60,"line":615},28,[58,617,137],{"emptyLinePlaceholder":136},[58,619,621,623,625,628,631,634],{"class":60,"line":620},29,[58,622,65],{"class":64},[58,624,69],{"class":68},[58,626,627],{"class":68}," update-ref",[58,629,630],{"class":118}," --stdin",[58,632,633],{"class":305}," \u003C\u003C",[58,635,636],{"class":68},"EOF\n",[58,638,640],{"class":60,"line":639},30,[58,641,137],{"emptyLinePlaceholder":136},[58,643,645],{"class":60,"line":644},31,[58,646,647],{"class":68},"> create refs/heads/bar cf469bdf5436ea1ded57670b5f5a0797f72f1afc\n",[58,649,651],{"class":60,"line":650},32,[58,652,137],{"emptyLinePlaceholder":136},[58,654,656],{"class":60,"line":655},33,[58,657,658],{"class":68},"> update refs/heads/foo 5a6b339a8ebffde8c0590553045403dbda831518 5a74cd330f04b96ce0666af89682d4d7580c354c\n",[58,660,662],{"class":60,"line":661},34,[58,663,137],{"emptyLinePlaceholder":136},[58,665,667],{"class":60,"line":666},35,[58,668,669],{"class":68},"> EOF\n",[58,671,673],{"class":60,"line":672},36,[58,674,137],{"emptyLinePlaceholder":136},[58,676,678],{"class":60,"line":677},37,[58,679,680],{"class":68},"fatal: cannot lock ref 'refs/heads/foo': is at cf469bdf5436ea1ded57670b5f5a0797f72f1afc but expected 5a74cd330f04b96ce0666af89682d4d7580c354c\n",[58,682,684],{"class":60,"line":683},38,[58,685,137],{"emptyLinePlaceholder":136},[58,687,689],{"class":60,"line":688},39,[58,690,137],{"emptyLinePlaceholder":136},[58,692,694],{"class":60,"line":693},40,[58,695,696],{"class":68},"# Die Referenz „bar“ wurde nicht erstellt.\n",[58,698,700],{"class":60,"line":699},41,[58,701,137],{"emptyLinePlaceholder":136},[58,703,705],{"class":60,"line":704},42,[58,706,707],{"class":68},"$ git switch bar\n",[58,709,711],{"class":60,"line":710},43,[58,712,137],{"emptyLinePlaceholder":136},[58,714,716],{"class":60,"line":715},44,[58,717,718],{"class":68},"fatal: invalid reference: bar\n",[12,720,721],{},"Im Vergleich zur einzelnen Aktualisierung vieler Referenzen ist die Massenaktualisierung",[12,723,724],{},"auch viel effizienter. Das ist zwar grundsätzlich eine gute Lösung, aber es kann bestimmte",[12,726,727],{},"Umstände geben, unter denen es akzeptabel ist, wenn ein Teil der angeforderten Referenzaktualisierungen",[12,729,730],{},"fehlschlägt, wir aber dennoch die Effizienzvorteile von",[12,732,733],{},"Massenaktualisierungen nutzen möchten.",[12,735,736,737,739,740,743],{},"Ab dieser Version verfügt ",[44,738,391],{}," über die neue Option ",[44,741,742],{},"--batch-updates",", mit",[12,745,746],{},"der die Aktualisierungen auch dann fortgesetzt werden können, wenn eine oder mehrere Referenzaktualisierungen",[12,748,749],{},"fehlschlagen. In diesem Modus werden einzelne Fehler im folgenden Format gemeldet:",[49,751,756],{"className":752,"code":754,"language":755,"meta":54},[753],"language-text","rejected SP (\u003Cold-oid> | \u003Cold-target>) SP (\u003Cnew-oid> | \u003Cnew-target>) SP \u003Crejection-reason> LF\n","text",[44,757,754],{"__ignoreMap":54},[12,759,760],{},"Dadurch können erfolgreiche Referenzaktualisierungen fortgesetzt werden, während gleichzeitig angegeben wird, unter welchen Umständen Aktualisierungen abgelehnt wurden und aus welchem Grund. Wir verwenden noch einmal das gleiche beispielhafte Repository wie im vorherigen Beispiel:",[49,762,764],{"className":51,"code":763,"language":53,"meta":54,"style":54},"# Versuche, eine neue Referenz zu erstellen und die vorhandene Referenz in der Transaktion zu aktualisieren.\n\n$ git update-ref --stdin --batch-updates \u003C\u003CEOF\n\n> create refs/heads/bar cf469bdf5436ea1ded57670b5f5a0797f72f1afc\n\n> update refs/heads/foo 5a6b339a8ebffde8c0590553045403dbda831518 5a74cd330f04b96ce0666af89682d4d7580c354c\n\n> EOF\n\nrejected refs/heads/foo 5a6b339a8ebffde8c0590553045403dbda831518 5a74cd330f04b96ce0666af89682d4d7580c354c incorrect old value provided\n\n\n# Die Referenz „bar“ wurde erstellt, obwohl die Aktualisierung auf „foo“ abgelehnt wurde.\n\n$ git switch bar\n\nSwitched to branch 'bar'\n",[44,765,766,770,774,791,795,799,803,807,811,815,819,824,828,832,837,841,845,849],{"__ignoreMap":54},[58,767,768],{"class":60,"line":61},[58,769,601],{"class":423},[58,771,772],{"class":60,"line":133},[58,773,137],{"emptyLinePlaceholder":136},[58,775,776,778,780,782,784,787,789],{"class":60,"line":140},[58,777,65],{"class":64},[58,779,69],{"class":68},[58,781,627],{"class":68},[58,783,630],{"class":118},[58,785,786],{"class":118}," --batch-updates",[58,788,633],{"class":305},[58,790,636],{"class":68},[58,792,793],{"class":60,"line":161},[58,794,137],{"emptyLinePlaceholder":136},[58,796,797],{"class":60,"line":166},[58,798,647],{"class":68},[58,800,801],{"class":60,"line":462},[58,802,137],{"emptyLinePlaceholder":136},[58,804,805],{"class":60,"line":467},[58,806,658],{"class":68},[58,808,809],{"class":60,"line":483},[58,810,137],{"emptyLinePlaceholder":136},[58,812,813],{"class":60,"line":488},[58,814,669],{"class":68},[58,816,817],{"class":60,"line":504},[58,818,137],{"emptyLinePlaceholder":136},[58,820,821],{"class":60,"line":509},[58,822,823],{"class":68},"rejected refs/heads/foo 5a6b339a8ebffde8c0590553045403dbda831518 5a74cd330f04b96ce0666af89682d4d7580c354c incorrect old value provided\n",[58,825,826],{"class":60,"line":522},[58,827,137],{"emptyLinePlaceholder":136},[58,829,830],{"class":60,"line":527},[58,831,137],{"emptyLinePlaceholder":136},[58,833,834],{"class":60,"line":532},[58,835,836],{"class":68},"# Die Referenz „bar“ wurde erstellt, obwohl die Aktualisierung auf „foo“ abgelehnt wurde.\n",[58,838,839],{"class":60,"line":538},[58,840,137],{"emptyLinePlaceholder":136},[58,842,843],{"class":60,"line":543},[58,844,707],{"class":68},[58,846,847],{"class":60,"line":555},[58,848,137],{"emptyLinePlaceholder":136},[58,850,851],{"class":60,"line":560},[58,852,853],{"class":68},"Switched to branch 'bar'\n",[12,855,856,857,859],{},"Mit der Option ",[44,858,742],{}," war die Referenzerstellung diesmal erfolgreich,",[12,861,862],{},"obwohl die Aktualisierung nicht funktioniert hat. Diese Patch-Serie legt den Grundstein für",[12,864,865,866,869,870,873],{},"zukünftige Leistungsverbesserungen in ",[44,867,868],{},"git-fetch(1)"," und ",[44,871,872],{},"git-receive-pack(1)",",",[12,875,876],{},"wenn Referenzen in großer Zahl aktualisiert werden. Weitere Informationen findest du im",[12,878,879],{},[16,880,351],{"href":881,"rel":882},"https://lore.kernel.org/git/20250408085120.614893-1-karthik.188@gmail.com/",[],[12,884,885],{},[355,886,357,887,362],{},[16,888,891],{"href":889,"rel":890},"https://gitlab.com/knayakgl",[],"Karthik Nayak",[23,893,895],{"id":894},"neue-filteroption-für-git-cat-file1","Neue Filteroption für git-cat-file(1)",[12,897,898,899,906],{},"Mit ",[16,900,903,97],{"href":901,"rel":902},"https://git-scm.com/docs/git-cat-file",[],[44,904,905],{},"git-cat-file(1)"," ist es möglich,",[12,908,909],{},"Informationen für alle im Repository enthaltenen Objekte über die Option",[12,911,912,915],{},[44,913,914],{},"--batch–all-objects"," auszugeben. Zum Beispiel:",[49,917,919],{"className":51,"code":918,"language":53,"meta":54,"style":54},"# Richte ein einfaches Repository ein.\n\n$ git init\n\n$ echo foo >foo\n\n$ git add foo\n\n$ git commit -m init\n\n\n# Erstelle ein nicht erreichbares Objekt.\n\n$ git commit --amend --no-edit\n\n\n# Verwende git-cat-file(1), um Informationen über alle Objekte einschließlich nicht erreichbarer Objekte auszugeben.\n\n$ git cat-file --batch-all-objects --batch-check='%(objecttype) %(objectname)'\n\ncommit 0b07e71d14897f218f23d9a6e39605b466454ece\n\ntree 205f6b799e7d5c2524468ca006a0131aa57ecce7\n\nblob 257cc5642cb1a054f08cc83f2d943e56fd3ebe99\n\ncommit c999f781fd7214b3caab82f560ffd079ddad0115\n",[44,920,921,926,930,938,942,958,962,973,977,989,993,997,1002,1006,1020,1024,1028,1033,1037,1055,1059,1067,1071,1079,1083,1091,1095],{"__ignoreMap":54},[58,922,923],{"class":60,"line":61},[58,924,925],{"class":423},"# Richte ein einfaches Repository ein.\n",[58,927,928],{"class":60,"line":133},[58,929,137],{"emptyLinePlaceholder":136},[58,931,932,934,936],{"class":60,"line":140},[58,933,65],{"class":64},[58,935,69],{"class":68},[58,937,437],{"class":68},[58,939,940],{"class":60,"line":161},[58,941,137],{"emptyLinePlaceholder":136},[58,943,944,946,949,952,955],{"class":60,"line":166},[58,945,65],{"class":64},[58,947,948],{"class":68}," echo",[58,950,951],{"class":68}," foo",[58,953,954],{"class":305}," >",[58,956,957],{"class":68},"foo\n",[58,959,960],{"class":60,"line":462},[58,961,137],{"emptyLinePlaceholder":136},[58,963,964,966,968,971],{"class":60,"line":467},[58,965,65],{"class":64},[58,967,69],{"class":68},[58,969,970],{"class":68}," add",[58,972,519],{"class":68},[58,974,975],{"class":60,"line":483},[58,976,137],{"emptyLinePlaceholder":136},[58,978,979,981,983,985,987],{"class":60,"line":488},[58,980,65],{"class":64},[58,982,69],{"class":68},[58,984,450],{"class":68},[58,986,456],{"class":118},[58,988,437],{"class":68},[58,990,991],{"class":60,"line":504},[58,992,137],{"emptyLinePlaceholder":136},[58,994,995],{"class":60,"line":509},[58,996,137],{"emptyLinePlaceholder":136},[58,998,999],{"class":60,"line":522},[58,1000,1001],{"class":423},"# Erstelle ein nicht erreichbares Objekt.\n",[58,1003,1004],{"class":60,"line":527},[58,1005,137],{"emptyLinePlaceholder":136},[58,1007,1008,1010,1012,1014,1017],{"class":60,"line":532},[58,1009,65],{"class":64},[58,1011,69],{"class":68},[58,1013,450],{"class":68},[58,1015,1016],{"class":118}," --amend",[58,1018,1019],{"class":118}," --no-edit\n",[58,1021,1022],{"class":60,"line":538},[58,1023,137],{"emptyLinePlaceholder":136},[58,1025,1026],{"class":60,"line":543},[58,1027,137],{"emptyLinePlaceholder":136},[58,1029,1030],{"class":60,"line":555},[58,1031,1032],{"class":423},"# Verwende git-cat-file(1), um Informationen über alle Objekte einschließlich nicht erreichbarer Objekte auszugeben.\n",[58,1034,1035],{"class":60,"line":560},[58,1036,137],{"emptyLinePlaceholder":136},[58,1038,1039,1041,1043,1046,1049,1052],{"class":60,"line":566},[58,1040,65],{"class":64},[58,1042,69],{"class":68},[58,1044,1045],{"class":68}," cat-file",[58,1047,1048],{"class":118}," --batch-all-objects",[58,1050,1051],{"class":118}," --batch-check=",[58,1053,1054],{"class":68},"'%(objecttype) %(objectname)'\n",[58,1056,1057],{"class":60,"line":571},[58,1058,137],{"emptyLinePlaceholder":136},[58,1060,1061,1064],{"class":60,"line":577},[58,1062,1063],{"class":64},"commit",[58,1065,1066],{"class":68}," 0b07e71d14897f218f23d9a6e39605b466454ece\n",[58,1068,1069],{"class":60,"line":582},[58,1070,137],{"emptyLinePlaceholder":136},[58,1072,1073,1076],{"class":60,"line":588},[58,1074,1075],{"class":64},"tree",[58,1077,1078],{"class":68}," 205f6b799e7d5c2524468ca006a0131aa57ecce7\n",[58,1080,1081],{"class":60,"line":593},[58,1082,137],{"emptyLinePlaceholder":136},[58,1084,1085,1088],{"class":60,"line":598},[58,1086,1087],{"class":64},"blob",[58,1089,1090],{"class":68}," 257cc5642cb1a054f08cc83f2d943e56fd3ebe99\n",[58,1092,1093],{"class":60,"line":604},[58,1094,137],{"emptyLinePlaceholder":136},[58,1096,1097,1099],{"class":60,"line":609},[58,1098,1063],{"class":64},[58,1100,1101],{"class":68}," c999f781fd7214b3caab82f560ffd079ddad0115\n",[12,1103,1104],{},"In einigen Situationen möchte ein(e) Benutzer(in) möglicherweise alle Objekte im",[12,1106,1107],{},"Repository durchsuchen, aber nur eine Teilmenge basierend auf einem bestimmten Attribut ausgeben. Wenn",[12,1109,1110],{},"wir beispielsweise nur die Objekte anzeigen möchten, die Commits sind, könnten wir",[12,1112,1113,1116],{},[44,1114,1115],{},"grep(1)"," verwenden:",[49,1118,1120],{"className":51,"code":1119,"language":53,"meta":54,"style":54},"$ git cat-file --batch-all-objects --batch-check='%(objecttype) %(objectname)' | grep ^commit\n\ncommit 0b07e71d14897f218f23d9a6e39605b466454ece\n\ncommit c999f781fd7214b3caab82f560ffd079ddad0115\n",[44,1121,1122,1145,1149,1155,1159],{"__ignoreMap":54},[58,1123,1124,1126,1128,1130,1132,1134,1137,1139,1142],{"class":60,"line":61},[58,1125,65],{"class":64},[58,1127,69],{"class":68},[58,1129,1045],{"class":68},[58,1131,1048],{"class":118},[58,1133,1051],{"class":118},[58,1135,1136],{"class":68},"'%(objecttype) %(objectname)'",[58,1138,306],{"class":305},[58,1140,1141],{"class":64}," grep",[58,1143,1144],{"class":68}," ^commit\n",[58,1146,1147],{"class":60,"line":133},[58,1148,137],{"emptyLinePlaceholder":136},[58,1150,1151,1153],{"class":60,"line":140},[58,1152,1063],{"class":64},[58,1154,1066],{"class":68},[58,1156,1157],{"class":60,"line":161},[58,1158,137],{"emptyLinePlaceholder":136},[58,1160,1161,1163],{"class":60,"line":166},[58,1162,1063],{"class":64},[58,1164,1101],{"class":68},[12,1166,1167],{},"Das funktioniert zwar, aber ein Nachteil beim Filtern der Ausgabe ist, dass",[12,1169,1170,1172],{},[44,1171,905],{}," nach wie vor alle Objekte im Repository durchlaufen muss, auch",[12,1174,1175],{},"diejenigen, an denen wir nicht interessiert sind. Dies kann ziemlich ineffizient sein.",[12,1177,1178,1179,1181,1182,1185],{},"Mit dieser Version verfügt ",[44,1180,905],{}," jetzt über die Option ",[44,1183,1184],{},"--filter",", die nur jene Objekte",[12,1187,1188],{},"anzeigt, die den angegebenen Kriterien entsprechen. Dies ähnelt der gleichnamigen Option",[12,1190,1191,1192,1195],{},"für ",[44,1193,1194],{},"git-rev-list(1)",", unterstützt jedoch nur eine Teilmenge der",[12,1197,1198,1199,1202,1203,1206],{},"Filter. Die folgenden Filter werden unterstützt: ",[44,1200,1201],{},"blob:none",", ",[44,1204,1205],{},"blob:limit="," und",[12,1208,1209,1212],{},[44,1210,1211],{},"object:type=",". Ähnlich wie im vorherigen Beispiel können Objekte mit Git direkt nach",[12,1214,1215],{},"ihrem Typ gefiltert werden:",[49,1217,1219],{"className":51,"code":1218,"language":53,"meta":54,"style":54},"$ git cat-file --batch-all-objects --batch-check='%(objecttype) %(objectname)' --filter='object:type=commit'\n\ncommit 0b07e71d14897f218f23d9a6e39605b466454ece\n\ncommit c999f781fd7214b3caab82f560ffd079ddad0115\n",[44,1220,1221,1241,1245,1251,1255],{"__ignoreMap":54},[58,1222,1223,1225,1227,1229,1231,1233,1235,1238],{"class":60,"line":61},[58,1224,65],{"class":64},[58,1226,69],{"class":68},[58,1228,1045],{"class":68},[58,1230,1048],{"class":118},[58,1232,1051],{"class":118},[58,1234,1136],{"class":68},[58,1236,1237],{"class":118}," --filter=",[58,1239,1240],{"class":68},"'object:type=commit'\n",[58,1242,1243],{"class":60,"line":133},[58,1244,137],{"emptyLinePlaceholder":136},[58,1246,1247,1249],{"class":60,"line":140},[58,1248,1063],{"class":64},[58,1250,1066],{"class":68},[58,1252,1253],{"class":60,"line":161},[58,1254,137],{"emptyLinePlaceholder":136},[58,1256,1257,1259],{"class":60,"line":166},[58,1258,1063],{"class":64},[58,1260,1101],{"class":68},[12,1262,1263],{},"Es ist nicht nur praktisch, dass Git die Verarbeitung übernimmt, sondern bei großen",[12,1265,1266],{},"Repositories mit vielen Objekten ist dies möglicherweise auch effizienter. Wenn ein",[12,1268,1269],{},"Repository über Bitmap-Indizes verfügt, kann Git Objekte eines bestimmten Typs effizient",[12,1271,1272],{},"nachschlagen und so das Durchsuchen der",[12,1274,1275],{},"Paketierungsdatei vermeiden, wodurch die Geschwindigkeit deutlich erhöht wird. Benchmarks, die im",[12,1277,1278,1283],{},[16,1279,1282],{"href":1280,"rel":1281},"https://github.com/chromium/chromium.git",[],"Chromium-Repository"," durchgeführt wurden, zeigen signifikante Verbesserungen:",[49,1285,1288],{"className":1286,"code":1287,"language":755,"meta":54},[753],"Benchmark 1: git cat-file --batch-check --batch-all-objects --unordered --buffer --no-filter Time (mean ± σ):     82.806 s ±  6.363 s    [User: 30.956 s, System: 8.264 s] Range (min … max):   73.936 s … 89.690 s    10 runs\n\nBenchmark 2: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=tag Time (mean ± σ):      20.8 ms ±   1.3 ms    [User: 6.1 ms, System: 14.5 ms] Range (min … max):    18.2 ms …  23.6 ms    127 runs\n\nBenchmark 3: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=commit Time (mean ± σ):      1.551 s ±  0.008 s    [User: 1.401 s, System: 0.147 s] Range (min … max):    1.541 s …  1.566 s    10 runs\n\nBenchmark 4: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=tree Time (mean ± σ):     11.169 s ±  0.046 s    [User: 10.076 s, System: 1.063 s] Range (min … max):   11.114 s … 11.245 s    10 runs\n\nBenchmark 5: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=blob Time (mean ± σ):     67.342 s ±  3.368 s    [User: 20.318 s, System: 7.787 s] Range (min … max):   62.836 s … 73.618 s    10 runs\n\nBenchmark 6: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=blob:none Time (mean ± σ):     13.032 s ±  0.072 s    [User: 11.638 s, System: 1.368 s] Range (min … max):   12.960 s … 13.199 s    10 runs\n\nSummary git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=tag 74.75 ± 4.61 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=commit 538.17 ± 33.17 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=tree 627.98 ± 38.77 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=blob:none 3244.93 ± 257.23 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=blob 3990.07 ± 392.72 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --no-filter\n",[44,1289,1287],{"__ignoreMap":54},[12,1291,1292],{},"Interessanterweise zeigen diese Ergebnisse, dass die Berechnungszeit jetzt mit",[12,1294,1295],{},"der Anzahl der Objekte für einen bestimmten Typ skaliert, anstatt mit der Anzahl der gesamten Objekte",[12,1297,1298],{},"in der Paketierungsdatei. Den ursprünglichen (englischsprachigen) Mailinglisten-Thread findest du",[12,1300,1301,192],{},[16,1302,1305],{"href":1303,"rel":1304},"https://lore.kernel.org/git/20250221-pks-cat-file-object-type-filter-v1-0-0852530888e2@pks.im/",[],"hier",[12,1307,1308],{},[355,1309,357,1310,362],{},[16,1311,1314],{"href":1312,"rel":1313},"https://gitlab.com/pks-gitlab",[],"Patrick Steinhardt",[23,1316,1318],{"id":1317},"verbesserte-leistung-beim-generieren-von-bundles","Verbesserte Leistung beim Generieren von Bundles",[12,1320,1321],{},"Git bietet die Möglichkeit, über den Befehl",[12,1323,1324,1331],{},[16,1325,1328,97],{"href":1326,"rel":1327},"https://git-scm.com/docs/git-bundle",[],[44,1329,1330],{},"git-bundle(1)"," ein Archiv eines Repositories zu generieren, das einen",[12,1333,1334],{},"bestimmten Satz von Referenzen und zugehörigen erreichbaren Objekten enthält. Dieser Vorgang",[12,1336,1337],{},"wird von GitLab verwendet, um Repository-Backups zu erstellen, und ist auch ein Teil des",[12,1339,1340,1345],{},[16,1341,1344],{"href":1342,"rel":1343},"https://git-scm.com/docs/bundle-uri",[],"Bundle-URI (in englischer Sprache verfügbar)","-Mechanismus.",[12,1347,1348],{},"Bei großen Repositories mit Millionen von Referenzen kann dieser Vorgang Stunden oder sogar Tage",[12,1350,1351],{},"dauern. Zum Beispiel lagen die Backup-Zeiten für das Haupt-GitLab-Repository",[12,1353,1354,1355,1360],{},"(",[16,1356,1359],{"href":1357,"rel":1358},"https://gitlab.com/gitlab-org/gitlab",[],"gitlab-org/gitlab","), bei",[12,1362,1363],{},"etwa 48 Stunden. Die Untersuchung zeigte einen Leistungsengpass, der",[12,1365,1366],{},"auf die Art zurückzuführen war, wie Git eine Überprüfung durchführte, um zu vermeiden, dass doppelte Referenzen",[12,1368,1369,1370,1373],{},"in das Bundle aufgenommen wurden. Die Implementierung verwendete eine verschachtelte ",[44,1371,1372],{},"for","-Schleife, um alle aufgelisteten Referenzen zu durchlaufen und zu",[12,1375,1376],{},"vergleichen, was zu einer Zeitkomplexität von O(N^2) führte. Die Skalierbarkeit",[12,1378,1379],{},"ist sehr schlecht, wenn die Anzahl der Referenzen in einem Repository zunimmt.",[12,1381,1382],{},"In dieser Version wurde dieses Problem behoben, indem die verschachtelten Schleifen durch eine",[12,1384,1385],{},"Datenzuordnungsstruktur ersetzt wurden, was die Geschwindigkeit erheblich erhöht. Der folgende Benchmark zeigt",[12,1387,1388],{},"die Leistungssteigerung beim Erstellen eines Bundles mit einem Repository, das",[12,1390,1391],{},"100 000 Referenzen enthält:",[49,1393,1396],{"className":1394,"code":1395,"language":755,"meta":54},[753],"Benchmark 1: bundle (refcount = 100000, revision = master) Time (mean ± σ):     14.653 s ±  0.203 s    [User: 13.940 s, System: 0.762 s] Range (min … max):   14.237 s … 14.920 s    10 runs\n\nBenchmark 2: bundle (refcount = 100000, revision = HEAD) Time (mean ± σ):      2.394 s ±  0.023 s    [User: 1.684 s, System: 0.798 s] Range (min … max):    2.364 s …  2.425 s    10 runs\n\nSummary bundle (refcount = 100000, revision = HEAD) ran 6.12 ± 0.10 times faster than bundle (refcount = 100000, revision = master)\n",[44,1397,1395],{"__ignoreMap":54},[12,1399,1400],{},"Weitere Informationen findest du in unserem Blogbeitrag",[12,1402,1403,192],{},[16,1404,1407],{"href":1405,"rel":1406},"https://about.gitlab.com/blog/how-we-decreased-gitlab-repo-backup-times-from-48-hours-to-41-minutes/",[],"Wie wir die Backup-Zeiten für GitLab-Repos von 48 Stunden auf 41 Minuten verringerten (in englischer Sprache verfügbar)",[12,1409,1410],{},"Den ursprünglichen englischsprachigen Mailinglisten-Thread findest du",[12,1412,1413,192],{},[16,1414,1305],{"href":1415,"rel":1416},"https://lore.kernel.org/git/20250401-488-generating-bundles-with-many-references-has-non-linear-performance-v1-0-6d23b2d96557@gmail.com/",[],[12,1418,1419],{},[355,1420,357,1421,362],{},[16,1422,891],{"href":889,"rel":1423},[],[23,1425,1427],{"id":1426},"bessere-auflösung-von-uri-bundles","Bessere Auflösung von URI-Bundles",[12,1429,1430,1431,1434],{},"Durch den ",[16,1432,1344],{"href":1342,"rel":1433},[],"-Mechanismus in Git können den Clients",[12,1436,1437],{},"Orte zum Abrufen von Bundles zur Verfügung gestellt werden, um",[12,1439,1440],{},"Klone und Abrufe zu beschleunigen. Wenn ein Client ein Bundle herunterlädt, werden Referenzen",[12,1442,1443,1444,1447],{},"unter ",[44,1445,1446],{},"refs/heads/*"," zusammen mit",[12,1449,1450],{},"den zugehörigen Objekten aus dem Bundle in das Repository kopiert. Ein Bundle kann zusätzliche Referenzen",[12,1452,1453,1454,1456,1457,1460],{},"außerhalb von ",[44,1455,1446],{}," enthalten, wie z. B. ",[44,1458,1459],{},"refs/tags/*",", die einfach ignoriert werden, wenn",[12,1462,1463],{},"die Bundle-URI beim Klonen verwendet wird.",[12,1465,1466],{},"In Git 2.50 wird diese Einschränkung aufgehoben und alle Referenzen, die mit",[12,1468,1469,1472],{},[44,1470,1471],{},"refs/*"," übereinstimmen und im heruntergeladenen Bundle enthalten sind, werden kopiert.",[12,1474,1475,1480],{},[16,1476,1479],{"href":1477,"rel":1478},"https://github.com/schacon",[],"Scott Chacon",", der diese Funktionalität beigesteuert hat,",[12,1482,1483],{},"demonstriert den Unterschied beim Klonen von",[12,1485,1486,1491],{},[16,1487,1490],{"href":1488,"rel":1489},"https://gitlab.com/gitlab-org/gitlab-foss",[],"gitlab-org/gitlab-foss",":",[49,1493,1495],{"className":51,"code":1494,"language":53,"meta":54,"style":54},"$ git-v2.49 clone --bundle-uri=gitlab-base.bundle https://gitlab.com/gitlab-org/gitlab-foss.git gl-2.49\n\nCloning into 'gl2.49'...\n\nremote: Enumerating objects: 1092703, done.\n\nremote: Counting objects: 100% (973405/973405), done.\n\nremote: Compressing objects: 100% (385827/385827), done.\n\nremote: Total 959773 (delta 710976), reused 766809 (delta 554276), pack-reused 0 (from 0)\n\nReceiving objects: 100% (959773/959773), 366.94 MiB | 20.87 MiB/s, done.\n\nResolving deltas: 100% (710976/710976), completed with 9081 local objects.\n\nChecking objects: 100% (4194304/4194304), done.\n\nChecking connectivity: 959668, done.\n\nUpdating files: 100% (59972/59972), done.\n\n\n$ git-v2.50 clone --bundle-uri=gitlab-base.bundle https://gitlab.com/gitlab-org/gitlab-foss.git gl-2.50\n\nCloning into 'gl-2.50'...\n\nremote: Enumerating objects: 65538, done.\n\nremote: Counting objects: 100% (56054/56054), done.\n\nremote: Compressing objects: 100% (28950/28950), done.\n\nremote: Total 43877 (delta 27401), reused 25170 (delta 13546), pack-reused 0 (from 0)\n\nReceiving objects: 100% (43877/43877), 40.42 MiB | 22.27 MiB/s, done.\n\nResolving deltas: 100% (27401/27401), completed with 8564 local objects.\n\nUpdating files: 100% (59972/59972), done.\n",[44,1496,1497,1516,1520,1531,1535,1552,1556,1572,1576,1590,1594,1631,1635,1658,1662,1681,1685,1697,1701,1713,1717,1730,1734,1738,1754,1758,1767,1771,1784,1788,1801,1805,1818,1822,1852,1856,1876,1880,1895,1899],{"__ignoreMap":54},[58,1498,1499,1501,1504,1507,1510,1513],{"class":60,"line":61},[58,1500,65],{"class":64},[58,1502,1503],{"class":68}," git-v2.49",[58,1505,1506],{"class":68}," clone",[58,1508,1509],{"class":118}," --bundle-uri=gitlab-base.bundle",[58,1511,1512],{"class":68}," https://gitlab.com/gitlab-org/gitlab-foss.git",[58,1514,1515],{"class":68}," gl-2.49\n",[58,1517,1518],{"class":60,"line":133},[58,1519,137],{"emptyLinePlaceholder":136},[58,1521,1522,1525,1528],{"class":60,"line":140},[58,1523,1524],{"class":64},"Cloning",[58,1526,1527],{"class":68}," into",[58,1529,1530],{"class":68}," 'gl2.49'...\n",[58,1532,1533],{"class":60,"line":161},[58,1534,137],{"emptyLinePlaceholder":136},[58,1536,1537,1540,1543,1546,1549],{"class":60,"line":166},[58,1538,1539],{"class":64},"remote:",[58,1541,1542],{"class":68}," Enumerating",[58,1544,1545],{"class":68}," objects:",[58,1547,1548],{"class":68}," 1092703,",[58,1550,1551],{"class":68}," done.\n",[58,1553,1554],{"class":60,"line":462},[58,1555,137],{"emptyLinePlaceholder":136},[58,1557,1558,1560,1563,1565,1568],{"class":60,"line":467},[58,1559,1539],{"class":64},[58,1561,1562],{"class":68}," Counting",[58,1564,1545],{"class":68},[58,1566,1567],{"class":68}," 100%",[58,1569,1571],{"class":1570},"sgsFI"," (973405/973405), done.\n",[58,1573,1574],{"class":60,"line":483},[58,1575,137],{"emptyLinePlaceholder":136},[58,1577,1578,1580,1583,1585,1587],{"class":60,"line":488},[58,1579,1539],{"class":64},[58,1581,1582],{"class":68}," Compressing",[58,1584,1545],{"class":68},[58,1586,1567],{"class":68},[58,1588,1589],{"class":1570}," (385827/385827), done.\n",[58,1591,1592],{"class":60,"line":504},[58,1593,137],{"emptyLinePlaceholder":136},[58,1595,1596,1598,1601,1604,1607,1610,1613,1616,1619,1622,1625,1628],{"class":60,"line":509},[58,1597,1539],{"class":64},[58,1599,1600],{"class":68}," Total",[58,1602,1603],{"class":118}," 959773",[58,1605,1606],{"class":1570}," (delta ",[58,1608,1609],{"class":118},"710976",[58,1611,1612],{"class":1570},"), reused 766809 (",[58,1614,1615],{"class":64},"delta",[58,1617,1618],{"class":118}," 554276",[58,1620,1621],{"class":1570},"), pack-reused 0 (",[58,1623,1624],{"class":64},"from",[58,1626,1627],{"class":118}," 0",[58,1629,1630],{"class":1570},")\n",[58,1632,1633],{"class":60,"line":522},[58,1634,137],{"emptyLinePlaceholder":136},[58,1636,1637,1640,1642,1644,1647,1650,1653,1656],{"class":60,"line":527},[58,1638,1639],{"class":64},"Receiving",[58,1641,1545],{"class":68},[58,1643,1567],{"class":68},[58,1645,1646],{"class":1570}," (959773/959773), 366.94 MiB ",[58,1648,1649],{"class":305},"|",[58,1651,1652],{"class":64}," 20.87",[58,1654,1655],{"class":68}," MiB/s,",[58,1657,1551],{"class":68},[58,1659,1660],{"class":60,"line":532},[58,1661,137],{"emptyLinePlaceholder":136},[58,1663,1664,1667,1670,1672,1675,1678],{"class":60,"line":538},[58,1665,1666],{"class":64},"Resolving",[58,1668,1669],{"class":68}," deltas:",[58,1671,1567],{"class":68},[58,1673,1674],{"class":1570}," (710976/710976), completed with 9081 ",[58,1676,1677],{"class":305},"local",[58,1679,1680],{"class":1570}," objects.\n",[58,1682,1683],{"class":60,"line":543},[58,1684,137],{"emptyLinePlaceholder":136},[58,1686,1687,1690,1692,1694],{"class":60,"line":555},[58,1688,1689],{"class":64},"Checking",[58,1691,1545],{"class":68},[58,1693,1567],{"class":68},[58,1695,1696],{"class":1570}," (4194304/4194304), done.\n",[58,1698,1699],{"class":60,"line":560},[58,1700,137],{"emptyLinePlaceholder":136},[58,1702,1703,1705,1708,1711],{"class":60,"line":566},[58,1704,1689],{"class":64},[58,1706,1707],{"class":68}," connectivity:",[58,1709,1710],{"class":68}," 959668,",[58,1712,1551],{"class":68},[58,1714,1715],{"class":60,"line":571},[58,1716,137],{"emptyLinePlaceholder":136},[58,1718,1719,1722,1725,1727],{"class":60,"line":577},[58,1720,1721],{"class":64},"Updating",[58,1723,1724],{"class":68}," files:",[58,1726,1567],{"class":68},[58,1728,1729],{"class":1570}," (59972/59972), done.\n",[58,1731,1732],{"class":60,"line":582},[58,1733,137],{"emptyLinePlaceholder":136},[58,1735,1736],{"class":60,"line":588},[58,1737,137],{"emptyLinePlaceholder":136},[58,1739,1740,1742,1745,1747,1749,1751],{"class":60,"line":593},[58,1741,65],{"class":64},[58,1743,1744],{"class":68}," git-v2.50",[58,1746,1506],{"class":68},[58,1748,1509],{"class":118},[58,1750,1512],{"class":68},[58,1752,1753],{"class":68}," gl-2.50\n",[58,1755,1756],{"class":60,"line":598},[58,1757,137],{"emptyLinePlaceholder":136},[58,1759,1760,1762,1764],{"class":60,"line":604},[58,1761,1524],{"class":64},[58,1763,1527],{"class":68},[58,1765,1766],{"class":68}," 'gl-2.50'...\n",[58,1768,1769],{"class":60,"line":609},[58,1770,137],{"emptyLinePlaceholder":136},[58,1772,1773,1775,1777,1779,1782],{"class":60,"line":615},[58,1774,1539],{"class":64},[58,1776,1542],{"class":68},[58,1778,1545],{"class":68},[58,1780,1781],{"class":68}," 65538,",[58,1783,1551],{"class":68},[58,1785,1786],{"class":60,"line":620},[58,1787,137],{"emptyLinePlaceholder":136},[58,1789,1790,1792,1794,1796,1798],{"class":60,"line":639},[58,1791,1539],{"class":64},[58,1793,1562],{"class":68},[58,1795,1545],{"class":68},[58,1797,1567],{"class":68},[58,1799,1800],{"class":1570}," (56054/56054), done.\n",[58,1802,1803],{"class":60,"line":644},[58,1804,137],{"emptyLinePlaceholder":136},[58,1806,1807,1809,1811,1813,1815],{"class":60,"line":650},[58,1808,1539],{"class":64},[58,1810,1582],{"class":68},[58,1812,1545],{"class":68},[58,1814,1567],{"class":68},[58,1816,1817],{"class":1570}," (28950/28950), done.\n",[58,1819,1820],{"class":60,"line":655},[58,1821,137],{"emptyLinePlaceholder":136},[58,1823,1824,1826,1828,1831,1833,1836,1839,1841,1844,1846,1848,1850],{"class":60,"line":661},[58,1825,1539],{"class":64},[58,1827,1600],{"class":68},[58,1829,1830],{"class":118}," 43877",[58,1832,1606],{"class":1570},[58,1834,1835],{"class":118},"27401",[58,1837,1838],{"class":1570},"), reused 25170 (",[58,1840,1615],{"class":64},[58,1842,1843],{"class":118}," 13546",[58,1845,1621],{"class":1570},[58,1847,1624],{"class":64},[58,1849,1627],{"class":118},[58,1851,1630],{"class":1570},[58,1853,1854],{"class":60,"line":666},[58,1855,137],{"emptyLinePlaceholder":136},[58,1857,1858,1860,1862,1864,1867,1869,1872,1874],{"class":60,"line":672},[58,1859,1639],{"class":64},[58,1861,1545],{"class":68},[58,1863,1567],{"class":68},[58,1865,1866],{"class":1570}," (43877/43877), 40.42 MiB ",[58,1868,1649],{"class":305},[58,1870,1871],{"class":64}," 22.27",[58,1873,1655],{"class":68},[58,1875,1551],{"class":68},[58,1877,1878],{"class":60,"line":677},[58,1879,137],{"emptyLinePlaceholder":136},[58,1881,1882,1884,1886,1888,1891,1893],{"class":60,"line":683},[58,1883,1666],{"class":64},[58,1885,1669],{"class":68},[58,1887,1567],{"class":68},[58,1889,1890],{"class":1570}," (27401/27401), completed with 8564 ",[58,1892,1677],{"class":305},[58,1894,1680],{"class":1570},[58,1896,1897],{"class":60,"line":688},[58,1898,137],{"emptyLinePlaceholder":136},[58,1900,1901,1903,1905,1907],{"class":60,"line":693},[58,1902,1721],{"class":64},[58,1904,1724],{"class":68},[58,1906,1567],{"class":68},[58,1908,1729],{"class":1570},[12,1910,1911],{},"Wenn wir diese Ergebnisse vergleichen, sehen wir, dass Git 2.50 43 887 Objekte",[12,1913,1914],{},"(40,42 MiB) abruft, nachdem das Bundle extrahiert wurde, während Git 2.49",[12,1916,1917],{},"insgesamt 959 773 Objekte (366,94 MiB) abruft. Git 2.50 ruft etwa 95 % weniger",[12,1919,1920],{},"Objekte und 90 % weniger Daten ab, was vorteilhaft sowohl für den Client als auch für den Server ist. Der",[12,1922,1923],{},"Server muss viel weniger Daten für den Client verarbeiten und der Client muss weniger Daten",[12,1925,1926],{},"herunterladen und extrahieren. In dem von Scott angegebenen Beispiel führte dies zu einer",[12,1928,1929],{},"Beschleunigung um 25 %.",[12,1931,1932],{},"Weitere Informationen findest du im entsprechenden englischsprachigen",[12,1934,1935,192],{},[16,1936,351],{"href":1937,"rel":1938},"https://lore.kernel.org/git/pull.1897.git.git.1740489585344.gitgitgadget@gmail.com/",[],[12,1940,1941],{},[355,1942,1943,1944,1947],{},"Diese Patch-Serie wurde von ",[16,1945,1479],{"href":1477,"rel":1946},[]," beigesteuert.",[23,1949,1951],{"id":1950},"weiterlesen","Weiterlesen",[12,1953,1954],{},"In diesem Artikel werden nur einige der Beiträge von GitLab und",[12,1956,1957],{},"der größeren Git-Community für diese neueste Veröffentlichung vorgestellt. Mehr darüber erfährst du in",[12,1959,1960,1961,1966],{},"der ",[16,1962,1965],{"href":1963,"rel":1964},"https://lore.kernel.org/git/xmqq1prj1umb.fsf@gitster.g/",[],"offiziellen Veröffentlichungsankündigung"," des Git-Projekts. Sieh dir auch",[12,1968,1969,1970],{},"unsere ",[16,1971,1974],{"href":1972,"rel":1973},"https://about.gitlab.com/blog/tags/git/",[],"letzten Blogbeiträge zu Git-Releases (in englischer Sprache verfügbar)",[12,1976,1977],{},"an, um weitere wichtige Beiträge von GitLab-Teammitgliedern zu entdecken.",[1979,1980,1981],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}",{"title":54,"searchDepth":133,"depth":133,"links":1983},[1984,1985,1986,1987,1988,1989],{"id":25,"depth":133,"text":26},{"id":380,"depth":133,"text":381},{"id":894,"depth":133,"text":895},{"id":1317,"depth":133,"text":1318},{"id":1426,"depth":133,"text":1427},{"id":1950,"depth":133,"text":1951},"open-source","2025-06-16","Beiträge des Git-Teams von GitLab und der Git-Community, inklusive des Befehls git-diff-pairs(1) und der Option git-rev-list(1) für gebündelte Referenz-Updates.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663087/Blog/Hero%20Images/git3-cover.png",{},"/de-de/blog/what-s-new-in-git-2-50-0",{"noIndex":1999,"title":2000,"description":1992},false,"GitLab: Was gibt es Neues in Git 2.50.0?","what-s-new-in-git-2-50-0","de-de/blog/what-s-new-in-git-2-50-0",[2004,2005,2006],"git","open source","community","BlogPost","-Y06fRpe6pbmCNHAO9x702fOP0f-Bez2f-k0XRZs3so",{"logo":2010,"freeTrial":2015,"sales":2020,"login":2025,"items":2030,"search":2358,"minimal":2392,"duo":2410,"switchNav":2419,"pricingDeployment":2430},{"config":2011},{"href":2012,"dataGaName":2013,"dataGaLocation":2014},"/de-de/","gitlab logo","header",{"text":2016,"config":2017},"Kostenlose Testversion anfordern",{"href":2018,"dataGaName":2019,"dataGaLocation":2014},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de&glm_content=default-saas-trial/","free trial",{"text":2021,"config":2022},"Demo anfordern",{"href":2023,"dataGaName":2024,"dataGaLocation":2014},"/de-de/sales/?contact-topic=request-demo","sales",{"text":2026,"config":2027},"Anmelden",{"href":2028,"dataGaName":2029,"dataGaLocation":2014},"https://gitlab.com/users/sign_in/","sign in",[2031,2060,2162,2167,2280,2336],{"text":2032,"config":2033,"menu":2035},"Plattform",{"dataNavLevelOne":2034},"platform",{"type":2036,"columns":2037},"cards",[2038,2044,2052],{"title":2032,"description":2039,"link":2040},"Die intelligente Orchestrierungsplattform für DevSecOps",{"text":2041,"config":2042},"Die Plattform erkunden",{"href":2043,"dataGaName":2034,"dataGaLocation":2014},"/de-de/platform/",{"title":2045,"description":2046,"link":2047},"GitLab Duo Agent Platform","Agentische KI für den gesamten Software-Lebenszyklus",{"text":2048,"config":2049},"Lerne GitLab Duo kennen",{"href":2050,"dataGaName":2051,"dataGaLocation":2014},"/de-de/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":2053,"description":2054,"link":2055},"Warum GitLab?","Erfahre, warum sich Unternehmen für GitLab entscheiden",{"text":2056,"config":2057},"Mehr erfahren",{"href":2058,"dataGaName":2059,"dataGaLocation":2014},"/de-de/why-gitlab/","why gitlab",{"text":2061,"left":136,"config":2062,"menu":2064},"Produkt",{"dataNavLevelOne":2063},"solutions",{"type":2065,"link":2066,"columns":2070,"feature":2141},"lists",{"text":2067,"config":2068},"Alle Lösungen anzeigen",{"href":2069,"dataGaName":2063,"dataGaLocation":2014},"/de-de/solutions/",[2071,2096,2119],{"title":2072,"description":2073,"link":2074,"items":2079},"Automatisierung","CI/CD und Automatisierung zur Beschleunigung der Bereitstellung",{"config":2075},{"icon":2076,"href":2077,"dataGaName":2078,"dataGaLocation":2014},"AutomatedCodeAlt","/de-de/solutions/delivery-automation/","automated software delivery",[2080,2084,2087,2092],{"text":2081,"config":2082},"CI/CD",{"href":2083,"dataGaLocation":2014,"dataGaName":2081},"/de-de/solutions/continuous-integration/",{"text":2045,"config":2085},{"href":2050,"dataGaLocation":2014,"dataGaName":2086},"gitlab duo agent platform - product menu",{"text":2088,"config":2089},"Quellcodeverwaltung",{"href":2090,"dataGaLocation":2014,"dataGaName":2091},"/de-de/solutions/source-code-management/","Source Code Management",{"text":2093,"config":2094},"Automatische Softwarebereitstellung",{"href":2077,"dataGaLocation":2014,"dataGaName":2095},"Automated software delivery",{"title":2097,"description":2098,"link":2099,"items":2104},"Sicherheit","Entwickle Code schneller ohne Abstriche bei der Sicherheit",{"config":2100},{"href":2101,"dataGaName":2102,"dataGaLocation":2014,"icon":2103},"/de-de/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[2105,2109,2114],{"text":2106,"config":2107},"Anwendungssicherheitstests",{"href":2101,"dataGaName":2108,"dataGaLocation":2014},"Application security testing",{"text":2110,"config":2111},"Schutz der Software-Lieferkette",{"href":2112,"dataGaLocation":2014,"dataGaName":2113},"/de-de/solutions/supply-chain/","Software supply chain security",{"text":2115,"config":2116},"Software-Compliance",{"href":2117,"dataGaName":2118,"dataGaLocation":2014},"/de-de/solutions/software-compliance/","software compliance",{"title":2120,"link":2121,"items":2126},"Messung",{"config":2122},{"icon":2123,"href":2124,"dataGaName":2125,"dataGaLocation":2014},"DigitalTransformation","/de-de/solutions/visibility-measurement/","visibility and measurement",[2127,2131,2136],{"text":2128,"config":2129},"Sichtbarkeit und Messung",{"href":2124,"dataGaLocation":2014,"dataGaName":2130},"Visibility and Measurement",{"text":2132,"config":2133},"Wertstrommanagement",{"href":2134,"dataGaLocation":2014,"dataGaName":2135},"/de-de/solutions/value-stream-management/","Value Stream Management",{"text":2137,"config":2138},"Analysen und Einblicke",{"href":2139,"dataGaLocation":2014,"dataGaName":2140},"/de-de/solutions/analytics-and-insights/","Analytics and insights",{"title":2142,"type":2065,"items":2143},"GitLab für",[2144,2150,2156],{"text":2145,"config":2146},"Enterprise",{"icon":2147,"href":2148,"dataGaLocation":2014,"dataGaName":2149},"Building","/de-de/enterprise/","enterprise",{"text":2151,"config":2152},"Kleinunternehmen",{"icon":2153,"href":2154,"dataGaLocation":2014,"dataGaName":2155},"Work","/de-de/small-business/","small business",{"text":2157,"config":2158},"Öffentlicher Sektor",{"icon":2159,"href":2160,"dataGaLocation":2014,"dataGaName":2161},"Organization","/de-de/solutions/public-sector/","public sector",{"text":2163,"config":2164},"Preise",{"href":2165,"dataGaName":2166,"dataGaLocation":2014,"dataNavLevelOne":2166},"/de-de/pricing/","pricing",{"text":2168,"config":2169,"menu":2171},"Ressourcen",{"dataNavLevelOne":2170},"resources",{"type":2065,"link":2172,"columns":2176,"feature":2269},{"text":2173,"config":2174},"Alle Ressourcen anzeigen",{"href":2175,"dataGaName":2170,"dataGaLocation":2014},"/de-de/resources/",[2177,2210,2237],{"title":2178,"items":2179},"Erste Schritte",[2180,2185,2190,2195,2200,2205],{"text":2181,"config":2182},"Installieren",{"href":2183,"dataGaName":2184,"dataGaLocation":2014},"/de-de/install/","install",{"text":2186,"config":2187},"Kurzanleitungen",{"href":2188,"dataGaName":2189,"dataGaLocation":2014},"/de-de/get-started/","quick setup checklists",{"text":2191,"config":2192},"Lernen",{"href":2193,"dataGaLocation":2014,"dataGaName":2194},"https://university.gitlab.com/","learn",{"text":2196,"config":2197},"Produktdokumentation",{"href":2198,"dataGaName":2199,"dataGaLocation":2014},"https://docs.gitlab.com/","product documentation",{"text":2201,"config":2202},"Best-Practice-Videos",{"href":2203,"dataGaName":2204,"dataGaLocation":2014},"/de-de/getting-started-videos/","best practice videos",{"text":2206,"config":2207},"Integrationen",{"href":2208,"dataGaName":2209,"dataGaLocation":2014},"/de-de/integrations/","integrations",{"title":2211,"items":2212},"Entdecken",[2213,2218,2223,2228,2232],{"text":2214,"config":2215},"Kundenerfolge",{"href":2216,"dataGaName":2217,"dataGaLocation":2014},"/de-de/customers/","customer success stories",{"text":2219,"config":2220},"Blog",{"href":2221,"dataGaName":2222,"dataGaLocation":2014},"/de-de/blog/","blog",{"text":2224,"config":2225},"Demo-Hub",{"href":2226,"dataGaName":2227,"dataGaLocation":2014},"/de-de/demo-hub/","demo hub",{"text":2229,"config":2230},"The Source",{"href":2231,"dataGaName":2222,"dataGaLocation":2014},"/de-de/the-source/",{"text":2233,"config":2234},"Remote",{"href":2235,"dataGaName":2236,"dataGaLocation":2014},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":2238,"items":2239},"Vernetzen",[2240,2245,2250,2254,2259,2264],{"text":2241,"config":2242},"GitLab-Services",{"href":2243,"dataGaName":2244,"dataGaLocation":2014},"/de-de/services/","services",{"text":2246,"config":2247},"Beitragen",{"href":2248,"dataGaName":2249,"dataGaLocation":2014},"https://contributors.gitlab.com","contribute",{"text":2251,"config":2252},"Community",{"href":2253,"dataGaName":2006,"dataGaLocation":2014},"/community/",{"text":2255,"config":2256},"Forum",{"href":2257,"dataGaName":2258,"dataGaLocation":2014},"https://forum.gitlab.com/","forum",{"text":2260,"config":2261},"Veranstaltungen",{"href":2262,"dataGaName":2263,"dataGaLocation":2014},"/events/","events",{"text":2265,"config":2266},"Partner",{"href":2267,"dataGaName":2268,"dataGaLocation":2014},"/de-de/partners/","partners",{"config":2270,"title":2273,"text":2274,"link":2275},{"background":2271,"textColor":2272},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Neues bei GitLab","Über die neuesten Funktionen und Verbesserungen auf dem Laufenden bleiben.",{"text":2276,"config":2277},"Aktuelle Nachrichten",{"href":2278,"dataGaName":2279,"dataGaLocation":2014},"/de-de/whats-new/","whats new",{"text":2281,"config":2282,"menu":2284},"Unternehmen",{"dataNavLevelOne":2283},"company",{"type":2065,"columns":2285},[2286],{"items":2287},[2288,2293,2299,2301,2306,2311,2316,2321,2326,2331],{"text":2289,"config":2290},"Über",{"href":2291,"dataGaName":2292,"dataGaLocation":2014},"/de-de/company/","about",{"text":2294,"config":2295,"footerGa":2298},"Karriere",{"href":2296,"dataGaName":2297,"dataGaLocation":2014},"/jobs/","jobs",{"dataGaName":2297},{"text":2260,"config":2300},{"href":2262,"dataGaName":2263,"dataGaLocation":2014},{"text":2302,"config":2303},"Geschäftsführung",{"href":2304,"dataGaName":2305,"dataGaLocation":2014},"/company/team/e-group/","leadership",{"text":2307,"config":2308},"Handbuch",{"href":2309,"dataGaName":2310,"dataGaLocation":2014},"https://handbook.gitlab.com/","handbook",{"text":2312,"config":2313},"Investor Relations",{"href":2314,"dataGaName":2315,"dataGaLocation":2014},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":2317,"config":2318},"Trust Center",{"href":2319,"dataGaName":2320,"dataGaLocation":2014},"/de-de/security/","trust center",{"text":2322,"config":2323},"AI Transparency Center",{"href":2324,"dataGaName":2325,"dataGaLocation":2014},"/de-de/ai-transparency-center/","ai transparency center",{"text":2327,"config":2328},"Newsletter",{"href":2329,"dataGaName":2330,"dataGaLocation":2014},"/company/contact/#contact-forms","newsletter",{"text":2332,"config":2333},"Presse",{"href":2334,"dataGaName":2335,"dataGaLocation":2014},"/press/","press",{"text":2337,"config":2338,"menu":2339},"Kontakt",{"dataNavLevelOne":2283},{"type":2065,"columns":2340},[2341],{"items":2342},[2343,2348,2353],{"text":2344,"config":2345},"Vertrieb kontaktieren",{"href":2346,"dataGaName":2347,"dataGaLocation":2014},"/de-de/sales/","talk to sales",{"text":2349,"config":2350},"Support-Portal",{"href":2351,"dataGaName":2352,"dataGaLocation":2014},"https://support.gitlab.com/hc/en-us","support portal",{"text":2354,"config":2355},"Kundenportal",{"href":2356,"dataGaName":2357,"dataGaLocation":2014},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":2359,"login":2360,"suggestions":2367},"Schließen",{"text":2361,"link":2362},"Um Repositorys und Projekte zu durchsuchen, melde dich an bei",{"text":2363,"config":2364},"gitlab.com",{"href":2028,"dataGaName":2365,"dataGaLocation":2366},"search login","search",{"text":2368,"default":2369},"Vorschläge",[2370,2372,2377,2379,2384,2389],{"text":2045,"config":2371},{"href":2050,"dataGaName":2045,"dataGaLocation":2366},{"text":2373,"config":2374},"Codevorschläge (KI)",{"href":2375,"dataGaName":2376,"dataGaLocation":2366},"/de-de/solutions/code-suggestions/","Code Suggestions (AI)",{"text":2081,"config":2378},{"href":2083,"dataGaName":2081,"dataGaLocation":2366},{"text":2380,"config":2381},"GitLab auf AWS",{"href":2382,"dataGaName":2383,"dataGaLocation":2366},"/de-de/partners/technology-partners/aws/","GitLab on AWS",{"text":2385,"config":2386},"GitLab auf Google Cloud",{"href":2387,"dataGaName":2388,"dataGaLocation":2366},"/de-de/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":2053,"config":2390},{"href":2058,"dataGaName":2391,"dataGaLocation":2366},"Why GitLab?",{"freeTrial":2393,"mobileIcon":2398,"desktopIcon":2403,"secondaryButton":2406},{"text":2394,"config":2395},"Kostenlos testen",{"href":2396,"dataGaName":2019,"dataGaLocation":2397},"https://gitlab.com/-/trials/new/","nav",{"altText":2399,"config":2400},"GitLab-Symbol",{"src":2401,"dataGaName":2402,"dataGaLocation":2397},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":2399,"config":2404},{"src":2405,"dataGaName":2402,"dataGaLocation":2397},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":2178,"config":2407},{"href":2408,"dataGaName":2409,"dataGaLocation":2397},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/de-de/get-started/","get started",{"freeTrial":2411,"mobileIcon":2415,"desktopIcon":2417},{"text":2412,"config":2413},"Mehr über GitLab Duo erfahren",{"href":2050,"dataGaName":2414,"dataGaLocation":2397},"gitlab duo",{"altText":2399,"config":2416},{"src":2401,"dataGaName":2402,"dataGaLocation":2397},{"altText":2399,"config":2418},{"src":2405,"dataGaName":2402,"dataGaLocation":2397},{"button":2420,"mobileIcon":2425,"desktopIcon":2427},{"text":2421,"config":2422},"/Option",{"href":2423,"dataGaName":2424,"dataGaLocation":2397},"#contact","switch",{"altText":2399,"config":2426},{"src":2401,"dataGaName":2402,"dataGaLocation":2397},{"altText":2399,"config":2428},{"src":2429,"dataGaName":2402,"dataGaLocation":2397},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":2431,"mobileIcon":2436,"desktopIcon":2438},{"text":2432,"config":2433},"Zurück zur Preisübersicht",{"href":2165,"dataGaName":2434,"dataGaLocation":2397,"icon":2435},"back to pricing","GoBack",{"altText":2399,"config":2437},{"src":2401,"dataGaName":2402,"dataGaLocation":2397},{"altText":2399,"config":2439},{"src":2405,"dataGaName":2402,"dataGaLocation":2397},{"title":2441,"button":2442,"config":2446},"GitLab Orbit ist da: die Kontextebene für KI-Agenten",{"text":2056,"config":2443},{"href":2444,"dataGaName":2445,"dataGaLocation":2014},"/de-de/gitlab-orbit/","orbit",{"layout":2447,"disabled":1999},"release",{"data":2449},{"text":2450,"source":2451,"edit":2457,"contribute":2462,"config":2467,"items":2472,"minimal":2678},"Git ist eine Marke von Software Freedom Conservancy und unsere Verwendung von „GitLab“ erfolgt unter Lizenz.",{"text":2452,"config":2453},"Quelltext der Seite anzeigen",{"href":2454,"dataGaName":2455,"dataGaLocation":2456},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":2458,"config":2459},"Diese Seite bearbeiten",{"href":2460,"dataGaName":2461,"dataGaLocation":2456},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":2463,"config":2464},"Beteilige dich",{"href":2465,"dataGaName":2466,"dataGaLocation":2456},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":2468,"facebook":2469,"youtube":2470,"linkedin":2471},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[2473,2518,2571,2613,2645],{"title":2163,"links":2474,"subMenu":2489},[2475,2479,2484],{"text":2476,"config":2477},"Tarife anzeigen",{"href":2165,"dataGaName":2478,"dataGaLocation":2456},"view plans",{"text":2480,"config":2481},"Vorteile von Premium",{"href":2482,"dataGaName":2483,"dataGaLocation":2456},"/de-de/pricing/premium/","why premium",{"text":2485,"config":2486},"Vorteile von Ultimate",{"href":2487,"dataGaName":2488,"dataGaLocation":2456},"/de-de/pricing/ultimate/","why ultimate",[2490],{"title":2337,"links":2491},[2492,2494,2496,2498,2503,2508,2513],{"text":2344,"config":2493},{"href":2346,"dataGaName":2024,"dataGaLocation":2456},{"text":2349,"config":2495},{"href":2351,"dataGaName":2352,"dataGaLocation":2456},{"text":2354,"config":2497},{"href":2356,"dataGaName":2357,"dataGaLocation":2456},{"text":2499,"config":2500},"Status",{"href":2501,"dataGaName":2502,"dataGaLocation":2456},"https://status.gitlab.com/","status",{"text":2504,"config":2505},"Nutzungsbedingungen",{"href":2506,"dataGaName":2507,"dataGaLocation":2456},"/terms/","terms of use",{"text":2509,"config":2510},"Datenschutzerklärung",{"href":2511,"dataGaName":2512,"dataGaLocation":2456},"/de-de/privacy/","privacy statement",{"text":2514,"config":2515},"Cookie-Einstellungen",{"dataGaName":2516,"dataGaLocation":2456,"id":2517,"isOneTrustButton":136},"cookie preferences","ot-sdk-btn",{"title":2061,"links":2519,"subMenu":2528},[2520,2524],{"text":2521,"config":2522},"DevSecOps-Plattform",{"href":2043,"dataGaName":2523,"dataGaLocation":2456},"devsecops platform",{"text":2525,"config":2526},"KI-unterstützte Entwicklung",{"href":2050,"dataGaName":2527,"dataGaLocation":2456},"ai-assisted development",[2529],{"title":2530,"links":2531},"Themen",[2532,2536,2541,2546,2551,2556,2561,2566],{"text":2081,"config":2533},{"href":2534,"dataGaName":2535,"dataGaLocation":2456},"/de-de/topics/ci-cd/","cicd",{"text":2537,"config":2538},"GitOps",{"href":2539,"dataGaName":2540,"dataGaLocation":2456},"/de-de/topics/gitops/","gitops",{"text":2542,"config":2543},"DevOps",{"href":2544,"dataGaName":2545,"dataGaLocation":2456},"/de-de/topics/devops/","devops",{"text":2547,"config":2548},"Versionskontrolle",{"href":2549,"dataGaName":2550,"dataGaLocation":2456},"/de-de/topics/version-control/","version control",{"text":2552,"config":2553},"DevSecOps",{"href":2554,"dataGaName":2555,"dataGaLocation":2456},"/de-de/topics/devsecops/","devsecops",{"text":2557,"config":2558},"Cloud-nativ",{"href":2559,"dataGaName":2560,"dataGaLocation":2456},"/de-de/topics/cloud-native/","cloud native",{"text":2562,"config":2563},"KI für das Programmieren",{"href":2564,"dataGaName":2565,"dataGaLocation":2456},"/de-de/topics/devops/ai-for-coding/","ai for coding",{"text":2567,"config":2568},"Agentische KI",{"href":2569,"dataGaName":2570,"dataGaLocation":2456},"/de-de/topics/agentic-ai/","agentic ai",{"title":2572,"links":2573},"Lösungen",[2574,2577,2579,2584,2588,2591,2594,2597,2599,2601,2603,2608],{"text":2106,"config":2575},{"href":2101,"dataGaName":2576,"dataGaLocation":2456},"Application Security Testing",{"text":2093,"config":2578},{"href":2077,"dataGaName":2078,"dataGaLocation":2456},{"text":2580,"config":2581},"Agile Entwicklung",{"href":2582,"dataGaName":2583,"dataGaLocation":2456},"/de-de/solutions/agile-delivery/","agile delivery",{"text":2585,"config":2586},"SCM",{"href":2090,"dataGaName":2587,"dataGaLocation":2456},"source code management",{"text":2081,"config":2589},{"href":2083,"dataGaName":2590,"dataGaLocation":2456},"continuous integration & delivery",{"text":2132,"config":2592},{"href":2134,"dataGaName":2593,"dataGaLocation":2456},"value stream management",{"text":2537,"config":2595},{"href":2596,"dataGaName":2540,"dataGaLocation":2456},"/de-de/solutions/gitops/",{"text":2145,"config":2598},{"href":2148,"dataGaName":2149,"dataGaLocation":2456},{"text":2151,"config":2600},{"href":2154,"dataGaName":2155,"dataGaLocation":2456},{"text":2157,"config":2602},{"href":2160,"dataGaName":2161,"dataGaLocation":2456},{"text":2604,"config":2605},"Bildungswesen",{"href":2606,"dataGaName":2607,"dataGaLocation":2456},"/de-de/solutions/education/","education",{"text":2609,"config":2610},"Finanzdienstleistungen",{"href":2611,"dataGaName":2612,"dataGaLocation":2456},"/de-de/solutions/finance/","financial services",{"title":2168,"links":2614},[2615,2617,2619,2621,2624,2626,2629,2631,2633,2635,2637,2639,2641,2643],{"text":2181,"config":2616},{"href":2183,"dataGaName":2184,"dataGaLocation":2456},{"text":2186,"config":2618},{"href":2188,"dataGaName":2189,"dataGaLocation":2456},{"text":2191,"config":2620},{"href":2193,"dataGaName":2194,"dataGaLocation":2456},{"text":2196,"config":2622},{"href":2198,"dataGaName":2623,"dataGaLocation":2456},"docs",{"text":2219,"config":2625},{"href":2221,"dataGaName":2222,"dataGaLocation":2456},{"text":2627,"config":2628},"Neuerungen",{"href":2278,"dataGaName":2279,"dataGaLocation":2456},{"text":2214,"config":2630},{"href":2216,"dataGaName":2217,"dataGaLocation":2456},{"text":2233,"config":2632},{"href":2235,"dataGaName":2236,"dataGaLocation":2456},{"text":2241,"config":2634},{"href":2243,"dataGaName":2244,"dataGaLocation":2456},{"text":2246,"config":2636},{"href":2248,"dataGaName":2249,"dataGaLocation":2456},{"text":2251,"config":2638},{"href":2253,"dataGaName":2006,"dataGaLocation":2456},{"text":2255,"config":2640},{"href":2257,"dataGaName":2258,"dataGaLocation":2456},{"text":2260,"config":2642},{"href":2262,"dataGaName":2263,"dataGaLocation":2456},{"text":2265,"config":2644},{"href":2267,"dataGaName":2268,"dataGaLocation":2456},{"title":2281,"links":2646},[2647,2649,2651,2653,2655,2657,2662,2667,2669,2671,2673],{"text":2289,"config":2648},{"href":2291,"dataGaName":2283,"dataGaLocation":2456},{"text":2294,"config":2650},{"href":2296,"dataGaName":2297,"dataGaLocation":2456},{"text":2302,"config":2652},{"href":2304,"dataGaName":2305,"dataGaLocation":2456},{"text":2307,"config":2654},{"href":2309,"dataGaName":2310,"dataGaLocation":2456},{"text":2312,"config":2656},{"href":2314,"dataGaName":2315,"dataGaLocation":2456},{"text":2658,"config":2659},"Nachhaltigkeit",{"href":2660,"dataGaName":2661,"dataGaLocation":2456},"/sustainability/","Sustainability",{"text":2663,"config":2664},"Vielfalt, Inklusion und Zugehörigkeit",{"href":2665,"dataGaName":2666,"dataGaLocation":2456},"/de-de/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":2317,"config":2668},{"href":2319,"dataGaName":2320,"dataGaLocation":2456},{"text":2327,"config":2670},{"href":2329,"dataGaName":2330,"dataGaLocation":2456},{"text":2332,"config":2672},{"href":2334,"dataGaName":2335,"dataGaLocation":2456},{"text":2674,"config":2675},"Transparenzerklärung zu moderner Sklaverei",{"href":2676,"dataGaName":2677,"dataGaLocation":2456},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2679},[2680,2683,2686],{"text":2681,"config":2682},"Terms",{"href":2506,"dataGaName":2507,"dataGaLocation":2456},{"text":2684,"config":2685},"Cookies",{"dataGaName":2516,"dataGaLocation":2456,"id":2517,"isOneTrustButton":136},{"text":2687,"config":2688},"Datenschutz",{"href":2511,"dataGaName":2512,"dataGaLocation":2456},[2690],{"id":2691,"title":7,"body":1994,"config":2692,"content":2694,"description":1994,"extension":2698,"meta":2699,"navigation":136,"path":2700,"seo":2701,"stem":2702,"__hash__":2703},"blogAuthors/en-us/blog/authors/justin-tobler.yml",{"template":2693},"BlogAuthor",{"name":7,"config":2695},{"headshot":2696,"ctfId":2697},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664737/Blog/Author%20Headshots/james_tobler_headshot.png","5pnOIbNI1Sc5IFnReNHNtv","yml",{},"/en-us/blog/authors/justin-tobler",{},"en-us/blog/authors/justin-tobler","fZs0fJVrV3MQT0RHzrMvziLDriL7K4hf9Db4QlPsRvA",[2705,2713,2721],{"title":2706,"description":2707,"heroImage":2708,"category":1990,"date":2709,"authors":2710,"slug":2712,"externalUrl":1994},"Was ist neu in Git 2.55.0?","Neue Funktionen in Git 2.55: git-history(1) fixup, fsmonitor-Daemon für Linux, Push zu Remote-Gruppen und mehr.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782732487/ztwgrvlolpifo01vj8qc.png","2026-06-29",[2711],"Toon Claes","whats-new-in-git-2-55-0",{"title":2714,"description":2715,"heroImage":2716,"category":1990,"date":2717,"authors":2718,"slug":2720,"externalUrl":1994},"GitLab AI Hackathon 2026: Hier sind die Gewinner und ihre Projekte","Fast 7.000 Entwickler(innen) haben über 600 KI-Agenten und Flows auf GitLab Duo Agent Platform gebaut. Erfahre, wer gewonnen hat und was sie entwickelt haben.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-22",[2719],"Nick Veenhof","gitlab-ai-hackathon-2026-meet-the-winners",{"title":2722,"description":2723,"heroImage":2724,"category":1990,"date":2725,"authors":2726,"slug":2727,"externalUrl":1994},"Was ist neu in Git 2.54.0?","Erfahre mehr über die Beiträge zu diesem Release, darunter neue Repository-Wartung, ein neuer Befehl zur Bearbeitung der Commit-Historie, ein Ersatz für git-sizer(1) und mehr.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776711651/sj7xxyyuimlarswbyft5.png","2026-04-20",[1314],"whats-new-in-git-2-54-0",{"promotions":2729},[2730,2744,2756,2768],{"id":2731,"categories":2732,"header":2734,"text":2735,"button":2736,"image":2741},"ai-modernization",[2733],"ai","Hält KI, was uns versprochen wurde?","Das Quiz dauert maximal 5 Minuten.",{"text":2737,"config":2738},"Ermittle deinen KI-Reifegrad",{"href":2739,"dataGaName":2740,"dataGaLocation":2222},"/de-de/assessments/ai-modernization-assessment/","modernization assessment",{"config":2742},{"src":2743},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2745,"categories":2746,"header":2748,"text":2735,"button":2749,"image":2753},"devops-modernization",[2747,2555],"product","Verwaltest du Tool-Chaos oder stellst du Innovationen bereit?",{"text":2750,"config":2751},"Ermittle deinen DevOps-Reifegrad",{"href":2752,"dataGaName":2740,"dataGaLocation":2222},"/de-de/assessments/devops-modernization-assessment/",{"config":2754},{"src":2755},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2757,"categories":2758,"header":2760,"text":2735,"button":2761,"image":2765},"security-modernization",[2759],"security","Tauschst du Schnelligkeit gegen Sicherheit ein?",{"text":2762,"config":2763},"Ermittle deinen Sicherheitsreifegrad",{"href":2764,"dataGaName":2740,"dataGaLocation":2222},"/de-de/assessments/security-modernization-assessment/",{"config":2766},{"src":2767},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2769,"paths":2770,"header":2773,"text":2774,"button":2775,"image":2780},"github-azure-migration",[2771,2772],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Ist dein Team bereit für den Umzug von GitHub nach Azure?","GitHub stellt bereits auf Azure um. Finde heraus, was das für dich bedeutet.",{"text":2776,"config":2777},"Erfahre, wie GitLab im Vergleich zu GitHub abschneidet",{"href":2778,"dataGaName":2779,"dataGaLocation":2222},"/de-de/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2781},{"src":2755},{"header":2783,"blurb":2784,"button":2785,"secondaryButton":2790},"Beginne noch heute, schneller zu entwickeln","Entdecke, was dein Team mit der intelligenten Orchestrierungsplattform für DevSecOps erreichen kann.\n",{"text":2786,"config":2787},"Kostenlosen Test starten",{"href":2788,"dataGaName":2019,"dataGaLocation":2789},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/de-de/","feature",{"text":2344,"config":2791},{"href":2346,"dataGaName":2024,"dataGaLocation":2789},1786803740728]