Was machen Git-Rebase und Git-Merge? Was ist der Unterschied?
Jul 15, 2022 am 10:36 AMWofür werden Git-Rebase und Git-Merge verwendet? Was ist der Unterschied zwischen Git-Rebase und Git-Merge? Der folgende Artikel wird Ihnen den Unterschied zwischen Git-Rebase und Git-Merge vorstellen. Ich hoffe, er wird Ihnen hilfreich sein!
Die Verwendung von Git zur Versionskontrolle sollte einer der Arbeitsabl?ufe sein, denen die meisten Ingenieure jeden Tag begegnen, aber was ich verwende, ist nichts anderes als push
, pull
, merge, checkout
oder log
und andere Befehle. Wenn Sie n?her darauf eingehen, k?nnen Sie das nicht herausfinden Interview: ?Kennst du den Unterschied zwischen Merge und Rebase?“ push
、pull
、merge
、checkout
或 log
等幾個指令,更深入一點就一問三不知了,在面試時被問到了這個問題:「你知道 Git 的 merge 和 rebase 有什麼不同嗎?」
聽完后我直接困惑,對我來說 rebase 就是用來整理 commit 的工具,居然還可以和 merge 做比較?【推薦學(xué)習(xí):《Git教程》】
git-rebase
先來說說平常我會用 rebase 這個指令來干嘛,假如我新增了一個單元測試,然后 commit
,這時候 log
就會多一條 commit
的紀錄:
但是在 commit 完才發(fā)現(xiàn),我少寫了另一個測試案例,因此在補上之后,我又 commit 了一次:
這時記錄中會多出另外一條 commit
,不過對我來說,這兩個 commit
在做的其實是同一件事,于是我在 push 到 remote 之前,就會想要先整理一下 commit,把這兩條記錄合并起來。
要把這兩條記錄合并起來有兩個方法,第一個是 reset
到添加第一個測試案例之前,然后直接做一次 commit
。第二個方法就是用 rebase
來處理!
首先讓我們看看目前的 log:
我的目的是把 9dc67ff
和 87af945
整理成一個,所以要調(diào)整的 commit ?是從 init, 也就是 ?commit id為 7eb57cb
之后的所有 commit,搭配上 rebase
指令的話就是:
git?rebase?-i?7eb57cb
輸入完后就會跳到 vim 的編輯畫面:
畫面上會看到 7eb57cb
后的所有 commit(目前就只有 ?9dc67ff
和 87af945
),接著把 9dc67ff
的 pick
改成 squash
,表示把它與前一個 commit 做合并。先點一下 i 后開始用 vim 編輯內(nèi)容:
編輯完后,可以點 esc 再輸入 :wq
做保存,如果只是好奇進來玩看看,不想保存的話就輸入 :q!
。結(jié)束上面的流程后,再查看一次 log,會發(fā)現(xiàn)兩條 commit 變成一筆了。保存完會跳到 commit message 的畫面,這邊可以讓你輸入合并后的 commit message,但我就不改了,一樣直接保存:
結(jié)束上方的流程后,再查看一次 log,會發(fā)現(xiàn)兩筆 commit 變成一筆了:
先 nice,上述的操作為 rebase 的 interactive mode,在 git rebase 后輸入的 -i 其實就是 interactive
的縮寫。
git-merge
大家應(yīng)該對 merge 指令都非常熟悉,因為在做新功能的時候,通常都會拉一個分支出去,完成后再 merge
git-rebase

commit
und dann log
verwendet ein weiterer Datensatz von commit
: ??

commit
im Datensatz geben, aber für mich sind diese beiden commit
Eigentlich mache ich das Gleiche, also m?chte ich, bevor ich auf Remote pushe, die Commits sortieren und die beiden Datens?tze zusammenführen. ????Es gibt zwei M?glichkeiten, diese beiden Datens?tze zusammenzuführen. Die erste besteht darin, vor dem Hinzufügen des ersten Testfalls einen zurückzusetzen
und dann direkt einen commit
durchzuführen. Die zweite Methode besteht darin, rebase
zu verwenden, um damit umzugehen! ????Lassen Sie uns zun?chst einen Blick auf das aktuelle Protokoll werfen: ????
9dc67ff
und 87af945
in einem zu organisieren Die anzupassenden Commits stammen also von init, d. h. alle Commits nach der Commit-ID lauten 7eb57cb
. In Kombination mit dem Befehl rebase
ergibt sich Folgendes: ?? git?checkout?string-library??Nach der Eingabe springt es. Gehen Sie zum VIM-Bearbeitungsbildschirm: ????

