Git 完全手冊:從入門到團隊協作實戰(2)

?????????Hello大家好!很高興我們又見面啦!給生活添點passion,開始今天的編程之路!

我的博客:<但凡.

我的專欄:《編程之路》、《數據結構與算法之美》、《C++修煉之路》、《Linux修煉:終端之內 洞悉真理》

感謝你打開這篇博客!希望這篇博客能為你帶來幫助,也歡迎一起交流探討,共同成長。

? ? ? ? 這一期我們主要來說一下git中版本回退和分支的概念。

目錄

1、版本回退

? ? ? ? 1.1、版本回退的操作

? ? ? ? 1.2、版本回退的理解?

2、撤銷修改

3、分支

? ? ? ? 3.1、分支基礎操作

? ? ? ? 3.2、分支深入理解

?????????3.2.1、合并沖突

? ? ? ? 3.2.2、合并模式

? ? ? ? ??3.2.3、bug分支

? ? ? ? 3.2.4、刪除臨時分支


1、版本回退

? ? ? ? 1.1、版本回退的操作

????????如果我們想恢復到上一次提交,我們該怎么做呢?

? ? ? ? 現在,我準備了一個readme文件,并且在文件中分三次提交了test1,test2,test3:

? ? ? ? 我們使用以下命令回退到上一個版本:

git reset --hard HEAD~1

? ? ? ? 但是,沒有那么簡單,我們有三點細節需要說明:

? ? ? ? 第一,我們以上的命令是把工作區,暫存區,版本庫全部回到了上一個版本,但是,在實踐中我們可能只向讓其中一個或兩個回退,那么這個回退的范圍是根據選項來區分的,其中--mixed是默認選項。

? ? ? ? ?那么我們怎么控制回退的版本呢?我們HEAD后面跟的數字就是回退的版本數,沒錯,我們可以一次性回退兩個版本。

? ? ? ? 我們恢復到最開始的樣子,再次回退,但是不回退工作區,只回退暫存區和版本庫:

? ? ? ? 接著使用命令查看工作區和暫存區的內容區別:

git diff

? ? ? ? 我們可以使用命令查看當前的本地倉庫內容,或者叫查看最后一次提交:

git show HEAD

? ? ? ? 我們再使用以下命令,打印版本庫和暫存區的區別

git diff --cached HEAD

? ? ? ? ?第二,我們以上的更改都是對本地倉庫進行的修改,如果我們想遠端更新,就得在強制推送覆蓋遠端內容,使用以下命令:

git push --force origin <branch-name>

?????????但是,這樣很明顯是不安全的,在多協作場景下強制推送會導致其他開發者的進度丟失。我們可以使用以下命令代替:

git revert HEAD

? ? ? ? 我們就不實驗了,以后我們會詳細講。?

? ? ? ? 第三,如果我們版本更新了一百次,但是我們要回到第一次更新,怎么辦呢?

? ? ? ? 我們可以使用命令,打印出歷史上每次更新的commit id

git log --pretty=oneline

? ? ? ? 接著執行以下命令,回退到指定版本:

git reset [選項] commit id

? ? ? ? 現在我們回退到test1提交。

? ? ? ? 然后我后悔了,這時候怎么辦呢?我們可以執行以下命令,查看我們想要回到的那個版本的commit id:

git reflog

? ? ? ? 接著復制commit id,和剛才一樣的操作,回到指定版本。?

? ? ? ? 1.2、版本回退的理解?

?????????git是如何實現以上版本版本回退的操作的呢?

? ? ? ? 我們可以發現,git的版本回退實際上速度是很快的。因為git內部有個指向當前分支的HEAD指針,在refs/heads/master文件中保存著master分支最新的commit id,當我們版本回退時,僅僅是更改一下指針的指向:

2、撤銷修改

? ? ? ? 有時候,我們想撤銷一些區域的修改,比如說我們想讓工作區的新增內容撤銷,而不改變暫存區和工作區。那么這種情況在版本回退中是沒有對應的指令的,此時我們該怎么辦呢?

? ? ? ? 我們分別討論以下三種情況:

