開發中關於Git那些事(續:Git變基)

来源:https://www.cnblogs.com/chao8888/archive/2018/01/04/8175796.html
-Advertisement-
Play Games

其實上一篇寫的內容僅僅是Git的冰山一角,如果你認為Git就是簡簡單單的幾行命令,那隻能說明你還沒有真正瞭解Git這個強大的內容定址文件系統。這篇文章,還是接著介紹一些實用但是很少有人知曉的一些命令,好比說具有魔性的Git變基(git rebase)以及常用的GUI。 我之前詢問過一些人,討論到Gi ...


其實上一篇《開發中關於Git那些事》寫的內容僅僅是Git的冰山一角,如果你認為Git就是簡簡單單的幾行命令,那隻能說明你還沒有真正瞭解Git這個強大的內容定址文件系統。這篇文章,還是接著介紹一些實用但是很少有人知曉的一些命令,好比說具有魔性的Git變基(git rebase)以及常用的GUI。
我之前詢問過一些人,討論到Git這塊,他們當中有的直接使用GUI,說簡單省事。其實,每一個GUI都有它的側重點,並不是所有的GUI都適合用。我倒是建議大家使用命令行。何況有些功能GUI不一定支持,而且有時候一行命令的事,還要點來點去,也不省事。之前看到過一篇文章,是關於如何使用Vim編輯器的,對,大家平時開發習慣了IDE,愛上了IDE。但是好的程式員怎麼會因為簡單省事而放棄學習呢。這樣說可能更好提現,學習任意一款IDE,你都需要耗時很久,但是如果你平時習慣了使用Vim編輯器,愛上用Vim編輯器寫代碼,那麼任意一款集成Vim編輯器的IDE,一上來就會非常順手。同樣的道理,如果你瞭解了Git內部原理,平時習慣使用命令處理,那麼給你任意一款GitGUI,相信你一看就會用,而且很快就上手。所以,學習順序有時候很重要,基礎扎實了,才不會被問題難倒,地基決定高度。

1.客戶端配置


1.1 修改預設編輯器

預設使用Vim編輯器,當然可以使用core.editor修改

git config --global core.editor emacs

1.2 修改log分頁

預設使用less,可以使用core.pager來設置為more或則其他,也可以使用空字元串,關閉分頁,一次性載入所有內容

git config --global core.pager ''

1.3 Git 中的著色

使用到color.ui,預設auto,如果你不喜歡可以使用false關閉。

git config --global color.ui false

其實如果想具體到某些特定命令,都是有true、false 或 always可以設置的,比如以下

color.branch
color.diff
color.interactive
color.status

以上每個配置項都有子選項,它們可以被用來覆蓋其父設置,以達到為輸出的各個部分著色的目的。例如,為了讓 diff 的輸出信息以藍色前景、黑色背景和粗體顯示,你可以運行

git config --global color.diff.meta "blue black bold"

你能設置的顏色有:normal、black、red、green、yellow、blue、magenta、cyan 或 white。正如以 上例子設置的粗體屬性,想要設置字體屬性的話,可以選擇包括:bold、dim、ul(下劃線)、blink 、reverse(交換前景色和背景色)。

2.實用命令


git branch -v該命令顯示本地分支最後一次提交說明

* dev    cdc7241a fixbug
  master f586f6b5 ****

如果需要顯示本地和遠程,加上-a即git branch -v -a

* dev                   cdc7241a fixbug
  master                f586f6b5 ****
  remotes/origin/HEAD   -> origin/master
  remotes/origin/dev    cdc7241a fixbug
  remotes/origin/master f586f6b5 ****
  remotes/origin/oldIm  97d131bb 2.5.1 封版

git branch -vv除了具有git branch -v命令的作用,還可以顯示出每一個分支正在跟蹤哪個遠程分支,以及本地分支與遠程分支是否是領先、落後。同樣,如果想看遠程加上-a,也就是all(所有),反正我就是這麼記憶的

* dev    6512ef90 [origin/dev: ahead 1] test
  master 78b4b30a [origin/master] 171227122 2.12.2 封版

3.Git變基(Rebasing)


實用舉例1


其實在Git當中整合兩個分支的方式除了merge,還有一種方式,那就是rebase。如上圖,現在要合併C3和C4,如果使用merge合併是這樣子的。它會把兩個分支的最新快照(C3 和 C4)以及二者最近的共同祖先(C2)進行三方合併,合併的結果是生成一個新的快照(並提交)。

但是如果使用rebase:你可以提取在 C4 中引入的補丁和修改,然後在 C3 的基礎上再應用一次。在 Git 中,這種操作就叫做變基。你可以使用 rebase 命令將提交到某一分支上的所有修改都移至另一分支上,就好像“重新播放”一樣。
執行步驟就是,首先切換的experiment分支git checkout experiment,然後運行git rebase master,此時準備“重演”,接下來就是看你要在哪個分支重演,就切換到哪個分支,這邊在主分支重演,切換到主分支git checkout master,然後整合即可git merge experiment。其實此時的merge和之前的merge不一樣,這邊的merge只需要進行一次fast-forward,就是快速合併,head快速前進到C4'。
它的原理是首先找到這兩個分支(即當前分支 experiment、變基操作的目標基底分支 master)的最近共同祖 先 C2,然後對比當前分支相對於該祖先的歷次提交,提取相應的修改並存為臨時文件,然後將當前分支指向目標基底C3, 最後以此將之前另存為臨時文件的修改依序應用。

