在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

git rebase與相關git merge命令比較

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2023-05-26 16:22 ? 次閱讀

#前言

git rebase命令經常被認為是Git的巫術,初學者應該遠離它,但它實際上可以讓開發團隊在使用時更加輕松。今天,我們將git rebase與相關git merge命令進行比較。

#概念

首先要理解的是git rebase和git merge解決了同樣的問題。這兩個命令都旨在將更改從一個分支集成到另一個分支 - 它們只是以不同的方式進行。試想一下當你開始在專用分支中開發新功能時另一個團隊成員以新提交更新master分支會發生什么。這會出現分叉歷史記錄,對于使用Git作為協作工具的任何人來說都應該很熟悉。

1d6a3248-fae1-11ed-90ce-dac502259ad0.jpg


當合并master分支到你的feature分支時,你有兩個選擇:merge或rebase。

#Merge

最簡單最常用的是將master分支合并到feature分支中:

git checkout feature
git merge master
或者,你可以簡化為一行:
git merge master feature

這會在feature分支中創建一個新的“merge commit”,它將兩個分支的歷史聯系在一起,為你生成如下所示的分支結構:

1d7a38b4-fae1-11ed-90ce-dac502259ad0.jpg



合并很好,因為它是一種非破壞性的操作。現有分支結構不會以任何方式更改。這避免了rebase的所有潛在缺陷(下面細說)。另一方面,這也意味著每次上游更改時feature都需要合并,且有無關的合并提交。如果master改動非常頻繁,這可能會嚴重污染你分支的歷史記錄。盡管可以使用高級git log選項減輕此問題的影響,但它可能使其他開發人員難以理解項目的歷史更改記錄。

#Rebase

作為merge的替代方法,你可以使用以下命令將feature分支rebase到master分支上:

git checkout feature
git rebase master

這會將整個feature分支移動到master分支的頂端,從而有效地整合了所有master的新提交。但是,rebase不是使用merge commit,而是通過為原始分支中的每個提交創建全新的提交來重寫項目歷史記錄。

1d8a3476-fae1-11ed-90ce-dac502259ad0.jpg



rebase的主要好處是可以獲得更清晰的項目歷史記錄。首先,它消除了不必要的git merge產生的merge commit。其次,正如在上圖中所看到的,rebase也會產生完美線性的項目歷史記錄 - 你可以從feature分支頂端一直跟隨到項目的開始而沒有任何的分叉。

這使得它比命令git log,git bisect和gitk更容易瀏覽項目。但是,對這個原始的提交歷史記錄有兩個權衡:安全性和可追溯性。如果你不遵循rebase的黃金法則,重寫項目歷史記錄可能會對你的協作工作流程造成災難性后果。其次rebase會丟失merge commit提供的上下文 - 你無法看到上游更改何時合并到功能中。

#Interactive Rebase

Interactive rebase使你有機會在將提交移動到新分支時更改提交。這比自動rebase更強大,因為它提供了對分支提交歷史的完全控制。通常,這用于在合并特征分支到master分支之前清理雜亂的歷史記錄。要開始基于交互式會話,請將i選項傳遞給git rebase命令:

git checkout feature
git rebase -i master

這將打開一個文本編輯器,列出即將移動的所有提交:

pick 33d5b7a Message for commit #1
pick 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3

列表準確給出了執行rebase后分支的概況。通過更改pick命令和(或)重新排序,可以使分支的歷史記錄成為你想要的內容。例如,如果第二次提交修復了第一次提交中的一個小問題,你可以使用以下fixup命令將它們壓縮為單個提交:

pick 33d5b7a Message for commit #1
fixup 9480b3d Message for commit #2
pick 5c67e61 Message for commit #3

保存并關閉文件時,Git將根據你的指令執行rebase,從而產生如下所示的項目歷史記錄:

1d95fcf2-fae1-11ed-90ce-dac502259ad0.jpg


消除這種無意義的提交使你的歷史記錄更可讀。這是git merge無法做到的事情。


rebase的黃金法則

一旦你理解了什么是rebase,最重要的是了解什么時候不使用它。git rebase的黃金法則是永遠不要在公共分支使用它。例如,想想如果你把master分支rebase到你的feature分支會發生什么:

1da1d8b0-fae1-11ed-90ce-dac502259ad0.jpg


rebase將master所有提交移動到feature頂端。問題是這只發生在你的倉庫中。所有其他開發人員仍在使用原始版本master。由于rebase導致全新的提交,

Git會認為你的master分支的歷史與其他人的歷史不同。同步兩個master分支的唯一方法是將它們合并在一起,從而產生額外的合并提交和兩組包含相同更改的提交(原始提交和來自rebase分支的更改)。