? ? ? ? 情況一:

? ? ? ? 這種情況下我們可以選擇手動修改,不過更好的方式是使用以下指令:

git checkout -- 文件名

? ? ? ? 情況二:

? ? ? ? 這種情況我們可以直接使用git reset --hard。因為我們可以拿到上一次提交的commit id,然后恢復版本,這樣的話實際上版本庫是不進行更改的,而工作區和暫存區回退到上一個版本了。從整體來看,就是我們使用git reset回退到了當前版本。

? ? ? ? 或者我們使用git reset? --mixed,?此時就和情況一一樣了,然后我們再按照情況一的方法更改。

? ? ? ? ?情況三:

? ? ? ? 這種情況我們直接使用git reset --hard HEAD~1就好了。在這里還是要強調一下,我們這些修改都是針對本地倉庫來說的,對于遠程倉庫的操作我們以后再說。

3、分支

? ? ? ? 3.1、分支基礎操作

? ? ? ? Git 分支是開發中用于隔離不同工作流的獨立線路。每個分支代表一個獨立的提交歷史,便于并行開發、實驗性功能實現或問題修復,而不會影響主分支。

? ? ? ? Git的分支功能是一個非常強大的功能,分支功能的出現,就允許了一個團隊中的不同成員,同時進行項目不同部分的開發,并在開發完成之后,合并到主分支中。大家可以想一下,有了分支功能,我們的總體效率會大大的提高。

? ? ? ? 現在我們就先來簡單介紹一下如何創建分支和和并分支。

? ? ? ? ?首先我們使用以下命令查看當前的分支

git branch

? ? ? ? 我們使用以下命令創建分支

git branch 分支名

? ? ? ? 我們的HEAD默認是指向master的,HEAD被指向的分支就是當前工作的分支。

????????我們可以通過以下指令查看當前的HEAD指向哪個分支

cat .git/HEAD

? ? ? ? 當然,直接branch也可以看當前在那個分支,分支前帶星號的就是當前分支:

? ? ? ? ?我們可以通過以下命令切換分支:

git checkout dev

? ? ? ? 現在,我們在dev分支上進行一些修改代碼,提交的操作,我們來理解一下這個過程

? ? ? ? master和dev這兩個分支始終指向自己這個分支上最新的一次提交。如果我們在dev分支提交東西,那么dev分支創建出一個新的提交節點,并且指向他。?

? ? ? ? 接下來我們合并兩個分支:

git merge 分支名

? ? ? ? 需要注意的是我們不能在當前分支下合并自己。我們得先切換到master分支然后git merge dev。當然了我們其實也可以把master合并到dev上。

? ? ? ? 我們來看一下合并之后的狀態圖:

? ? ? ? 接下來我們介紹一下如何刪除分支:

git branch -d 分支名

? ? ? ? 我們不能刪除當前的分支。?

? ? ? ? 3.2、分支深入理解

?????????3.2.1、合并沖突

? ? ? ? 當我們合并的兩個分支內容發生沖突時,就會出現合并沖突的情況,比如,兩個分支分別在同一個文件中添了一行不同的代碼,此時如果進行合并操作,git就鬧不清我們到底該保留哪一行代碼了。

? ? ? ? 我們首先創建一個這樣的情景,在dev分支中,我們為readme文件添加一行“dev test”字符串,在master分支中添加一行"master test"。接著我們嘗試把dev合并到master上:

? ? ? ? 我們嘗試合并操作,他會提示合并失敗,接著我們打開readme文件:

? ? ? ? git已經給我們顯式出了沖突內容,我們需要手動刪除,保留需要更改的部分。接下來我們使用git add .和git commit就可以了。

? ? ? ? ?我們可以通過以下命令,查看我們合并過程的圖示:

git log --graph --abbrev-commit

? ? ? ? 3.2.2、合并模式

? ? ? ? ?其實merge的模式是可以選擇的。默認我們使用的都是ff(fast forward),這種模式的合并我們看不出來是merge出來的還是commit出來的。所以我們一般使用no-ff模式:

