国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

目錄
git-rebase
git-merge
git-rebase 與 git-merge 的差異
使用 git-rebase 合併的優(yōu)缺點(diǎn)
該用 git-rebase 或 git-merge?
git-merge 派
git-rebase 派
個人主觀觀點(diǎn)
首頁 開發(fā)工具 Git git-rebase和git-merge是幹嘛的?差異是什麼?

git-rebase和git-merge是幹嘛的?差異是什麼?

Jul 15, 2022 am 10:36 AM
git github

git-rebase和git-merge是干嘛的?git-rebase 與 git-merge 的差異是什么?下面本篇文章給大家介紹一下git-rebase 與 git-merge 的區(qū)別,希望對大家有所幫助!

git-rebase和git-merge是幹嘛的?差異是什麼?

用 Git 做版本控管應(yīng)該是大部分工程師每天都會碰到的工作流程之一,但我在使用上不外乎就是 push、pullmerge、checkoutlog 等幾個指令,更深入一點(diǎn)就一問三不知了,在面試時被問到了這個問題:「你知道 Git 的 merge 和 rebase 有什麼不同嗎?」

聽完后我直接困惑,對我來說 rebase 就是用來整理 commit 的工具,居然還可以和 merge 做比較?【推薦學(xué)習(xí):《Git教程》】

git-rebase

先來說說平常我會用 rebase 這個指令來干嘛,假如我新增了一個單元測試,然后 commit,這時候 log 就會多一條 commit 的紀(jì)錄:

git-rebase和git-merge是幹嘛的?差異是什麼?

但是在 commit 完才發(fā)現(xiàn),我少寫了另一個測試案例,因此在補(bǔ)上之后,我又 commit 了一次:

git-rebase和git-merge是幹嘛的?差異是什麼?

這時記錄中會多出另外一條 commit,不過對我來說,這兩個 commit 在做的其實(shí)是同一件事,于是我在 push 到 remote 之前,就會想要先整理一下 commit,把這兩條記錄合并起來。

要把這兩條記錄合并起來有兩個方法,第一個是 reset 到添加第一個測試案例之前,然后直接做一次 commit。第二個方法就是用 rebase 來處理!

首先讓我們看看目前的 log:

git-rebase和git-merge是幹嘛的?差異是什麼?

我的目的是把 9dc67ff87af945 整理成一個,所以要調(diào)整的 commit ?是從 init, 也就是 ?commit id為 7eb57cb 之后的所有 commit,搭配上 rebase 指令的話就是:

git?rebase?-i?7eb57cb

輸入完后就會跳到 vim 的編輯畫面:

git-rebase和git-merge是幹嘛的?差異是什麼?

畫面上會看到 7eb57cb 后的所有 commit(目前就只有 ?9dc67ff87af945 ),接著把 9dc67ffpick 改成 squash,表示把它與前一個 commit 做合并。先點(diǎn)一下 i 后開始用 vim 編輯內(nèi)容:

git-rebase和git-merge是幹嘛的?差異是什麼?

編輯完后,可以點(diǎn) esc 再輸入 :wq 做保存,如果只是好奇進(jìn)來玩看看,不想保存的話就輸入 :q!。結(jié)束上面的流程后,再查看一次 log,會發(fā)現(xiàn)兩條 commit 變成一筆了。保存完會跳到 commit message 的畫面,這邊可以讓你輸入合并后的 commit message,但我就不改了,一樣直接保存:

git-rebase和git-merge是幹嘛的?差異是什麼?

結(jié)束上方的流程后,再查看一次 log,會發(fā)現(xiàn)兩筆 commit 變成一筆了:

git-rebase和git-merge是幹嘛的?差異是什麼?

先 nice,上述的操作為 rebase 的 interactive mode,在 git rebase 后輸入的 -i 其實(shí)就是 interactive 的縮寫。

git-merge