這將是一個非常令人困惑的情況。因此,在你運行git rebase之前,總是問自己,“還有其他人在用這個分支嗎?”如果答案是肯定的,那就把你的手從鍵盤上移開,考慮使用非破壞性的方式進行(例如,git revert命令)。否則,你可以隨心所欲地重寫歷史記錄。


強制推


如果你嘗試將rebase過的master分支推到遠程倉庫,Git將阻止你這樣做,因為它與遠程master分支沖突。但是,你可以通過傳遞--force標志來強制推送,如下所示:

#這個命令要非常小心!
git push --force

這將覆蓋遠程master分支以匹配rebase過的分支,并使團隊的其他成員感到困惑。因此,只有在確切知道自己在做什么時才能非常小心地使用此命令。

工作流rebase可以根據你團隊的需要盡多地或少量地整合到你現有的Git工作流程中。在本節中,我們將了解rebase在功能開發的各個階段的好處。任何工作流程git rebase的第一步是為每個功能創建專用分支。這為你提供了必要的分支結構,以安全地利用rebase:

1db1759a-fae1-11ed-90ce-dac502259ad0.jpg



本地清理

將rebase加入工作流程的最佳方法之一是清理本地正在進行的功能。通過定期執行交互式rebase,你可以確保功能中的每個提交都具有針對性和意義。這使你可以寫代碼而無需擔心將其分解為隔離多個的提交 - 你可以在事后修復它。

調用git rebase時,有兩個基(base)選項:feature的父分支(例如master),或feature中的歷史提交。我們在Interactive Rebasing部分看到了第一個選項的示例。當你只需要修復最后幾次提交時,后一種選擇很好。例如,以下命令僅針對最后3次提交的交互式rebase。

git checkout feature
git rebase -i HEAD~3

通過指定HEAD~3為新的基,你實際上并沒有移動分支 - 你只是交互式地重寫其后的3個提交。請注意,這不會將上游更改合并到feature分支中。

1dc2fc34-fae1-11ed-90ce-dac502259ad0.jpg

如果要使用此方法重寫整個功能,git merge-base命令可用于查找feature分支的原始基。以下內容返回原始基礎的提交ID,然后你可以將其傳遞給

git rebase:
git merge-base feature master

交互式rebase的使用是引入git rebase工作流的好方法,因為它只影響本地分支。其他開發人員唯一能看到的就是你的成品,這應該是一個簡潔易懂的分支歷史記錄。
但同樣,這僅適用于私有功能分支。如果你通過相同的分支與其他開發人員協作,則該分支是公共的,并且你能重寫其歷史記錄。

#總結

這就是你需要知道的關于rebase你的分支。如果你更喜歡提交的干凈,消除不必要合并的線性歷史記錄,那么你在繼承另一分支的更改時應該使用git rebase 而不是git merge。

另一方面,如果你想保留項目的完整歷史記錄并避免重寫公共提交的風險,你可以仍然使用git merge。這兩種選擇都是完全可以的,但至少可以選擇利用git rebase有它的好處。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Git
    Git
    +關注

    關注

    0

    文章

    199

    瀏覽量

    15761
  • Feature
    +關注

    關注

    1

    文章

    80

    瀏覽量

    7844

