【git】關于git二三事

文章目錄

  • 前言
  • 一、創建版本庫
      • 1.通過命令 git init 把這個目錄變成git可以管理的倉庫
      • 2.將修改的內容添加到版本庫
        • 2.1 git add .
        • 2.2 git commit -m "Xxxx"
        • 2.3 git status
      • 2.4 git diff readme.txt
      • 3.版本回退
        • 3.1 git log
        • 3.2 git reset --hard HEAD^
  • 二、理解工作區與暫存區的區別?
  • 三、操作遠程庫,創建與合并

前言

Git是分布式版本控制系統,每個人的電腦就是一個完整的版本庫。

那多個人如何協作呢?比如說自己在電腦上改了文件A,其他人也在電腦上改了文件A,這時,你們兩之間只需把各自的修改推送給對方,就可以互相看到對方的修改了。

主要工作流程:
在這里插入圖片描述

Workspace:工作區
Index / Stage:暫存區
Repository:倉庫區(或本地倉庫)
Remote:遠程倉庫

一、創建版本庫

什么是版本庫?版本庫又名倉庫,英文名repository,你可以簡單的理解一個目錄,這個目錄里面的所有文件都可以被Git管理起來,每個文件的修改,刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻還可以將文件”還原”。

如下我是D盤 –> www下 目錄下新建一個testgit版本庫

mkdir testgit

1.通過命令 git init 把這個目錄變成git可以管理的倉庫

git init

這時候你當前testgit目錄下會多了一個.git的目錄,這個目錄是Git來跟蹤管理版本的,沒事千萬不要手動亂改這個目錄里面的文件,否則,會把git倉庫給破壞了。

2.將修改的內容添加到版本庫

2.1 git add .

在testgit目錄下創建一個readme.txt的文件,并寫入內容:aaaa

使用git add . 將修改的所有內容添加到暫存區

git add .
2.2 git commit -m “Xxxx”

用命令 git commit告訴Git,把文件提交到倉庫。

git commit -m "新增的readme"

2.1和2.2可以合成

git commit -am "新增的readme"
2.3 git status

通過命令git status來查看是否還有文件未提交

git status

2.4 git diff readme.txt

將readme.txt修改之后,執行git diff readme.txt想看下readme.txt文件到底改了什么內容

git diff readme.txt

3.版本回退

3.1 git log

查看提交的歷史記錄,顯示從最近到最遠的顯示日志,回車繼續查看下一條,q退出

git log

使用版本回退操作,我想把當前的版本回退到上一個版本,要使用什么命令呢?

3.2 git reset --hard HEAD^

可以使用如下2種命令,第一種是:git reset --hard HEAD^ 那么如果要回退到上上個版本只需把HEAD^ 改成 HEAD^^ 以此類推

 git reset --hard HEAD^git reset --hard HEAD^^;;也可以是使用,推到前三個git reset --hard HEAD~3;;版本號回退,常用git reset --hard 版本號

假如我已經關掉過一次命令行或者333內容的版本號我并不知道呢?要如何知道增加3333內容的版本號呢?可以通過如下命令即可獲取到版本號:

git reflog 

二、理解工作區與暫存區的區別?

工作區:就是你在電腦上看到的目錄,比如目錄下testgit里的文件(.git隱藏目錄版本庫除外)。或者以后需要再新建的目錄文件等等都屬于工作區范疇。

版本庫(Repository):工作區有一個隱藏目錄.git,這個不屬于工作區,這是版本庫。其中版本庫里面存了很多東西,其中最重要的就是stage(暫存區),還有Git為我們自動創建了第一個分支master,以及指向master的一個指針HEAD。

使用Git提交文件到版本庫有兩步:

第一步:是使用 git add 把文件添加進去,實際上就是把文件添加到暫存區。

第二步:使用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支上。

三、操作遠程庫,創建與合并

創建與合并分支命令如下:

查看分支:git branch

創建分支:git branch name

切換分支:git checkout name