大家應(yīng)該對 merge 指令都非常熟悉,因?yàn)樵谧鲂鹿δ艿臅r候,通常都會拉一個分支出去,完成后再 merge 回 master 或 develop 等主要分支。操作流程如下:

git-rebase和git-merge是幹嘛的?差異是什麼?

在 merge 的時候會有兩種情況,第一種是 ?fast-forward,會把被合并分支的 HEAD 的 reference 移到要合併分支內(nèi)最新的 commit 上,上方操作的 merge 結(jié)果就是 fast-forward,master 的 HEAD 被移到 string-library 的最新 commit,畫成圖的話就是這樣子:

git-rebase和git-merge是幹嘛的?差異是什麼?

但是如果在執(zhí)行 merge 的時候產(chǎn)生沖突,那分支的合并行為就會和 fast-forward 有點(diǎn)不同了。舉例來說,我分別在 master 和 string-library 的同一個文件添加內(nèi)容,那當(dāng)我執(zhí)行 merge 的時候就會要求先修復(fù)沖突:

git-rebase和git-merge是幹嘛的?差異是什麼?

修復(fù)完后,再執(zhí)行 commit 完成合并,而這一次合并時,會再多一個 commit 是有關(guān) merge 了 string-library 分支的紀(jì)錄:

git-rebase和git-merge是幹嘛的?差異是什麼?

這個情況畫成圖就會像這樣子:

git-rebase和git-merge是幹嘛的?差異是什麼?

git-rebase 與 git-merge 的差異

看完上方對 rebasemerge 的介紹后,你也許會想說:

「咦?那這兩個不是完全不同的東西嗎?」

對的,原本我也是這麼認(rèn)為,一直到我去看了 git-rebase 的文檔,才發(fā)現(xiàn)原來我一直誤會它了。在 git book 的 rebase 篇章,第一段就說明了,在 Git 里有兩種方法可以用來整合兩個分支,而這兩個在上方都有提到,分別為 mergerebase

git-rebase和git-merge是幹嘛的?差異是什麼?

從上方的 merge 例子已經(jīng)知道了,merge 在合并的時候會有 fast-forward,和沖突時用一個 commit 記錄合并變更的兩種情形。而 rebase 的整合方式非常有趣,依照關(guān)于 rebase 的另一段說明,它可以「把某個分支中所有 commit 的過程,以另一個分支的 commit 為基礎(chǔ)重播一遍」:

git-rebase和git-merge是幹嘛的?差異是什麼?

這是什麼意思呢?首先讓我們回到上述的例子,并在 master 分支上用 reset,讓 master 的版本回到合并 string-library 之前:

git-rebase和git-merge是幹嘛的?差異是什麼?

現(xiàn)在我們要用 rebase 指令,將 string-library 所有的 commit 修改,以 master 的 commit 為基礎(chǔ)跑一次。使用 rebase 合并的第一步,要先切到想重播 commit 的分支:

git?checkout?string-library

然后再輸入 git rebase 指令,并于后方指定要在哪個分支上重播:

git?rebase?master

執(zhí)行結(jié)果:

git-rebase和git-merge是幹嘛的?差異是什麼?

在 rebase 重播 commit 的過程中,和 merge 相似的地方在于,如果有沖突的話還是需要解決,但在解決后,并不是使用 commit 指令進(jìn)行合并,而是要輸入 git rebase --continue,讓 rebase 可以繼續(xù)重播接下來的 commit:

git-rebase和git-merge是幹嘛的?差異是什麼?

重播完成時,會顯示目前重播到哪個 commit,以 string-library 來說就是最新的add string unit test D。這時候的分支關(guān)系,畫成圖就會變成:

git-rebase和git-merge是幹嘛的?差異是什麼?

上圖在經(jīng)過 rebase 之后,string-library 里 07e38fb 修改,會以 master 的 commit 為基底再重播一次。