7eb57cb
auf dem Bildschirm (derzeit nur ). 9dc67ff
und 87af945) und ?ndern Sie dann den pick
von 9dc67ff
in squash
, was Zusammenführen bedeutet es mit dem vorherigen Commit. Klicken Sie zuerst auf ?i“ und beginnen Sie dann mit der Bearbeitung von Inhalten mit vim: ????
:wq
eingeben. Wenn Sie nur neugierig sind , kommen Sie herein und spielen Sie. Wenn Sie es nicht speichern m?chten, geben Sie :q!
ein. Nachdem Sie den obigen Vorgang abgeschlossen haben, überprüfen Sie das Protokoll erneut und Sie werden feststellen, dass die beiden Commits zu einem geworden sind. Nach dem Speichern gelangen Sie zum Commit-Nachrichtenbildschirm. Hier k?nnen Sie die zusammengeführte Commit-Nachricht eingeben, ich werde sie jedoch nicht ?ndern und direkt speichern: ????

interaktiv
. ??git-merge
??Jeder sollte mit dem Merge-Befehl bestens vertraut sein, denn beim Erstellen neuer Features zieht man normalerweise einen Zweig heraus undmerge nach Abschluss
Kehren Sie zum Hauptzweig zurück, z. B. ?master“ oder ?develop“. Der Vorgang ist wie folgt: ????????在 merge 的時候會有兩種情況,第一種是 ?fast-forward
,會把被合并分支的 HEAD 的 reference 移到要合併分支內(nèi)最新的 commit 上,上方操作的 merge 結(jié)果就是 fast-forward
,master 的 HEAD 被移到 string-library 的最新 commit,畫成圖的話就是這樣子:
但是如果在執(zhí)行 merge 的時候產(chǎn)生沖突,那分支的合并行為就會和 fast-forward 有點不同了。舉例來說,我分別在 master 和 string-library 的同一個文件添加內(nèi)容,那當我執(zhí)行 merge 的時候就會要求先修復(fù)沖突:
修復(fù)完后,再執(zhí)行 commit 完成合并,而這一次合并時,會再多一個 commit 是有關(guān) merge 了 string-library 分支的紀錄:
這個情況畫成圖就會像這樣子:
git-rebase 與 git-merge 的差異
看完上方對 rebase
和 merge
的介紹后,你也許會想說:
「咦?那這兩個不是完全不同的東西嗎?」
對的,原本我也是這麼認為,一直到我去看了 git-rebase 的文檔,才發(fā)現(xiàn)原來我一直誤會它了。在 git book 的 rebase 篇章,第一段就說明了,在 Git 里有兩種方法可以用來整合兩個分支,而這兩個在上方都有提到,分別為 merge
和 rebase
:
從上方的 merge 例子已經(jīng)知道了,merge 在合并的時候會有 fast-forward
,和沖突時用一個 commit 記錄合并變更的兩種情形。而 rebase 的整合方式非常有趣,依照關(guān)于 rebase 的另一段說明,它可以「把某個分支中所有 commit 的過程,以另一個分支的 commit 為基礎(chǔ)重播一遍」:
這是什麼意思呢?首先讓我們回到上述的例子,并在 master 分支上用 reset
,讓 master 的版本回到合并 string-library 之前:
現(xiàn)在我們要用 rebase 指令,將 string-library 所有的 commit 修改,以 master 的 commit 為基礎(chǔ)跑一次。使用 rebase 合并的第一步,要先切到想重播 commit 的分支:
git?checkout?string-library
然后再輸入 git rebase
指令,并于后方指定要在哪個分支上重播:
git?rebase?master
執(zhí)行結(jié)果:
在 rebase 重播 commit 的過程中,和 merge 相似的地方在于,如果有沖突的話還是需要解決,但在解決后,并不是使用 commit 指令進行合并,而是要輸入 git rebase --continue,讓 rebase 可以繼續(xù)重播接下來的 commit:
重播完成時,會顯示目前重播到哪個 commit,以 string-library
來說就是最新的add string unit test D
。這時候的分支關(guān)系,畫成圖就會變成:
上圖在經(jīng)過 rebase 之后,string-library
里 07e38fb 修改,會以 master 的 commit 為基底再重播一次。
需要注意的是,重播后的 commit id 會和原本的不一樣,這等于完全改寫了分支內(nèi)所有的 commit 歷史紀錄。
Au?erdem wurde string-library
nach der Ausführung des Rebase nicht wirklich wieder mit dem Master-Zweig zusammengeführt, sodass Sie immer noch zurück zum Master-Zweig wechseln müssen, um Merge auszuführen, um die Zusammenführung abzuschlie?en: string-library
其實還沒有被合并回 master 分支上,因此還是要再切回 master 執(zhí)行 merge,以完成合併:
因為已經(jīng)先用 rebase 在重播時處理完 commit 的沖突了,所以現(xiàn)在 merge 就會直接走 fast-forward 合并,也不會另外多一個 merge 的 commit 紀錄。
使用 git-rebase 合併的優(yōu)缺點
優(yōu)點
不會在合併時產(chǎn)生多馀的 commit。
可以在重播的時候以 commit 為單位處理沖突。
合併時會依分支的 commit 排列,能夠比較清楚的 review issue 或 feature 處理的過程。如果使用 merge,在合併后就會依照時間順序穿插排列兩個分支的 commit。
在貢獻開源項目的時候,如果在 push 前先做 rebase,那作者就能夠直接以 fast-forward 的方式合并,不需要再另外解沖突。
缺點
最大的缺點就是上方提到的,使用 rebase 會修改 commit 的歷史紀錄,如果在自己的 local 整理 commit 或是分支那還好,但如果不小心去異動到 remote 的分支,然后又更不小心用了 git push -f
,那可能就會被同事討厭,或被投稿到純靠北工程師。
該用 git-rebase 或 git-merge?
在查了一些資料后,發(fā)現(xiàn) rebase 和 merge 都各有擁護者,我先闡述他們的想法,再主觀提一下自己的觀點。
git-merge 派
支持 git-merge
派的工程師們認為,版本紀錄有價值的地方就在于項目的 commit,也就是這個項目的「歷史實際上發(fā)生過哪些事情」,如果你去修改了這些歷史紀錄那就很不好。因此即使不同分支的內(nèi)容在 merge 后都混在一起,但這些內(nèi)容仍然說明了這個項目的歷史。
git-rebase 派
支持 git-rebase