創建+切換分支:git checkout –b name

合并某分支到當前分支:git merge name

刪除分支:git branch –d name

創建與合并分支
在 版本回填退里,你已經知道,每次提交,Git都把它們串成一條時間線,這條時間線就是一個分支。截止到目前,只有一條時間線,在Git里,這個分支叫主分支,即master分支。HEAD嚴格來說不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是當前分支。

首先,我們來創建dev分支,然后切換到dev分支上。如下操作:

img

git checkout 命令加上 –b參數表示創建并切換,相當于如下2條命令

git branch dev

git checkout dev

git branch查看分支,會列出所有的分支,當前分支前面會添加一個星號。然后我們在dev分支上繼續做demo,比如我們現在在readme.txt再增加一行 7777777777777

首先我們先來查看下readme.txt內容,接著添加內容77777777,如下:

img

現在dev分支工作已完成,現在我們切換到主分支master上,繼續查看readme.txt內容如下:

img

現在我們可以把dev分支上的內容合并到分支master上了,可以在master分支上,使用如下命令 git merge dev 如下所示:

img

git merge命令用于合并指定分支到當前分支上,合并后,再查看readme.txt內容,可以看到,和dev分支最新提交的是完全一樣的。

注意到上面的Fast-forward信息,Git告訴我們,這次合并是“快進模式”,也就是直接把master指向dev的當前提交,所以合并速度非常快。

合并完成后,我們可以接著刪除dev分支了,操作如下:

img

總結創建與合并分支命令如下:

查看分支:git branch

創建分支:git branch name

切換分支:git checkout name

創建+切換分支:git checkout –b name

合并某分支到當前分支:git merge name

刪除分支:git branch –d name

如何解決沖突?
下面我們還是一步一步來,先新建一個新分支,比如名字叫fenzhi1,在readme.txt添加一行內容8888888,然后提交,如下所示:

img

同樣,我們現在切換到master分支上來,也在最后一行添加內容,內容為99999999,如下所示:

img

現在我們需要在master分支上來合并fenzhi1,如下操作:

img

Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容,其中<<<HEAD是指主分支修改的內容,>>>>>fenzhi1 是指fenzhi1上修改的內容,我們可以修改下如下后保存:

img

如果我想查看分支合并的情況的話,需要使用命令 git log.命令行演示如下:

img

3.分支管理策略。

通常合并分支時,git一般使用”Fast forward”模式,在這種模式下,刪除分支后,會丟掉分支信息,現在我們來使用帶參數 –no-ff來禁用”Fast forward”模式。首先我們來做demo演示下:

創建一個dev分支。
修改readme.txt內容。
添加到暫存區。
切換回主分支(master)。
合并dev分支,使用命令 git merge –no-ff -m “注釋” dev
查看歷史記錄
截圖如下:

img

分支策略:首先master主分支應該是非常穩定的,也就是用來發布新版本,一般情況下不允許在上面干活,干活一般情況下在新建的dev分支上干活,干完后,比如上要發布,或者說dev分支代碼穩定后可以合并到主分支master上來。

七:bug分支:
在開發中,會經常碰到bug問題,那么有了bug就需要修復,在Git中,分支是很強大的,每個bug都可以通過一個臨時分支來修復,修復完成后,合并分支,然后將臨時的分支刪除掉。

比如我在開發中接到一個404 bug時候,我們可以創建一個404分支來修復它,但是,當前的dev分支上的工作還沒有提交。比如如下:

img

并不是我不想提交,而是工作進行到一半時候,我們還無法提交,比如我這個分支bug要2天完成,但是我issue-404 bug需要5個小時內完成。怎么辦呢?還好,Git還提供了一個stash功能,可以把當前工作現場 ”隱藏起來”,等以后恢復現場后繼續工作。如下:

img

所以現在我可以通過創建issue-404分支來修復bug了。

首先我們要確定在那個分支上修復bug,比如我現在是在主分支master上來修復的,現在我要在master分支上創建一個臨時分支,演示如下:

img

修復完成后,切換到master分支上,并完成合并,最后刪除issue-404分支。演示如下:

img

現在,我們回到dev分支上干活了。

img

工作區是干凈的,那么我們工作現場去哪里呢?我們可以使用命令 git stash list來查看下。如下:

img

工作現場還在,Git把stash內容存在某個地方了,但是需要恢復一下,可以使用如下2個方法:

1.git stash apply恢復,恢復后,stash內容并不刪除,你需要使用命令git stash drop來刪除。
2.另一種方式是使用git stash pop,恢復的同時把stash內容也刪除了。
演示如下

img

八:多人協作
當你從遠程庫克隆時候,實際上Git自動把本地的master分支和遠程的master分支對應起來了,并且遠程庫的默認名稱是origin。

要查看遠程庫的信息 使用 git remote
要查看遠程庫的詳細信息 使用 git remote –v
如下演示:

img

一:推送分支:

推送分支就是把該分支上所有本地提交到遠程庫中,推送時,要指定本地分支,這樣,Git就會把該分支推送到遠程庫對應的遠程分支上:

使用命令 git push origin master

比如我現在的github上的readme.txt代碼如下:

img

本地的readme.txt代碼如下:

img

現在我想把本地更新的readme.txt代碼推送到遠程庫中,使用命令如下:

img

我們可以看到如上,推送成功,我們可以繼續來截圖github上的readme.txt內容 如下:

img

可以看到 推送成功了,如果我們現在要推送到其他分支,比如dev分支上,我們還是那個命令 git push origin dev

那么一般情況下,那些分支要推送呢?

master分支是主分支,因此要時刻與遠程同步。
一些修復bug分支不需要推送到遠程去,可以先合并到主分支上,然后把主分支master推送到遠程去。
二:抓取分支:

多人協作時,大家都會往master分支上推送各自的修改。現在我們可以模擬另外一個同事,可以在另一臺電腦上(注意要把SSH key添加到github上)或者同一臺電腦上另外一個目錄克隆,新建一個目錄名字叫testgit2

但是我首先要把dev分支也要推送到遠程去,如下

img

接著進入testgit2目錄,進行克隆遠程的庫到本地來,如下:

img

現在目錄下生成有如下所示:

img

現在我們的小伙伴要在dev分支上做開發,就必須把遠程的origin的dev分支到本地來,于是可以使用命令創建本地dev分支:git checkout –b dev origin/dev

現在小伙伴們就可以在dev分支上做開發了,開發完成后把dev分支推送到遠程庫時。

如下:

img

小伙伴們已經向origin/dev分支上推送了提交,而我在我的目錄文件下也對同樣的文件同個地方作了修改,也試圖推送到遠程庫時,如下:

img

由上面可知:推送失敗,因為我的小伙伴最新提交的和我試圖推送的有沖突,解決的辦法也很簡單,上面已經提示我們,先用git pull把最新的提交從origin/dev抓下來,然后在本地合并,解決沖突,再推送。

img

git pull也失敗了,原因是沒有指定本地dev分支與遠程origin/dev分支的鏈接,根據提示,設置dev和origin/dev的鏈接:如下:

img

這回git pull成功,但是合并有沖突,需要手動解決,解決的方法和分支管理中的 解決沖突完全一樣。解決后,提交,再push:
我們可以先來看看readme.txt內容了。

img

現在手動已經解決完了,我接在需要再提交,再push到遠程庫里面去。如下所示:

img

因此:多人協作工作模式一般是這樣的:

首先,可以試圖用git push origin branch-name推送自己的修改.
如果推送失敗,則因為遠程分支比你的本地更新早,需要先用git pull試圖合并。
如果合并有沖突,則需要解決沖突,并在本地提交。再用git push origin branch-name推送。

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

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

相關文章

操作系統內部機制學習