git merge --no-ff dev

Fast-Forward (FF) 模式
????????當目標分支(如 main)的最新提交是當前分支(如 feature)的直接祖先時,Git 默認會采用 FF 模式合并。這種合并不會創建新的合并提交,而是簡單地將 main 分支的指針移動到 feature 分支的最新提交上。歷史記錄保持線性,沒有分叉。

A --- B --- C (main)\D --- E (feature)

執行 git merge feature 后(FF 模式):

A --- B --- C --- D --- E (main)

No-Fast-Forward (--no-ff) 模式
????????通過 git merge --no-ff 強制禁用 FF 模式,即使滿足 FF 條件,Git 也會創建一個新的合并提交。這會保留分支的拓撲結構,明確顯示分支的合并點,便于追蹤歷史。

A --- B --- C (main)\D --- E (feature)

執行 git merge --no-ff feature 后:

A --- B --- C --------- F (main)\              /D --- E ------

? ? ? ? 為了我們的提交記錄更清晰,我們推薦使用no-ff模式。


? ? ? ? ??3.2.3、bug分支

? ? ? ? 在開發的過程中,我們經常利用臨時分支來修復bug。比如現在我們的master分支上就出現了一個bug,我們會新建一個分支,在這個分支上修復bug,最后再合并。

? ? ? ? 那么假設我們已經有了一個分支,并且正在這個分支上寫代碼,這時突然發現master上有bug,我們想用這個分支去修復bug,可是這個分支的開發內容剛進行了一半,我們也無法提交了,這時候該怎么辦呢?

? ? ? ? 在git中,我們可以使用git stash命令,對當前工作區信息進行存儲,被存儲的內容以后可以恢復出來。說白了,就是暫時保存一下當前分支的代碼:

git stash

?????????我們可以通過命令查看工作區:

git status

?????????接著我們就可以安心的切回到master分支,然后新建修改bug的臨時分支。

? ? ? ? 當我們修復完分支之后,可以切換回剛才的分支,我們剛才的代碼可以用以下命令查看:

git stash list

? ? ? ? 我們可以通過以下命令恢復現場

git stash pop

? ? ? ? 我們可以使用以下命令來恢復現場

git stash apply #恢復現場但不刪除stash內容
git stash drop  #刪除stash內容

? ? ? ? 接著我們完成dev分支的任務,合并到master上。?

? ? ? ? 此時的狀態圖應該是這樣的:

? ? ? ? 但是我們不建議這樣修復bug!因為在最終dev合并到master上是可能會有沖突。我們手動解決沖突的話無法保證對于沖突問題一次性解決掉,因為在實際的項目中,代碼沖突不只一兩行那么簡單。

? ? ? ? 我們建議的是在合并時首先把master合并到dev上,在dev分支測試沒問題之后再合并到master上:

? ? ? ? 3.2.4、刪除臨時分支

?????????如果我們的分支已經完成了合并,那我們可以使用之前的刪除分支命令,可是如果這個分支還沒有完成合并,我們想要刪除他,就需要以下命令:

git branch -D 分支

? ? ? ? 好了,今天的內容就分享到這,我們下期再見!?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/95478.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/95478.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/95478.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

c語言中堆和棧的區別

1.棧區(stack):由編譯器自動分配釋放&#xff0c;棧主要用于存儲局部變量、函數參數、函數調用和返回信息等。其操作方式類似于數據結構中的棧。 2.堆區(heap):一般由程序員分配釋放&#xff0c;若程序員不釋放&#xff0c;則可能會引起內存泄漏。注堆和數據結構中的堆棧不一樣…

華為實驗WLAN 基礎配置隨練

業務vlan 20 192.168.20.x管理vlan 100 192.168.100.x步驟① 網絡互通Core sw:vlan batch 20 100 dhcp enable int vlanif 20IP add 192.168.20.1 24dhcp select interfaceinterface GigabitEthernet0/0/1/2port link-type trunkport trunk pvid vlan 100port trunk allow-pas…

CMake 如何查找 Python2和Python3