Da Rebase verwendet wurde, um die Commit-Konflikte w?hrend der Wiedergabe zu behandeln, geht die Zusammenführung jetzt direkt zur Fast-Forward-Merge über, und es wird keinen weiteren Commit-Datensatz für die Zusammenführung geben.
Vor- und Nachteile der Verwendung von git-rebase zum ZusammenführenVorteile- W?hrend des werden keine redundanten Commits generiert zusammenführen.
- Konflikte k?nnen w?hrend der Wiedergabe in Commit-Einheiten behandelt werden. ??
- ??Beim Zusammenführen wird es entsprechend dem Commit des Zweigs angeordnet, sodass das überprüfungsproblem oder der Feature-Verarbeitungsprozess klar verstanden werden kann. Wenn Sie Merge verwenden, werden die Commits der beiden Zweige nach der Zusammenführung in chronologischer Reihenfolge angeordnet. ??
- ??Wenn Sie zu einem Open-Source-Projekt beitragen und vor dem Pushen eine Rebase durchführen, kann der Autor direkt und im Schnellvorlauf zusammenführen, ohne Konflikte separat l?sen zu müssen. ??
git push -f
verwenden, werden Sie m?glicherweise von Ihren Kollegen gehasst oder einem rein nordischen Ingenieur unterworfen. ??????Soll ich Git-Rebase oder Git-Merge verwenden? ??????Nachdem ich einige Informationen überprüft hatte, stellte ich fest, dass sowohl Rebase als auch Merge ihre eigenen Unterstützer haben. Ich werde zuerst ihre Ideen erl?utern und dann subjektiv meine eigene Meinung erw?hnen. ??????git-merge Pai?????? unterstützt git-merge
Die Ingenieure von Pai glauben, dass der Wert von Versionsdatens?tzen in den Commits des Projekts liegt, d. h. in der ?Geschichte dieses Projekts, die tats?chlich stattgefunden hat“. ?Was für Dinge“, es w?re sehr schlecht, wenn Sie diese historischen Aufzeichnungen ?ndern würden. Auch wenn die Inhalte verschiedener Zweige nach der Zusammenführung vermischt werden, veranschaulichen sie dennoch die Geschichte des Projekts. ??????Git-Rebase-Fraktion ?????? unterstützt git-rebase
. Bei Commit geht es um den ?Evolutionsprozess“ dieses Projekts Es wurde ge?ndert. Der Commit-Verlauf wurde entfernt, aber was passiert ist, hat sich nicht ge?ndert. Da wir künftigen Generationen eine klarere und pr?gnantere Aufzeichnung zur Verfügung stellen k?nnen, sollten wir dies tun. ??????Pers?nliche subjektive Meinung??????Ich pers?nlich werde Git-Rebase weiterhin verwenden, um Commits zu ?ndern, um die historischen Datens?tze einfacher und leichter lesbar zu machen, aber die Verwendung ist auf die übertragung auf Remote beschr?nkt Heute, egal wie chaotisch es ist, ich werde sie schlie?lich nicht ?ndern. Wenn ich sie nicht nach Belieben ?ndere, respektiere ich andere Mitglieder des Teams. ????【Empfohlene verwandte Video-Tutorials: ??Web-Frontend??】??Das obige ist der detaillierte Inhalt vonWas machen Git-Rebase und Git-Merge? Was ist der Unterschied?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Verwenden Sie den Befehl gitlogs, um Git -Commit -Geschichte anzuzeigen. 1. Die grundlegende Nutzung ist Gitlog, mit dem die Einreichungs -Hash-, Autor-, Datums- und Einreichungsinformationen angezeigt werden k?nnen. 2. Verwenden Sie Gitlog-Eingang, um eine kurze Ansicht zu erhalten. 3.. Filter durch Autor- oder Einreichungsinformationen durch -autor und --grep; 4. Fügen Sie -p hinzu, um Code?nderungen anzuzeigen, -stat, um ?nderungsstatistiken anzuzeigen. 5. Verwenden Sie -Graph und -alle, um den Zweig -Verlauf anzuzeigen oder Visualisierungstools wie Gitkraken und VSCODE zu verwenden.