需要注意的是,重播后的 commit id 會和原本的不一樣,這等于完全改寫了分支內(nèi)所有的 commit 歷史紀(jì)錄。

另外,執(zhí)行完 rebase 后,string-library 其實(shí)還沒有被合并回 master 分支上,因此還是要再切回 master 執(zhí)行 merge,以完成合併:

git-rebase和git-merge是幹嘛的?差異是什麼?

因?yàn)橐呀?jīng)先用 rebase 在重播時處理完 commit 的沖突了,所以現(xiàn)在 merge 就會直接走 fast-forward 合并,也不會另外多一個 merge 的 commit 紀(jì)錄。

使用 git-rebase 合併的優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  • 不會在合併時產(chǎn)生多馀的 commit。

  • 可以在重播的時候以 commit 為單位處理沖突。

  • 合併時會依分支的 commit 排列,能夠比較清楚的 review issue 或 feature 處理的過程。如果使用 merge,在合併后就會依照時間順序穿插排列兩個分支的 commit。

  • 在貢獻(xiàn)開源項(xiàng)目的時候,如果在 push 前先做 rebase,那作者就能夠直接以 fast-forward 的方式合并,不需要再另外解沖突。

缺點(diǎn)

最大的缺點(diǎn)就是上方提到的,使用 rebase 會修改 commit 的歷史紀(jì)錄,如果在自己的 local 整理 commit 或是分支那還好,但如果不小心去異動到 remote 的分支,然后又更不小心用了 git push -f,那可能就會被同事討厭,或被投稿到純靠北工程師。

該用 git-rebase 或 git-merge?

在查了一些資料后,發(fā)現(xiàn) rebase 和 merge 都各有擁護(hù)者,我先闡述他們的想法,再主觀提一下自己的觀點(diǎn)。

git-merge 派

支持 git-merge 派的工程師們認(rèn)為,版本紀(jì)錄有價值的地方就在于項(xiàng)目的 commit,也就是這個項(xiàng)目的「歷史實(shí)際上發(fā)生過哪些事情」,如果你去修改了這些歷史紀(jì)錄那就很不好。因此即使不同分支的內(nèi)容在 merge 后都混在一起,但這些內(nèi)容仍然說明了這個項(xiàng)目的歷史。

git-rebase 派

支持 git-rebase 派的工程師則覺得,commit 是在說這個項(xiàng)目的「演進(jìn)過程」,發(fā)生了什麼事情才是重要的,即使修改了 commit 的歷史,但是發(fā)生的事情依然沒有改變,既然可以用更清楚簡潔的紀(jì)錄供后人閱讀,那就應(yīng)該要這麼做。

個人主觀觀點(diǎn)

我個人還是會使用 git-rebase 來修改 commit,讓歷史紀(jì)錄更為簡單好閱讀,但使用上僅限于 push 到 remote 之前,如果今天已經(jīng)把紀(jì)錄 push 到 remote,那即使多亂我也不會去修改它們,畢竟 remote 的紀(jì)錄就是大家共有的,不隨意修改,也是尊重團(tuán)隊(duì)內(nèi)的其他成員。

【相關(guān)視頻教程推薦:web前端

以上是git-rebase和git-merge是幹嘛的?差異是什麼?的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

pycharm第一次打開教程 首次使用必看設(shè)置指南 pycharm第一次打開教程 首次使用必看設(shè)置指南 May 23, 2025 pm 10:48 PM

第一次打開PyCharm時,應(yīng)先創(chuàng)建新項(xiàng)目並選擇虛擬環(huán)境,然後熟悉編輯器區(qū)、工具欄、導(dǎo)航欄和狀態(tài)欄。設(shè)置Darcula主題和Consolas字體,利用智能提示和調(diào)試工具提高效率,並學(xué)習(xí)Git集成。

PHP中如何驗(yàn)證社保號字符串? PHP中如何驗(yàn)證社保號字符串? May 23, 2025 pm 08:21 PM