切換線程時需要保存什么 函數需要保存嗎&#xff1f;函數在Flash上&#xff0c;不會被破壞&#xff0c;無需保存。函數執行到了哪里&#xff1f;需要保存嗎&#xff1f;需要保存。全局變量需要保存嗎&#xff1f;全局變量在內存上&#xff0c;無需保存。局部變量需要保存嗎&am…

Leetcode—337.打家劫舍III【中等】

2023每日刷題&#xff08;五十二&#xff09; Leetcode—337.打家劫舍III 算法思想 實現代碼 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(null…

I.MX6ULL_Linux_驅動篇(46)linux LCD驅動

LCD 是很常用的一個外設&#xff0c;在Linux 下LCD 的使用更加廣泛&#xff0c;在搭配 QT 這樣的 GUI 庫下可以制作出非常精美的 UI 界面。本章我們就來學習一下如何在 Linux 下驅動 LCD 屏幕。 Linux 下 LCD 驅動簡析 Framebuffer 設備 先來回顧一下裸機的時候 LCD 驅動是怎…

前端入門:HTML初級指南,網頁的簡單實現!

代碼部分&#xff1a; <!DOCTYPE html> <!-- 上方為DOCTYPE聲明&#xff0c;指定文檔類型為HTML --> <html lang"en"> <!-- html標簽為整個頁面的根元素 --> <head> <!-- title標簽用于定義文檔標題 --> <title>初始HT…

單點登錄方案調研與實現

作用 在一個系統登錄后&#xff0c;其他系統也能共享該登錄狀態&#xff0c;無需重新登錄。 演進 cookie → session → token →單點登錄 Cookie 可以實現瀏覽器和服務器狀態的記錄&#xff0c;但Cookie會出現存儲體積過大和可以在前后端修改的問題 Session 為了解決Co…

【其他數學】結式 resultant

結式 resultant 2023年11月30日 #analysis 文章目錄 結式 resultant介紹Sylvester矩陣應用在消元中的應用傳遞函數的化簡 下鏈 介紹 結式用來計算曲線的交點、消元、找參數化曲線的隱含方程。 為了引出定義&#xff0c;思考如下問題&#xff1a; f ( x ) x 2 ? 5 x 6 g (…

UVM建造測試用例

&#xff08;1&#xff09;加入base_test 在一個實際應用的UVM驗證平臺中&#xff0c;my_env并不是樹根&#xff0c;通常來說&#xff0c;樹根是一個基于uvm_test派生的類。真正的測試用例都是基于base_test派生的一個類。 class base_test extends uvm_test;my_env e…

14-2(C++11)類型推導、類型計算

14-2&#xff08;C11&#xff09;類型推導、類型計算 類型推導auto關鍵字auto類型推斷本質auto與引用 聯用auto關鍵字的使用限制 類型計算類型計算分類與類型推導相比四種類型計算的規則返回值后置 類型推導 auto關鍵字 C98中&#xff0c;auto表示棧變量&#xff0c;通常省略…

Leetcode刷題筆記題解(C++):25. K 個一組翻轉鏈表

思路&#xff1a;利用棧的特性&#xff0c;K個節點壓入棧中依次彈出組成新的鏈表&#xff0c;不夠K個節點則保持不變 /*** struct ListNode {* int val;* struct ListNode *next;* ListNode(int x) : val(x), next(nullptr) {}* };*/ #include <stack> class Solution { …

在國內,現在月薪1萬是什么水平?

看到網友發帖問&#xff1a;現在月薪1W是什么水平&#xff1f; 在現如今的情況下&#xff0c;似乎月薪過萬這個標準已經成為衡量個人能力的一個標準了&#xff0c;尤其是現在互聯網橫行的時代&#xff0c;好像年入百萬&#xff0c;年入千萬就應該是屬于大眾的平均水平。 我不是…

kafka入門(四):消費者