問題 在一個CMakeLists.txt文件里面看到了下面的這句話 find_package(Python2 COMPONENTS Interpreter Development NumPy)這個好有趣啊&#xff0c;Python2也是一個C的庫嗎&#xff0c;也有Python2Config.cmake或者FindPython2.cmake? 回答 find_package(Python2 COMPONENTS …

心靈筆記:刻意練習

心靈筆記&#xff1a;刻意練習提要 所有人都以為“杰出”源于“天賦”&#xff0c;而“天才”卻說&#xff1a;我的成就源于“正確的練習”&#xff01; 定義&#xff1a;刻意練習是一種有目的、有方法、能帶來能力持續提升的結構化訓練方式&#xff0c;它并非簡單的重復勞動&a…

langchain入門筆記03:使用fastapi部署本地大模型后端接口,優化局域網內的問答響應速度

文章目錄前言一、fastapi的簡單入門1&#xff1a;安裝必要的包&#xff08;python3.11&#xff09;&#xff1a;2&#xff1a;快速搭建一個fastapi&#xff1a;二、提升問答的響應速度1. fastapi部署后端接口&#xff0c;在局域網內訪問的方法2. 局域網內的測試&#xff1a;“未…

【CDA 新一級】學習筆記第1篇:數據分析的時代背景

作者&#xff1a;CDA持證人 張九領我們要學習數據分析&#xff0c;就要從當前時代的數據特點&#xff0c;找到在時代特點下企業需要數據分析的痛點&#xff0c;然后理解數據分析在企業中的作用。當前時代&#xff0c;數據分析的特征是哪些呢&#xff1f;我們用VUCA來概括數據分…

Vite 為什么比 Webpack 快?原理深度分析

Hi&#xff0c;我是布蘭妮甜 &#xff01;在現代前端開發中&#xff0c;構建工具的性能直接影響開發體驗和生產力。Webpack 作為傳統打包工具的代表&#xff0c;長期以來主導著前端構建領域&#xff0c;而 Vite 作為新一代的前端構建工具&#xff0c;憑借其出色的開發服務器啟動…

數字電路上的通訊速度是越快越好還是越慢越好?

昨天我突發奇想&#xff0c;修改了一下MCU和INA226以及DAC8551的通訊速率。之前的INA226用的是I2C通訊&#xff0c;之前設置的速率是100Kbps&#xff0c;DAC8551是SPI通訊&#xff0c;速率是10Mbps&#xff0c;昨天修改之前輸出位置的測試結果如圖&#xff1a;可以看到&#xf…

Google Gemini 的深度研究終于進入 API 階段

Google Gemini 最強大的功能之一是深度研究&#xff0c;但到目前為止&#xff0c;它一直嚴格限制在 Gemini 界面上。這種情況可能很快就會改變。 通過 Gemini 中的深度研究&#xff0c;您可以搜索幾乎任何內容&#xff0c;包括學者、現有研究論文等。 谷歌將深度研究描述為一…

通過beeware制作安卓apk用于獲取cpolar網址

我們都知道&#xff0c;沒有付費的cpolar用戶&#xff0c;要不時更新cpolar網址。每次都要自己登錄去獲取遠程的cpolar個人網址比較麻煩&#xff0c;好在可以用python去自動獲取。這里說的是&#xff0c;比如用手機裝termux軟件&#xff0c;再在termux中裝cpolar&#xff0c;然…

Swift 實戰:用鏈表和哈希表寫出高性能的貪吃蛇引擎(LeetCode 353)

文章目錄摘要描述解決方案解析問題與解決方案關鍵細節逐條講示例與運行結果時間復雜度空間復雜度總結摘要 這題的目標是設計一個“貪吃蛇”核心引擎&#xff1a;給定棋盤大小和一串食物位置&#xff0c;支持不斷調用 move(direction) 推進游戲&#xff0c;返回當前分數&#x…

2025-08-15:按對角線進行矩陣排序。用go語言,給你一個 n × n 的整數矩陣,要求返回一個按下面規則調整后的矩陣: - 將每一條與主對角線平行的斜線視為一個序列。對于位于主對角線及其下方的