git checkout experiment
git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command

git checkout master
git merge experiment


此時,C4' 指向的快照就和上面使用merge命令的例子中 C5 指向的快照一模一樣了。這兩種整合方法的最終結果沒有任何區別,但是變基使得提交歷史更加整潔。你在查看一個經過變基的分支的歷史記錄時會發現,儘管實際的開發工作是並行的,但它們看上去就像是先後串列的一樣,提交歷史是一條直線沒有分叉。

實用舉例2

直接看下圖,現在我有這樣的需求,就是將C8,C9提交到主分支,但是不要C3,你如何做?

其實辦法總是有的,在前篇文章中,有講到git stash命令,其實,我們可以在client分支找到C3的哈希值直接執行git reset 哈希值(C3)然後把C8,C9的修改直接git stash 貯存起來,切換到master分支,來個git stash pop搞定。現在我們使用變基來操作,感受下變基的魔性。

git rebase --onto master server client

以上命令含義:取出 client 分支,找出處於 client 分支和 server 分支的共同祖先之後的修改,然後把它們在 master 分支上重演一遍。

現在可以快進合併 master 分支了。

git checkout master
git merge client 

實用舉例3

再舉一個例子,也是關於git rebase --onto的使用

                                   H---I---J topicB
                                  /
                         E---F---G  topicA
                        /
           A---B---C---D  master

    git rebase --onto master topicA topicB

                        H'--I'--J'  topicB
                       /
                       | E---F---G  topicA
                       |/
           A---B---C---D  master
     This is useful when topicB does not depend on topicA.

這樣的例子好多,感興趣可以使用git rebase --help查看。
註意事項
這點一定要看,不要對在你的倉庫外還有副本的分支執行變基。也就是說,一個人開發隨便搞,多人開發有原則的搞。如果你不遵循這個原則,多人開發出現問題別來找我。
為什麼呢?假如有個人在本地使用了merge合併分支後,push到了遠程伺服器,後來他感覺不爽,想通過變基處理,恰是這個時候你pull了伺服器的代碼,那就會出現問題。問題就是,以後看記錄會出現相同的提交,本來張三想丟棄的東西被你保留了。如果想看詳細舉例,推薦查看Pro Git這本書中關於Git變基一節。
總之,只要是你的代碼和你建立的分支,還沒有執行push之前,隨意搞,push後就不要再想著使用變基了,避免出問題。如果你更喜歡merge,喜歡看Git實際發生的事,那就使用merge吧。反之,你更喜歡流水線一樣的記錄,從前到後,沒有一堆堆複雜的合併,那就用rebase。

4.GitGUI


十幾款GUI,點開查看即可。
SourceTree
GitHub Desktop
TortoiseGit
GitUp
......
我比較喜歡GitUp,簡潔些。但是我仍舊在使用命令行,就當為了給電腦省空間吧。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在處理一個分表的問題時,需要為程式創建一個自動分表的存儲過程,需要保證所有表結構,約束,索引等等一致,此外視圖,存儲過程,許可權等等問題暫不用考慮。 在Mysql中,創建分表的存儲過程,相當簡單:create table if not exists <new_table_name> like <o ...
  • 本博文介紹了Group Replication的兩種工作模式的架構。 並詳細介紹了Single-Master Mode的部署過程,以及如何切換到Multi-Master Mode。 當然,文末給出了Group Replication的配置要求和一些限制。 〇 結構介紹 在2016年12月發佈的5.7 ...
  • 背景 假如我們有關鍵數據存儲在一個表裡面,比如人員表中包含員工、部門和薪水信息。只允許用戶訪問各自部門的信息,但是不能訪問其他部門。一般我們都是在程式端實現這個功能,而在sqlserver2016以後也可以直接在資料庫端實現這個功能。 解決 安全已經是一個數據方面的核心問題,每一代的MS資料庫都有關 ...
  • 智慧城市時空大數據與雲平臺建設技術大綱(2017年8月版) ...
  • 今天不寫教程,和大伙分享一下IOS在記憶體泄漏方面的文章..... ...
  • 前言: 可能大家看到標題會有些懵逼,以為我發錯了,這應該是五才對吧,其實,五我已經發了,不過被管理大大移出首頁了,不知道這一篇是不是也會是同樣的命運。。 今天所寫的是關於支付寶內購的破解 原版 鏈接: https://pan.baidu.com/s/1nuUEnyh 密碼: 6666 破解版 鏈接: ...
  • 做項目的時候,有時需要用到第三方介面,而基本第三方介面都是要求我們要先進行簽名。結果每次調試都得手動進行簽名一次,實在麻煩。所以android studio提供了一種在運行的時候自動進行簽名的方法,在build.gradle(Module:app)中進行配置,剛剛開始我們不知道如何直接用代碼配置,那 ...
  • 高仿二次元網易GACHA,所有介面均通過Charles抓取而來,圖片資源通過 https://github.com/yuedong56/Assets.carTool 工具提取。 詳情見github地址:https://github.com/Brances/ZMBCY iOS 本項目全部由純代碼編寫, ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...