消費者 (Consumer ) 消費者 訂閱 Kafka 中的主題 (Topic) &#xff0c;并 拉取消息。 消費者群組&#xff08; Consumer Group&#xff09; 每一個消費者都有一個對應的 消費者群組。 一個群組里的消費者訂閱的是同一個主題&#xff0c;每個消費者接收主題的一部分分區的消息…

大師學SwiftUI第18章Part2 - 存儲圖片和自定義相機

存儲圖片 在前面的示例中&#xff0c;我們在屏幕上展示了圖片&#xff0c;但也可以將其存儲到文件或數據庫中。另外有時使用相機將照片存儲到設備的相冊薄里會很有用&#xff0c;這樣可供其它應用訪問。UIKit框架提供了如下兩個保存圖片和視頻的函數。 UIImageWriteToSavedPh…

JAVA后端自學技能實操合集

JAVA后端自學技能實操 內容將會持續更新中,有需要添加什么內容可以再評論區留言,大家一起學習FastDFS使用docker安裝FastDFS(linux)集成到springboot項目中 內容將會持續更新中,有需要添加什么內容可以再評論區留言,大家一起學習 FastDFS 組名&#xff1a;文件上傳后所在的 st…

leetcode 100.相同的樹

涉及到遞歸&#xff0c;最好多畫圖理解&#xff0c;希望對你們有幫助 100.相同的樹 題目 給你兩棵二叉樹的根節點 p 和 q &#xff0c;編寫一個函數來檢驗這兩棵樹是否相同。 如果兩個樹在結構上相同&#xff0c;并且節點具有相同的值&#xff0c;則認為它們是相同的。 題目鏈接…

GPIO的使用--滴答定時器--pir人體紅外傳感器

目錄 一、滴答定時器的使用與原理 1、定義 2、原理 &#xff08;1&#xff09;向上計數?編輯 &#xff08;2&#xff09;向下計數 &#xff08;3&#xff09; 代碼流程 a、配置滴答時鐘喚醒頻率 b、滴答時鐘中斷函數 &#xff08;4&#xff09;結果 3、優化-->寄存…

Proxy Hook Trace JSON

Proxy var window {key: "qww",age: 22 } window new Proxy(window, {get(target, p, receiver) {console.log("target: ", target);console.log("p: ", p);// return window[username];/// 這里如果這樣寫. 有遞歸風險的...// return Reflec…

【線性代數與矩陣論】Jordan型矩陣

Jordan型矩陣 2023年11月3日 #algebra 文章目錄 Jordan型矩陣1. 代數重數與幾何重數2. Jordan塊與Jordan標準型2.1 最小多項式與Jordan標準型2.2 兩類重要矩陣 3. 矩陣的Jordan分解3.1 Jordan分解的應用 下鏈 1. 代數重數與幾何重數 在對向量做線性變換時&#xff0c;向量空間…

讀書筆記-《數據結構與算法》-摘要4[插入排序]

插入排序 核心&#xff1a;通過構建有序序列&#xff0c;對于未排序序列&#xff0c;在已排序序列中從后向前掃描(對于單向鏈表則只能從前往后遍歷)&#xff0c;找到相應位置并插入。實現上通常使用in-place排序(需用到O(1)的額外空間) 從第一個元素開始&#xff0c;該元素可…

如何主持一場知識競賽搶答賽

知識競賽主持說難不難&#xff0c;說簡單也不簡單&#xff0c;我就從易到難介紹一下。 入門級&#xff0c;題主不用練習太多其他花哨的技巧&#xff0c;只要注意一點&#xff0c;熟悉比賽流程。知識競賽需要給所有選手一個公平流暢的答題環境&#xff0c;所以題主自身必須非常…

干貨!接口中的大事務,該如何進行優化?

作為后端開發的程序員&#xff0c;我們常常會的一些相對比較復雜的邏輯&#xff0c;比如我們需要給前端寫一個調用的接口&#xff0c;這個接口需要進行相對比較復雜的業務邏輯操作&#xff0c;比如會進行&#xff0c;查詢、遠程接口或本地接口調用、更新、插入、計算等一些邏輯…