2025-08-15&#xff1a;按對角線進行矩陣排序。用go語言&#xff0c;給你一個 n n 的整數矩陣&#xff0c;要求返回一個按下面規則調整后的矩陣&#xff1a;將每一條與主對角線平行的斜線視為一個序列。對于位于主對角線及其下方的那些斜線&#xff08;即所在位置的行索引 ≥ …

MySQL相關概念和易錯知識點(5)(索引、事務、MVCC)

目錄1.索引&#xff08;1&#xff09;局部性原理a.局部性原理在計算機中的地位b.pagec.池化技術&#xff08;Buffer Pool&#xff09;&#xff08;2&#xff09;如何理解索引&#xff08;3&#xff09;索引的原理a.page的構成b.多層目錄c.基于B樹的索引①B樹的特性在索引中的作…

SQLite 子查詢

SQLite 子查詢 SQLite 是一個輕量級的數據庫管理系統&#xff0c;廣泛應用于移動設備、嵌入式系統和桌面應用。在處理復雜的查詢時&#xff0c;子查詢&#xff08;Subquery&#xff09;是SQLite數據庫查詢語言中的一個強大工具。本文將詳細介紹SQLite子查詢的概念、用法及其在數…

區塊鏈系統審計方法論:全面指南與Python實踐

目錄 區塊鏈系統審計方法論:全面指南與Python實踐 1. 引言 2. 區塊鏈審計框架 3. 智能合約審計關鍵技術 3.1 靜態代碼分析 3.2 符號執行(Symbolic Execution) 4. 共識機制審計 4.1 PoW共識驗證 4.2 PBFT共識模擬 5. 數據完整性審計 5.1 Merkle樹驗證 6. 完整審計系統實現 7.…

分布式鎖—Redisson的公平鎖

1.Redisson公平鎖RedissonFairLock概述 (1)非公平和公平的可重入鎖 一.非公平可重入鎖 鎖被釋放后&#xff0c;排隊獲取鎖的線程會重新無序獲取鎖&#xff0c;沒有任何順序性可言。 二.公平可重入鎖 鎖被釋放后&#xff0c;排隊獲取鎖的線程會按照請求獲取鎖時候的順序去獲取…

上網行為安全概述和組網方案

一、上網行為安全概述1. 背景與需求互聯網的雙刃劍特性&#xff1a;網絡普及改變工作生活方式&#xff0c;業務向互聯網遷移。缺乏管理導致風險&#xff1a;帶寬濫用、監管困難、信息泄露、網絡違法、安全威脅。核心問題&#xff1a;帶寬濫用&#xff1a;P2P/流媒體占用70%帶寬…

某處賣600的【獨角仙】尾盤十分鐘短線 尾盤短線思路 手機電腦通用無未來函數

通達信指標【獨角仙】尾盤十分鐘套裝-主圖-副圖-選古指標&#xff0c;支持手機電腦使用。在股市收盤的前十分鐘第二天沖高賣出&#xff0c;信號可以盤中預警也可以尾盤選股&#xff0c;如果要保證信號固定建議是尾盤選股即可&#xff0c;當天信號固定后&#xff0c;不會產生漂移…

日志數據鏈路的 “搬運工”:Flume 分布式采集的組件分工與原理

flume詳解&#xff1a;分布式日志采集的核心原理與組件解析 在大數據體系中&#xff0c;日志采集是數據處理的第一步。Flume 作為 Apache 旗下的分布式日志采集工具&#xff0c;以高可用、高可靠、易擴展的特性&#xff0c;成為處理海量日志數據的首選方案。本文將從 Flume 的…

大消費新坐標中的淘寶大會員

一站式消費需要一站式權益。作者|古廿編輯|楊舟淘寶的大會員體系落地了。8月6日&#xff0c;淘寶首次整合餓了么、飛豬等阿里系平臺資源&#xff0c;推出覆蓋購物、外賣、出行、旅游的一體化會員體系——用戶在三大平臺的消費&#xff0c;都能累積淘氣值&#xff0c;根據淘氣值…