Um einen Git -Zweig zu l?schen, stellen Sie zun?chst sicher, dass er zusammengeführt wurde oder keine Aufbewahrung erforderlich ist. Verwenden Sie Gitbranch-D, um die lokale zusammengeführte Niederlassung zu l?schen. Wenn Sie l?schende, nicht vererdigte Zweige erzwingen müssen, verwenden Sie den Parameter -d. Remote Branch Deletion verwendet den Befehl gitpushorigin-deleteBranch-name und kann die lokalen Repositorys anderer Personen über Gitfetch-Prune synchronisieren. 1. Um die lokale Niederlassung zu l?schen, müssen Sie best?tigen, ob sie zusammengeführt wurde. 2. Um den Remotezweig zu l?schen, müssen Sie den Parameter -Delete verwenden. 3. Nach dem L?schen sollten Sie überprüfen, ob der Zweig erfolgreich entfernt wird. V. 5. Reinigen Sie nutzlose Zweige regelm??ig, um das Lagerhaus sauber zu halten.

Um einem Git-Repository ein Subtree hinzuzufügen, fügen Sie zuerst das Remote-Repository hinzu und holen Sie sich seinen Verlauf und fusionieren Sie es dann mit den Befehlen gitmerge und gitread tree in ein Unterverzeichnis. Die Schritte sind wie folgt: 1. Verwenden Sie den Befehl gitremoteadd-f, um ein Remote-Repository hinzuzufügen; 2. Führen Sie Gitmerge-Screcursive-No-Commit aus, um Zweiginhalte zu erhalten. 3.. Verwenden Sie GitRead-Tree-Prefix =, um das Verzeichnis anzugeben, um das Projekt als Subtree zusammenzuführen; V. 5. Bei der Aktualisierung zuerst Gitfetch und wiederholen Sie die Verschmelzung und Schritte, um das Update einzureichen. Diese Methode h?lt die externe Projekthistorie vollst?ndig und leicht zu warten.