原文標題:git只知道merge,試試rebase!

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Git常用命令總結

    在之前的文章中,我們討論了一些初學者必備的 Git 命令。然而,這些命令僅僅觸及了 Git 功能的皮毛。
    發表于 07-21 10:30 ?303次閱讀

    Git常用的超級實用命令

    的一些Git工作流。 1 Git 常用的超級實用命令 1.1 與倉庫相關的操作 克隆代碼倉庫到本地,開發必用 git clone 查看本地倉
    的頭像 發表于 10-09 17:19 ?1166次閱讀
    <b class='flag-5'>Git</b>常用的超級實用<b class='flag-5'>命令</b>

    git命令的基本使用

    git config 第一次使用git或者剛安裝的git時,使用此命令設置身份Name 和 Eamail 地址。并且每次提交時會使用此信息。
    的頭像 發表于 12-11 13:53 ?914次閱讀

    開發人員在使用Git時幾種常見錯誤

    如果你想把一個分支的修改合并到當前分支,你可以用git rebase。它和git merge的區別是merge有一個合并commit的步驟,
    的頭像 發表于 11-08 09:17 ?2796次閱讀

    Git命令解析-mergerebase

    同步,并形成無分支記錄的提交鏈。執行時在控制臺輸出Fast-forward標識。這種merge方式下不會產生沖突,git log命令會看到如下記錄:但在團隊合作開發時,通常會多人修改同一遠程分支。其中
    的頭像 發表于 07-29 18:21 ?1081次閱讀
    <b class='flag-5'>Git</b><b class='flag-5'>命令</b>解析-<b class='flag-5'>merge</b>、<b class='flag-5'>rebase</b>

    Git命令解析-patch、apply、diff

    無論是merge還是rebase,都是在同一個工作目錄中協調差異,處理變更歷史。而git的另一些命令,允許開發者單獨保存,或者通過文件或郵件的方式與別人分享這些差異。
    的頭像 發表于 06-15 09:28 ?2854次閱讀

    Git 命令+原理 程序員必備的基礎

    是什么? Git相關理論基礎 日常開發中,Git的基本常用命令 Git進階之分支處理 Git
    的頭像 發表于 11-14 10:01 ?1755次閱讀
    <b class='flag-5'>Git</b> <b class='flag-5'>命令</b>+原理 程序員必備的基礎

    帶你一步一步了解Git的底層原理

    作為當前世界上最強大的代碼管理工具Git相信大家都很熟悉,但據我所知有很大一批人停留在clone、commit、pull、push.。.的階段,是不是對rebase心里沒底只敢用merge? 碰見
    的頭像 發表于 05-10 17:55 ?3027次閱讀
    帶你一步一步了解<b class='flag-5'>Git</b>的底層原理

    通俗易懂的Git各指令的本質

    0前言 作為當前世界上最強大的代碼管理工具Git相信大家都很熟悉,但據我所知有很大一批人停留在clone、commit、pull、push.。。的階段,是不是對rebase心里沒底只敢用merge
    的頭像 發表于 06-24 18:06 ?1443次閱讀

    Git高效命令的使用技巧

    今天浩道跟大家分享關于Git高效命令的硬核干貨,掌握這些技巧,使你事半功倍!
    的頭像 發表于 02-28 16:41 ?931次閱讀

    git命令和參數

    ? ? 不知道大家平時都是怎么去學習git的,要記憶那么多的命令和參數,我個人是不推薦死記硬背的,以往經驗證明卷的越瘋狂忘的也越快! 其實簡單的理解工作原理和熟練運用少部分常用命令,日常開發問題不大
    的頭像 發表于 05-31 14:22 ?559次閱讀

    git rebasegit merge的區別

    ? 解決沖突 git rebasegit merge的區別 分支合并 git merge是用來
    的頭像 發表于 07-05 09:54 ?643次閱讀
    <b class='flag-5'>git</b> <b class='flag-5'>rebase</b>和<b class='flag-5'>git</b> <b class='flag-5'>merge</b>的區別

    Git命令的綜合手冊怎么找

    若你使用 Git 時需要獲取幫助,有三種等價的方法可以找到 Git 命令的綜合手冊(manpage): $ git help $ git -
    的頭像 發表于 07-22 11:02 ?646次閱讀

    git基本操作命令用法

    基本用法 上面的四條命令在工作目錄、暫存目錄(也叫做索引)和倉庫之間復制文件。 git add files把當前文件放入暫存區域。 git commit給暫存區域生成快照并提交。 git
    的頭像 發表于 09-13 16:29 ?786次閱讀
    <b class='flag-5'>git</b>基本操作<b class='flag-5'>命令</b>用法

    Git中最常用的命令介紹

    git add命令用于將修改的文件添加到下一次提交的暫存區。你可以指定要添加的文件git add命令用于將修改的文件添加到下一次提交的暫存區。你可以指定要添加的文件,例如
    發表于 10-26 10:27 ?290次閱讀
    <b class='flag-5'>Git</b>中最常用的<b class='flag-5'>命令</b>介紹
    主站蜘蛛池模板: 亚洲人成网站在线| 四虎影院网站| 欧美一区福利| 成人拍拍视频| 1024手机免费看片| 性欧美www| 国产精品免费拍拍拍| 国产毛片哪里有| 在线观看三级视频| 狠狠色丁香六月色| 久久精品看片| 亚洲字幕久久| 第九色| 性欧美一区| 四虎黄色| 天天射天天射| 美女扒开尿口给男人看大全| 欧美资源在线| 色花堂国产精品首页第一页| 黄色香蕉网| 美女被曹| 一级毛片看真人在线视频| 狠狠色综合久久久久尤物| 国产高清在线精品| 婷婷99精品国产97久久综合| 4虎 影视 免费| 亚洲国产欧美在线人成aaa | 亚洲欧美在线视频免费| 国产福利你懂的| 68日本xxxxxxxxx777| 欧美一级片在线视频| 九九精品国产兔费观看久久| 我想看三级特黄| 五月天婷婷网亚洲综合在线| 韩国男女无遮挡高清性视频| 国产欧美色图| 69xxx日本护士| 激情五月开心网| h黄色| 激情综合五月网| 丁香五月缴情在线|