社保號驗(yàn)證在PHP中通過正則表達(dá)式和簡單邏輯實(shí)現(xiàn)。 1)使用正則表達(dá)式清理輸入,去除非數(shù)字字符。 2)檢查字符串長度是否為18位。 3)計算並驗(yàn)證校驗(yàn)位,確保與輸入的最後一位匹配。

git如何使用圖形化工具對比版本差異 git如何使用圖形化工具對比版本差異 May 22, 2025 pm 10:48 PM

有效使用圖形化工具對比Git版本差異的步驟包括:1.打開GitKraken並加載倉庫,2.選擇要對比的版本,3.查看差異,4.深入分析。圖形化工具如GitKraken提供了直觀的界面和豐富的功能,幫助開發(fā)者更深入地理解代碼的演變過程。

gitstatus查看倉庫狀態(tài)的深入解析 gitstatus查看倉庫狀態(tài)的深入解析 May 22, 2025 pm 10:54 PM

gitstatus命令用於顯示工作目錄和暫存區(qū)的狀態(tài)。 1.它會檢查當(dāng)前分支,2.比較工作目錄和暫存區(qū),3.比較暫存區(qū)和最後一次提交,4.檢查未跟蹤的文件,幫助開發(fā)者了解倉庫狀態(tài)並確保提交前無遺漏。

配置VSCode與GitHub進(jìn)行代碼同步 配置VSCode與GitHub進(jìn)行代碼同步 May 20, 2025 pm 06:33 PM

配置VSCode與GitHub進(jìn)行代碼同步可以提高開發(fā)效率和團(tuán)隊(duì)協(xié)作。首先,安裝"GitHubPullRequestsandIssues"和"GitLens"插件;其次,配置GitHub賬號;然後,克隆或創(chuàng)建倉庫;最後,提交並推送代碼到GitHub。

怎樣開發(fā)一個完整的PythonWeb應(yīng)用程序? 怎樣開發(fā)一個完整的PythonWeb應(yīng)用程序? May 23, 2025 pm 10:39 PM

要開發(fā)一個完整的PythonWeb應(yīng)用程序,應(yīng)遵循以下步驟:1.選擇合適的框架,如Django或Flask。 2.集成數(shù)據(jù)庫,使用ORM如SQLAlchemy。 3.設(shè)計前端,使用Vue或React。 4.進(jìn)行測試,使用pytest或unittest。 5.部署應(yīng)用,使用Docker和平臺如Heroku或AWS。通過這些步驟,可以構(gòu)建出功能強(qiáng)大且高效的Web應(yīng)用。

PHP中如何驗(yàn)證IMEISV字符串? PHP中如何驗(yàn)證IMEISV字符串? May 28, 2025 pm 03:39 PM

在PHP中驗(yàn)證IMEISV字符串需要以下步驟:1.使用正則表達(dá)式驗(yàn)證16位數(shù)字格式。 2.通過Luhn算法校驗(yàn)IMEI部分的有效性。 3.檢查軟件版本號的有效性。完整的驗(yàn)證過程包括格式驗(yàn)證、Luhn校驗(yàn)和軟件版本號檢查,以確保IMEISV的有效性。

git如何在遠(yuǎn)程倉庫上創(chuàng)建和刪除標(biāo)籤 git如何在遠(yuǎn)程倉庫上創(chuàng)建和刪除標(biāo)籤 May 22, 2025 pm 10:33 PM

在遠(yuǎn)程倉庫上創(chuàng)建標(biāo)籤使用gitpushorigin,刪除標(biāo)籤使用gitpushorigin--delete。具體步驟包括:1.創(chuàng)建本地標(biāo)籤:gittagv1.0。2.推送到遠(yuǎn)程:gitpushoriginv1.0。3.刪除本地標(biāo)籤:gittag-dv1.0。4.刪除遠(yuǎn)程標(biāo)籤:gitpushorigin--deletev1.0。

See all articles