Um gef?lschte Altcoins zu identifizieren, müssen Sie von sechs Aspekten ausgehen. 1. überprüfen und überprüfen Sie den Hintergrund der Materialien und des Projekts, einschlie?lich wei?er Papiere, offizieller Websites, Code Open Source -Adressen und Teamtransparenz; 2. Beobachten Sie die Online -Plattform und geben Sie dem Mainstream -Austausch Priorit?t. 3.. Achten Sie vor hohen Renditen und Personenverpackungsmodi, um Fondsfallen zu vermeiden. 4. Analysieren Sie den Vertragscode und den Token -Mechanismus, um zu überprüfen, ob es b?swillige Funktionen gibt. 5. überprüfen Sie Community- und Medienoperationen, um falsche Popularit?t zu identifizieren. 6. Befolgen Sie die praktischen Vorschl?ge gegen das Strand, z. B. nicht an Empfehlungen zu glauben oder professionelle Geldb?rsen zu verwenden. Die obigen Schritte k?nnen Betrugsbetrug effektiv vermeiden und die Sicherheit der Verm?genswerte schützen.

Als Pionier in der digitalen Welt standen der einzigartige Codename und die zugrunde liegende Technologie immer im Mittelpunkt der Aufmerksamkeit der Menschen. Sein Standardcode ist BTC, auch als XBT auf bestimmten Plattformen bekannt, die internationale Standards entsprechen. Aus technischer Sicht ist Bitcoin kein einziger Codestil, sondern ein riesiges und ausgeklügeltes Open -Source -Softwareprojekt. Sein Kerncode ist haupts?chlich in C geschrieben und enth?lt Kryptographie, verteilte Systeme und Wirtschaftsgrunds?tze, damit jeder seinen Code anzeigen, überprüfen und beitragen kann.

Was sind die wichtigsten Punkte des Katalogs? UNSELESSCOIN: übersicht und wichtige Funktionen von nutzloser Funktionen von nutzlosen nutzlosen Nutzlosen (nutzlos) zukünftige Preisaussichten: Was wirkt sich auf den Preis von nutzloser Coin im Jahr 2025 und darüber hinaus aus? Zukünftige Preisausblicke Kernfunktionen und Wichtigkeiten von nutzlosen (nutzlos) Wie nutzlos (nutzlos) funktioniert und wie er nützt, wie nutzlos die wesentlichen Vorteile für die Unternehmens -Partnerschaften von Nutzelesscoin wie sie zusammenarbeiten

Es gibt drei Hauptmethoden, um Umgebungsvariablen in PHP festzulegen: 1. Globale Konfiguration über php.ini; 2. durch einen Webserver (z. B. SetEnv von Apache oder FastCGI_Param von Nginx); 3. Verwenden Sie die Funktion Putenv () in PHP -Skripten. Unter ihnen eignet sich Php.ini für globale und selten ?ndernde Konfigurationen. Die Webserverkonfiguration eignet sich für Szenarien, die isoliert werden müssen, und Putenv () ist für tempor?re Variablen geeignet. Die Persistenz -Richtlinien umfassen Konfigurationsdateien (z. B. Php.ini oder Webserverkonfiguration), .env -Dateien werden mit der DOTENV -Bibliothek und dynamische Injektion von Variablen in CI/CD -Prozessen geladen. Sicherheitsmanagement sensible Informationen sollten hart codiert werden, und es wird empfohlen.

Dieser Artikel hat mehrere "Fertig" -Projekt-Websites von Python und "Blockbuster" -Portalen "Blockbuster" für Sie ausgew?hlt. Egal, ob Sie nach Entwicklungsinspiration suchen, den Quellcode auf Master-Ebene beobachten und lernen oder Ihre praktischen F?higkeiten systematisch verbessern, diese Plattformen sind nicht zu übersehen und k?nnen Ihnen helfen, schnell zu einem Python-Meister zu werden.
