【Git學習】入門與基礎

目錄

Git的安裝

?Git 配置用戶信息

Git 初始化本地倉庫

Git 工作區、暫存區和版本庫

?Git 跟蹤文件

Git 修改文件

?Git 刪除文件

Git 撤銷本地文件的修改?

Git 取消暫存

Git 跳過暫存區

?Git 版本回退

Git 撤銷提交

Git 設置忽略文件

Git 比較文件差異

Git 代碼托管平臺

Git 本地添加遠程倉庫

Git 克隆/推送代碼

?編輯

?Git 合并沖突

Git 注冊github賬號、操作遠程倉庫

Git 使用SSH協議

Git分支

Git HEAD與分支

Git 分支的管理

Git 合并分支

Git 合并分支沖突

Git 儲藏(git stash)

Git 遠程分支_本地分支區別?編輯

Git 創建遠程倉庫的分支

Git 刪除遠程分支

Git 標簽概念

Git 標簽的管理

Git 標簽_推送、檢出

Git 是一個開源的分布式版本控制系統,可以有效、高速地處理項目版本管理。
? ? ? ? 版本控制:一種記錄一個或若干文件內容變化,以便將來查閱特定版本修訂情況的系統。
? ? ? ? 分布式:每個人的開發機上都有獨立的版本庫,開發者可以在自己的開發機管理代碼版本。

Git的安裝

Git官網:https://git-scm.com/?
? ? ? ? 1.在Win上安裝:下載二進制安裝包,然后直接安裝,一直下一步直到安裝完成。?

? ? ? ? 2.在Mac上安裝:下載二進制安裝包,然后直接安裝,一直下一步直到安裝完成。?
?

查看是否安裝成功:

?Git 配置用戶信息

配置用戶信息:

$ git config --global user.name xxx
$ git config --global user.email xxxx.com
傳遞--global 選項則 Git 讀寫~/.gitconfig文件。

?檢查配置的用戶信息:

$ git config --list
Git 初始化本地倉庫

在工作區目錄輸入以下命令:

git init

Git 工作區、暫存區和版本庫

  • 工作區(Workspace):放項目代碼的地方,項目代碼對應的文件。

  • 暫存區(Index/Stage):也叫索引,是一個文件,保存了下次將提交的文件列表信息。

  • 本地倉庫(Repository):就是安全存放數據的位置,這里邊有你提交的所有版本的數據。

Git的工作流程:

  1. 在工作區中添加、修改文件;
  2. 添加工作區的更改到暫存區;
  3. 將暫存區域的文件列表信息提交到本地倉庫。

    ?Git 跟蹤文件

    我們首先要確認本地工作區中有項目文件

    使用 git status 命令查看文件當前狀態?

    可以看到此時沒有東西需要提交,工作tree是干凈的
    現在新建一個txt文件

    echo hello,world > newfile.txt

    現在可以觀察到,該txt文件成功創建,現在我們在使用上述命令,查看狀態:

    ?現在我們看到有一個”未跟蹤的“文件,我們要將該”未跟蹤”狀態修改為“跟蹤”狀態(就是將其放入緩存區,從而git就可以跟工作區、本地倉庫做比對。

    那我們如何實現對文件的跟蹤呢?
    ? ? ? ? 使用 git add 要跟蹤的文件?這個命令就可以啦!

    現在我們再打開git bash,使用上述命令:

    我們可以看到,有to be committed 的標記,表示以放置緩存區,待提交狀態
    現在我們再來提交這個文件,使用 git commit -m '提交信息' 這個命令
    其中,-m 表示對這個提交文件的作的注釋 后面單引號中的內容就是注釋內容

    使用命令后可以看到,當再次觀察狀態時,又恢復了初始的樣子,clean表示已提交狀態

    Git 修改文件

    現在我們需要實現修改工作區中的文件,可以有多種方法,我們可以在bash外直接打開文件修改內容,或者在bash中使用 vim命令對文件進行修改,我這里使用vim對文件進行修改,依舊是前文中新建的文件作為例子:
    ?

    可以看到我在文件中添加了“hello,git!”的內容,現在我們再使用 git status查看文件狀態:
    ?出現了上述內容,一個待提交的,有修改動作的的未緩存文件(not staged本地修改未添加至緩存區),好的,現在用我們之前學的內容,提交該文件至緩存區

    然后再提交到本地倉庫:

    注意:git commit --amend

    增補提交,會使用與當前提交節點相同的父節點進行一次新的提交,舊的提交將會被取消。

    ?接著我們來查看提交記錄,使用 git log命令來實現

    提示:使用git log --oneline可以讓每次的提交信息顯示在一行

    image-20220927144817577

    ?Git 刪除文件

    對于刪除文件,可以直接在外部對文件右鍵刪除,或者在bash中,使用 rm 要刪除的文件 該命令

    ?我們可以觀察到,當刪除文件后再查看狀態,此時會有delete信息的提示,接著將其添加至緩存區并且提交。

    我們還有一個命令,就是 git rm 文件,該命令不僅從工作區刪除文件并且緩存區的也被刪除。?

    Git 撤銷本地文件的修改?

    如果我們對文件進行了修改操作,但是發現,還是原版的好,想要找回之間的內容,這時,我們可以使用git中的撤銷操作,
    ? ? ? ? git restore file?把文件從暫存區域復制到工作目錄,用來丟棄本地修改?
    這里我們先新建了a.txt文件,接下來使用vim在文件中進行一些修改?接下來我們使用撤銷命令,

    可以看到成功實現了撤銷操作。與此命令類似,還有一種命令:
    git checkout -- file?把文件從暫存區域復制到工作目錄,用來丟棄本地修改,這里不再演示。

    提示:checkout的功能很多,從?Git 2.23?版本開始引入了兩個新的命令:?git switch?用來切換分支,git restore用來還原工作區的文件。

    提示:從暫存區恢復工作區數據的前提是,暫存區有對應數據。

    Git 取消暫存

    ????????git restore --staged file?恢復暫存區,也就是丟棄add到暫存區的狀態,是將內容從本地倉庫恢復到暫存區。


    ????????git reset -- file?恢復暫存區,也就是丟棄add到暫存區的狀態,是將內容從本地倉庫恢復到暫存區。????????

    注意:以上恢復暫存區的操作不影響工作區。

    Git 跳過暫存區

    這里的跳過暫存區不是不使用暫存區的意思,而是將暫存和提交兩個動作合在一體實現,從而跳過git add步驟

    git commit aa.txt -m '提交信息' //提交aa.txt
    git commit -a -m '提交信息'  //提交當前目錄下所有跟蹤的文件
    

    注意:使用-a跳過git add步驟的前提是這些待提交的數據,是已跟蹤過的-a不會自動將未跟蹤文件變為已跟蹤。

    ?Git 版本回退

    版本回退就是將暫存區回退到指定版本,并且刪除之前的所有提交信息,我們可以通過
    ? ? ? ? git reset [回退版本] 該命令實現

    這里的[回退版本]我們有兩種對象使用,一種是commit標識串,還有一種就是HEAD
    如果使用commit


    回退版本可以用commit標識中的前幾位符號表示,如回退到圖中時間更早的版本,就可以這么來寫,git reset 9541

    如果使用HEAD,HEAD表示指向當前分支(后面會講),當前分支指向最新的提交

    git reset HEAD
    git reset HEAD^ 回退到上一個版本
    git reset HEAD1 回退到上一個版本

    HEAD 說明:

    • HEAD 表示當前版本
    • HEAD^ 上一個版本
    • HEAD^^ 上上一個版本
    • HEAD^^^ 上上上一個版本
    • 以此類推...

    可以使用 ~數字表示

    • HEAD~0 表示當前版本
    • HEAD~1 上一個版本
    • HEAD~2 上上一個版本
    • 以此類推...

    還有一種功能,就是數撤銷工作區中所有未提交的修改內容,將暫存區與工作區都回到上一次版本,并刪除之前的所有信息提交。對于這種,我們可以通過:
    ? ? ? ? git reset --hard HEAD 來實現? ? ? ??

    Git 撤銷提交

    有時候我們提交了文件,但是后來發現,這個最新提交有些問題,需要撤回并且重新提交,對于這種問題,我們可以使用:
    ? ? ? ? git revert HEAD 來實現撤銷提交,HEAD表示撤銷最新的提交,HEAD^或者HEAD1表示撤回前一次提交。

    對于這個命令,還可以添加參數-n,表示撤銷最新提交,但執行命令后不進入編輯界面,也就是不會自動幫你提交文件,需要手動提交。
    ? ? ? ? git revert -n HEAD

    Git 設置忽略文件

    ????????一般我們總會有些文件無需納入 Git 的管理,也不希望它們總出現在未跟蹤文件列表。通常都是些自動生成的文件,比如日志文件,或者編譯過程中創建的臨時文件等。在這種情況下,我們可以創建一個名為?.gitignore?的文件,列出要忽略的文件模式。

    • 格式規范

      • 所有空行或者以注釋符號 # 開頭的行都會被 Git 忽略
      • 可以使用標準的 glob 模式匹配
      • 匹配模式最后跟斜杠(/)說明要忽略的是目錄
      • 要忽略指定模式以外的文件或目錄,可以在模式前加上感嘆號(!)進行取反
    • glob模式:所謂的 glob 模式是指 shell 所使用的簡化了的正則表達式,匹配規則如下:

      • "*":星號匹配零個或多個任意字符。

      • ?[]:匹配任何一個列在方括號中的字符,如[ab]匹配a或者匹配b。

      • ?"?":問號匹配一個任意字符。

      • ?[n-m]:匹配所有在這兩個字符范圍內的字符,如[0-9]表示匹配所有0到9的數字。

    • 匹配示例:

      • logs/:忽略當前路徑下的logs目錄或多級路徑下的logs目錄,包含logs下的所有子目錄和文件。

      • ?/logs.txt:忽略根目錄下的logs.txt文件。

      • ?*.class忽略所有后綴為.class的文件。?

      • !/classes/a.class不忽略classes目錄下的a.class文件。?

      • tmp/*.txt:只忽略tmp目錄下的.txt文件。

      • ?**/foo可以忽略/foo, a/foo, a/b/foo等。

    下面做個實操測試一下忽略文件,先隨便創建一個空文件夾,打開bash,init初始化git倉庫

    ?然后,再新建一個空文件夾,命名為test,在這個空文件夾中,新建一個.txt文件,我們通過新建設置.gitignore文件來忽略此.txt文件。


    現在設置gitignore文件:

    打開文件并編輯,按照規范設置忽略哪些文件:

    這里表示忽略test文件內所有.txt文件,現在我們在bash中查看git狀態,理論上,應該檢查不到.txt文件了。

    可以看到,成功的忽略了目標文件。

    Git 比較文件差異

    ????????有時候我們會把我們的代碼修改后,與最新提交的代碼相比較,對于這種問題,我們可以使用:
    ????????git diff 這條命令來實現:對比工作區跟暫存區的變化,顯示未暫存的的改動
    ????????git diff --cached|--staged?對比本地倉庫最新版本跟暫存區的變化,顯示未提交的改動。
    ????????git diff commit1 commit2?對比本地倉庫中倆個提交版本之間的差異,顯示commit2在commit1基礎上的改動。

    Git 代碼托管平臺


    目前我們使用到的git命令是都是在本地執行,如果你想通過 Git 分享你的代碼或者與其他開發人員合作, 你就需要將數據放到一臺其他開發人員能夠連接的服務器上,托管在這臺服務器上的數據的就是我們的遠程倉庫


    在使用遠程倉庫之前,我們首先要創建倉庫,創建倉庫有很多種,這里常見的有:自己搭建的Git服務器,安裝如GitLab的Git版本管理系統,或者使用第三方托管平臺(國內的/國外的)。

    常用的托管服務平臺(這些代碼托管平臺,都是基于git技術來實現的)

    • GitHub?(地址:?https://github.com/)是一個面向開源及私有軟件項目的托管平臺,因為只支持Git作 為唯的版本庫格式進行托管,故名GitHub。

    • 碼云(地址:?Gitee - 基于 Git 的代碼托管和研發協作平臺)是國內的一個代碼托管平臺,由于服務器在國內,所以相比于 GitHub,碼云速度會更快。

    • GitLab?(地址:?https://about.gitlab.com/) 是一個用于倉庫管理系統的開源項目,使用Git作為代 碼管理工具,并在此基礎上搭建起來的web服務。

    這里以國內的碼云平臺為例子,注冊并創建遠程倉庫

    第一步:打開碼云網址,并注冊https://gitee.com/

    第二步:填寫信息,點擊立即注冊:
    第三步:注冊成功,登錄后來到主頁
    第四步:創建遠程倉庫
    ?第五步:填寫倉庫信息

    第六步:創建遠程倉庫成功

    第七步:設置倉庫可見權限

    到此為止,在碼云平臺的git遠程倉庫就算創建成功了,后面再講,如何將本地倉庫和遠程倉庫聯系起來。

    Git 本地添加遠程倉庫

    ? ? ? ? 在本地倉庫添加遠程倉庫之前,要事先創建好遠程倉庫。對于本地倉庫,先使用 git init 初始化本地倉庫,初始化完成之后,開始為本地添加遠程倉庫,。可以使用如下命令來實現:

    git remote add <shortname> <url>
    // shortname:遠程倉庫的簡稱,自定義; 
    // url:遠程倉庫的地址

    提示:可以在.git/config文件中查看遠程倉庫的信息?

    對于添加的原車倉庫,我們可以使用git remote 來查看遠程倉庫

    如果要刪除遠程倉庫時,可以使用 git remote rm 遠程倉庫名 來實現
    【注意:該操作是在本地上移除與遠程倉庫的聯系,并不是將遠程倉庫從平臺上移除】

    將遠程倉庫代碼拉取到本地倉庫:git pull <遠程主機名> <遠程分支名>

    將本地倉庫代碼推送到遠程倉庫:git push <遠程主機名> <本地分支名>:<遠程分支名>
    ????????【如果本地分支(branch name 后面會講)與遠程分支名相同,則可以省略冒號】
    ????????git push <遠程主機名> <本地分支名>

    Git 克隆/推送代碼

    克隆就是

    將遠程倉庫(如GitHub,GitLab上的代碼庫)完整下載到本地,包括代碼,歷史記錄和分支,打個比方就是,就像下載一個游戲的安裝包到你的電腦,之后你可以離線修改游戲內容。

    例子:

    git clone https://github.com/用戶名/倉庫名.git

    推送就是將你本地的代碼修改上傳到遠程倉庫,讓其他人能看到你的改動

    git push origin 分支名

    首先我們需要知道遠程倉庫地址,然后復制到剪貼板


    然后在本地工作目錄中打開git bash,輸入克隆遠程倉庫的命令, git clone 遠程倉庫url


    更改本地工作區的文件,并且完成本地的工作流


    然后推送本地倉庫到遠程倉庫 git push

    Git 拉取:git pull 將遠程倉庫的數據拉取到本地進行合并
    ? ? ? ? git pull <remote> <branch>
    【要直接使用git pull時,要確保設置了跟蹤信息】

    我們可以通過在輸入上述命令之后再輸入以下命令,來設置跟蹤信息:

     git branch --set-upstream-to=origin/master
    

    Git 抓取(git fetch):將遠程倉房的數據拉取本地,但是不會自動合并
    【必須注意?git fetch?命令會將數據拉取到本地 - 它并不會自動合并或修改本地的工作。 當準備好時可以使用git merge?手動合并】

    git merge orgin/master
    
    ?Git 合并沖突

    ????????Git 合并沖突(Merge Conflict)?? 是指當 Git 無法自動合并不同分支(或同一分支的不同提交)的代碼修改時,需要手動解決沖突的情況。通常發生在多人協作或同時修改同一文件的同一部分代碼時。

    為什么會發生沖突???

    1. ?場景1?:你和同事同時修改了同一個文件的同一行代碼
    2. ?場景2?:你刪除了某個文件,而同事修改了該文件。
    3. ?場景3?:你從遠程拉取代碼(git pull)時,遠程分支的修改和你的本地修改沖突。

    Git 無法自動判斷該保留誰的修改,于是標記為沖突,需要你手動處理。

    ?沖突的表現:沖突的文件中會包含類似這樣的標記:

    <<<<<<< HEAD
    你的本地修改
    =======
    別人提交的修改
    >>>>>>> branch-name
    • <<<<<<< HEAD?到?=======?之間是你的代碼。
    • =======?到?>>>>>>> branch-name?之間是別人的代碼。

    那我們如何去解決這些沖突?
    首先,找到沖突文件,運行git status,Git會提示哪些文件有沖突(Unmerged paths)。
    然后,手動編輯文件,打開沖突文件,根據需求選擇:

    1. 保留你的代碼?:刪除別人的代碼和沖突標記(<<<<<<<,?=======,?>>>>>>>)。
    2. ?保留別人的代碼?:刪除你的代碼和沖突標記。
    3. ?合并兩者?:手動調整代碼,保留需要的部分。

    接著,標記沖突已解決:將修改后的文件添加進暫存區并提交

    git add 沖突文件名
    git commit -m "解決合并沖突"

    最后,將已經修改后的文件推送到遠程倉庫,git push?
    【提示:我們要養成推送之前,先拉取代碼的習慣,防止覆蓋合作者的代碼。】

    Git 注冊github賬號、操作遠程倉庫

    之前我們操作的是國內的碼云平臺,現在我們來操作國外的github平臺

    先打開github網址https://github.com/?點擊注冊【網址由于在國外有可能打不開,需要魔法上網】


    填寫信息:

    填寫完信息后,點擊驗證:

    點擊create account


    然后去你填寫的郵箱查看激活碼:

    填寫激活碼后,進入github首頁:

    接著創建遠程倉庫:

    填寫倉庫信息

    創建成功

    打開工作目錄,克隆遠程倉庫


    在本地添加文件,并且提交到本地倉庫


    然后推送到遠程倉庫


    可以看到推送成功!

    Git 使用SSH協議

    ? ? ?之前本地倉庫跟遠程倉庫數據的傳遞使用的是https協議,需要用戶名跟密碼進行身份驗證。我們還可以使用SSH協議,配置一次,以后每次再傳遞數據就不需要再使用用戶名跟密碼進行認證了。

    什么是SSH協議?

    ? ?SSH為Secure Shell(安全外殼協議)的縮寫,由IETF的網絡小組(Network Working Group)所制定。SSH是目前較可靠,專為遠程登錄會話和其他網絡服務提供安全性的協議。利用SSH協議可以有效防止遠程管理過程中的信息泄露問題。

    先在本地生成一對私鑰公鑰:

    ssh-keygen -t rsa
    

    ?先以碼云平臺設置SSH為例子:
    先打開碼云平臺,進入設置:

    點擊安全設置里的SSH公鑰

    填寫公鑰,點擊確定

    填寫當前登錄賬號的密碼進行驗證:


    打開倉庫,復制ssh協議的倉庫地址

    然后再進行克隆,推送操作。

    以上是在國內的代碼暫存平臺,接下來測試GitHub上如何使用SSH。

    不管在什么平臺上使用SSH協議都要事先在本地上生成私鑰公鑰,然后配置在平臺上。

    首先打開github網址,登錄進入設置區域,如下所示:

    在右邊導航欄中找到有SSH標識的區域:

    然后新建SSH公鑰:


    最后復制SSH協議的地址,進行數據傳遞,拉取,圖送等操作。

    Git分支

    Git中的分支,起始本質上就是一種指向commit對象的可變指針。Git會默認使用master作為分支

    分支在每次提交的時候都會自動向前移動,在進行了若干次提交后,你其實已經有了一個指針指向最后一次提交的對象的分支。

    那我們可以在當前分支上再創建一個新的分支嗎?當然可以,可以使用如下的命令實現:
    ? ? ? ? git branch 新建分支名稱 :這會在當前分支指向的commit對象上新建一個新的分支指針

    注意:?Git 中的分支實際上僅是一個包含所指對象校驗和(40 個字符長度 SHA-1 字串)的文件。

    我們為什么要使用分支呢?

    一般我們的項目會有:

    • 生產分支,專門用來上線,這里的代碼必須是經過測試定版的,比較穩定。(一般為master分支)。
    • 開發分支,生產分支的平行分支,專門用于后續的開發,或僅用于穩定性測試,一旦進入某種穩定狀態,便可以把它合并到 master 里。(一般為develop分支)
    • 功能分支,從develop分支創建,開發人員在這個分支上完成功能模塊代碼,提測的時候合并到develop分支。(名稱一般由這次的開發功能自定義)

    工作場景:開發人員在某個功能分支正在編寫代碼,突然接到一個電話說線上有個很嚴重的問題需要緊急修補,這個時候我們面臨的問題:當前的功能代碼不能提交到線上,所以不能在當前分支進行bug修復。

    • 返回到原先已經發布到生產服務器上的分支

    • 為這次緊急修補建立一個新分支,并在其中修復問題

    • 通過測試后,回到生產服務器所在的分支,將修補分支合并進來,然后再推送到生產服務器上

    • 切換回之前實現新需求的分支,繼續工作。

    Git HEAD與分支

    在git中,有一個指向你正在工作中的本地分支的指針,叫做HEAD。如果我們只有一個默認的master分支,則HEAD就會指向master分支。


    如果有多個分支,我們切換工作分支時,HEAD指針也會隨之變化,指向我們當前正在工作的分支

    那我們如何切換分支呢?
    ? ? ? ? 我們可以使用 git checkout 分支名稱 這條命令來實現HEAD指向目標分支進行工作

    在新分支上工作時,比如在testing分支上進行提交,則HEAD也會隨著分支一起向前移動,如下圖顯示,

    我們現在再切換到原來的master分支,HEAD指針也會移動到master分支:

    注意:切換分支,除了HEAD指針發生移動之外,工作目錄中的文件也會換成當前分支所指向的commit版本。

    Git 分支的管理


    新建本地分支:git branch <分支名>

    【注意:新建分支之前至少有一個已存在的分支】

    查看本地所有分支:git branch

    【注意:master分支前的 * 表示當前所在的分支】

    查看各個分支最后一個提交對象的信息:git branch -v

    切換分支:git checkout <分支名>


    【注意:切換分支后,本地工作區的工作內容也會更換】

    新建并且切換分支:git checkout -b feature

    刪除分支:git branch -d <分支名>

    Git 合并分支

    我們先創建新的分支,命名為iss53

    git checkout -b iss53
    

    然后在新的分支工作區提交內容

    git commit -am ''
    

    最后將新分支的提交合并到原來的分支:git merge <被合并的分支>
    【注意:要先切換到被合并的分支】

    git checkout master
    

    git merge iss53
    

    然后刪除沒有用的分支:

    git branch -d iss53
    
    Git 合并分支沖突

    Git 合并分支沖突是指當你在嘗試合并兩個分支時,Git 無法自動決定如何合并某些文件的修改,需要你手動介入解決的情況。

    那為什么會發生分支合并沖突呢?

    沖突通常發生在以下情況:

    1. ?同一文件的同一部分在兩個分支中都被修改了
    2. 一個分支刪除了文件,而另一個分支修改了該文件
    3. 兩個分支對同一文件的同一行做了不同的修改

    沖突的本質:Git 的沖突不是錯誤,而是 Git 的一種保護機制

    • 當 Git 可以明確知道如何合并時(比如一個分支修改了文件A,另一個分支修改了文件B),它會自動合并
    • 當 Git 不確定應該保留哪個修改時(比如兩個分支都修改了文件A的同一行),它會標記為沖突,讓你來決定

    沖突的直觀表現為:在代碼文件中,沖突會表現為特殊標記,如下所示:

    <<<<<<< HEAD
    當前分支的代碼
    =======
    要合并的分支的代碼
    >>>>>>> branch-name

    為什么需要解決沖突?

    1. ?保證代碼正確性?:自動合并可能會產生不符合預期的結果
    2. ?保持代碼一致性?:需要人工確認合并后的代碼邏輯是否正確
    3. ?避免引入錯誤?:防止自動合并導致的語法錯誤或邏輯錯誤

    現在我制造一個分支合并沖突事件:

    先基于master分支,新建開發分支dev,并切換到該分支中

    git checkout -b dev
    

    然后使用分支切換代碼,更改本地文件
    突然接到新的需求,需要更改線上bug,提交dev分支的本地工作,并且切換到master分支

    git checkout master
    

    基于master分支,新建bug修復分支hotfix

    git checkout -b hotfix
    

    在hotfix分支,修復bug,修復完成,提交,切換回master分支,將hotfix分支的提交合并到master分支

    git checkout master
    git merge hotfix
    

    切換回dev分支,繼續工作,工作完成后提交:

    git checkout dev
    

    切換回master分支,合并dev分支到master分支

    git checkout master
    git merge dev
    

    這時候就會產生分支合并沖突

    提示:可以使用git status查閱未合并的沖突

    Git 儲藏(git stash)

    ????????有的時候我們需要從當前正在工作的這個分支,切換到其它分支去解決問題,要切換到其它分支,我們可以先將當前的工作分支的本地修改進行提交,如果說你不想提交,你的代碼并沒有寫完,這個時候我們還可以把當前分支的本地修改暫時儲藏起來,讓它的工作區保持干凈,這樣就可以切換到別的分支了。將來我們還可以把儲藏起來的更改進行恢復,從而繼續之前的工作。

    儲藏當前的修改??git stash

    再次切換分支,成功

    取出之前儲藏的修改,即恢復dev分支的本地工作?git stash apply?先切換到dev分支

    Git 遠程分支_本地分支區別

    遠程分支(remote branch是對遠程倉庫中的分支的索引。它們是一些無法移動的本地分支,遠程分支就像是書簽,提醒著你上次連接遠程倉庫時上面各分支的位置。

    我們用?(遠程倉庫名)/(分支名)?這樣的形式表示遠程分支。

    在本地我們只能移動本地master分支,不能移動遠程分支origin/master。、

    例子:先從遠程倉庫克隆項目到本地
    在本地master分支修改內容,提交后,本地master分支移動,origin/master分支保持不變。

    只有跟服務器通信,遠程分支origin/master分支才會移動,比如其他人往遠程倉庫推送了代碼,則遠程倉庫中,master分支向前移動,我們可以通過?git fetch?獲取遠程倉庫庫的最新數據。

    通過git merge orgin/master將遠程分支的變更合并到本地master分支。

    Git 創建遠程倉庫的分支

    創建遠程倉庫的分支有兩種方法,一種是從本地向遠程倉庫推送分支,步驟如下:
    ? ? ? ? 現在本地新建分支feature_user
    ? ? ? ? 推送本地分支到遠程倉庫?git push 遠程倉庫名 本地分支名:遠程分支名

    git push origin feature_user
    //遠程分支名跟本地分支名相同,所以采用簡寫
    

    ? ? ? ? 其他協作的小伙伴通過git fetch獲取遠程倉庫的分支
    ? ? ? ? 通過遠程倉庫分支創建本地分支?git checkout -b 本地分支 遠程分支

    git checkout -b feature_user origin/feature_user
    

    提示:通過git checkout -b 本地分支名 遠程分支名創建的本地分支會自動跟蹤遠程分支。也可以先在本地新建feature_user分支,然后git fetch獲取最新數據,再通過git merge origin/feature_user手動合并到本地分支,但需要手動跟蹤遠程分支。

    設置跟蹤分支?git branch --set-upstream-to=origin/develop develop

    第二種方法是在遠程倉庫之間新建分支





    ?

    • 通過git fetch拉取遠程倉庫最新數據,并獲取遠程分支
    • 通過基于遠程分支創建本地分支或者新建本地分支再合并的方式開始開發
    Git 刪除遠程分支

    當我們的某個分支已經合并到了master分支,并且之后也不會繼續在該分支上進行開發使用,則可以從遠程倉庫把該分支刪除掉,避免雜亂的分支管理。

    在托管平臺直接刪除:

    ?

    在本地通過命令刪除?git push 遠程倉庫名 --delete 分支名

    【提示:刪除遠程分支,會將本地遠程分支這個指針跟服務器上面的對應分支刪除掉,本地分支不會被刪除】

    Git 標簽概念
    • 什么是標簽

      標簽可以是一個對象(帶注解標簽),也可以是一個簡單的指針(不帶注解標簽),用來標注某次提交對象。

      • 如果只是一個簡單的指針,則它就相當于一個不會移動的分支。

      • 如果是一個對象,則除了保存指向的提交對象的信息之外,還會保存是誰打的標簽,什么時間,還可以保存注解信息。(推薦使用)

    • 為什么使用標簽

      我們可以為重要的版本(某個里程碑)打上標簽,相當于為這次提交記錄指定一個別名,方便提取文件。比如人們在發布某個軟件版本(比如 v1.0 等等)的時候,經常這么做。

    • 標簽跟分支的區別

      分支會跟著我們的提交移動,指向最新的提交對象,但是標簽不會移動,它就是指向某個固定的提交對象。

    Git 標簽的管理

    新建標簽命令:git tag -a 標簽名 -m '標簽說明信息'

    -a?選項意為”創建一個帶注解的標簽”,如果不加-a則創建的是一個不帶注解的標簽,一個簡單的引用。

    -m?選項則指定了對應的標簽說明

    默認情況下,新建的標簽指向最新的提交對象。

    git tag -a v1.0 -m '發布版本v1.0'
    

    查看相應標簽的版本信息,并連同顯示打標簽時的提交對象:git show 標簽名

    git show v1.0
    


    如果我們忘了給某個提交打標簽,又將它發布了,我們可以給它追加標簽。
    git tag -a 標簽名 commitId -m '標簽說明信息'

    git tag -a v0.1 a29e110 -m '版本v0.1'
    


    列出所有標簽:git tag


    刪除標簽:git tag -d 標簽名

    
    
    Git 標簽_推送、檢出

    推送標簽到遠程倉庫:git push 遠程倉庫名 標簽名

    git push origin v0.1
    




    通過標簽獲取對應版本(檢出):git checkout -b 本地分支名 標簽名

    提示:檢出的前提是你本地已經有了遠程的標簽,如果沒有,使用git fetch獲取遠程倉庫最新數據,再執行檢出。

    image-20221019170218775

    image-20221019170244959

    image-20221019170315219

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

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

    相關文章

    idea添加gitlab訪問令牌

    1.按下圖所示順序操作gitlab,獲取到對應的token;2.填寫對應的gitlab地址和第一步獲取的token

    人工智能領域、圖歐科技、IMYAI智能助手2025年5月更新月報

    2025年5月IMYAI平臺技術動態與模型更新綜述 摘要&#xff1a; 本文整理了2025年5月期間IMYAI平臺發布的主要技術更新、新模型上線信息及功能調整公告&#xff0c;涵蓋DeepSeek、Gemini、Claude、即夢、Suno等模型動態及平臺功能優化。 正文&#xff1a; 一、 模型更新與上線Dee…

    機器人權利:真實還是虛幻,機器人權利研究如何可能,道德權利與法律權利

    一、機器人權利&#xff1a;真實還是虛幻&#xff1f;機器人權利的討論源于技術進步對傳統法律與倫理體系的沖擊&#xff0c;其真實性取決于技術發展階段與社會接受度的互動。當前&#xff0c;機器人權利仍呈現“虛幻與真實交織”的特征&#xff1a;技術基礎&#xff1a;從工具…

    通信小白產品學習碎片01

    1. 云中繼&#xff08;Cloud Media Relay&#xff09; 運營商在Volte/Vonr場景中引入的核心網關鍵功能&#xff0c;用于優化媒體流的傳輸路徑&#xff0c;解決跨運營商、跨地域通信時的網絡繞行問題。 傳統&#xff1a;A終端—>A核心網—>跨網互聯點—>B核心網—>…

    ?CVPR2025 3D 生成新框架|Kiss3DGen 讓 2D 擴散模型玩轉 3D 資產生成

    ?CVPR 3D 生成新框架&#xff5c;Kiss3DGen 讓 2D 擴散模型玩轉 3D 資產生成 &#x1f4c4;論文題目&#xff1a;Kiss3DGen: Repurposing Image Diffusion Models for 3D Asset Generation ??作者及機構&#xff1a;Jiantao Lin、Xin Yang、Meixi Chen 等&#xff08;HKUST …

    HTTP基本結構

    目錄前言1. 概念2. HTTP基本格式2.1 抓包原理2.2 抓包軟件使用2.3 抓包結果3. HTTP請求3.1 URL3.2 方法3.3 版本號3.4 HTTP報頭3.4 正文部分4. HTTP響應4.1 HTTP狀態碼4.2 其他部分總結前言 本篇文章介紹HTTP的基本結構。 1. 概念 HTTP全稱為超文本傳輸協議&#xff0c;是一…

    CVPR優秀論文 | DashGaussian:在200秒內優化三維高斯點繪制

    本文選自gongzhonghao【圖靈學術SCI論文輔導】關注我們&#xff0c;掌握更多頂會頂刊發文資訊1.導讀1.1 論文基本信息論文標題&#xff1a;DashGaussian: Optimizing 3D Gaussian Splatting in 200 Seconds作者&#xff1a;Youyu Chen、Junjun Jiang、Kui Jiang、Xiao Tang、Zh…

    知識蒸餾 - 基于KL散度的知識蒸餾 HelloWorld 示例 采用PyTorch 內置函數F.kl_div的實現方式

    知識蒸餾 - 基于KL散度的知識蒸餾 HelloWorld 示例 采用PyTorch 內置函數F.kl_div的實現方式 flyfish kl_div 是 Kullback-Leibler Divergence的英文縮寫。 其中&#xff0c;KL 對應提出該概念的兩位學者&#xff08;Kullback 和 Leibler&#xff09;的姓氏首字母“div”是 div…

    C語言基礎_補充知識、數據類型轉換、選擇結構

    0、補充知識&#xff1a; 原碼、反碼、補碼的知識&#xff1a; 計算機中原碼轉補碼&#xff0c;正數不變&#xff0c;負數是符號位不變&#xff0c;其余各位取反碼加一。負數的補碼轉原碼應該是補碼減一然后再取反&#xff0c;為什么負數的補碼轉原碼是補碼取反然后再加一&…

    ubuntu自動重啟BUG排查指南

    當 Ubuntu 系統意外重啟時&#xff0c;排查原因需要從系統日志、硬件狀態和定時任務等多個方面入手。 示例&#xff1a;通過日志檢查重啟原因 last -x | head | tac 此命令顯示最近的關機和重啟記錄。如果記錄中包含 shutdown 或 crash&#xff0c;則可能是人為操作或系統故障導…

    2. JS 有哪些數據類型

    總結 基礎類型&#xff08;7 種&#xff09;&#xff1a;number, string, boolean, null, undefined, symbol, bigint引用類型&#xff08;對象及其子類&#xff09;&#xff1a;object, array, function, date, regexp, map, set 等 判斷方式推薦&#xff1a; 基礎類型&#x…

    pipeline方法關系抽取--課堂筆記

    Pipeline方法課堂筆記 一、Pipeline方法原理 pipeline方法是指在實體識別已經完成的基礎上再進行實體之間關系的抽取. pipeline方法流程&#xff1a; 先對輸入的句子進行實體抽取&#xff0c;將識別出的實體分別組合&#xff1b;然后再進行關系分類. 注意&#xff1a;這兩個子過…

    linux系統離線環境安裝clickhouse客戶端

    1、下載離線安裝包&#xff1a; 方式1&#xff1a;網站直接下載 鏈接&#xff1a;https://packagecloud.io/altinity/clickhouse 注意要下載同一版本的四個包 方式2&#xff1a;夸克網盤分享 鏈接&#xff1a;https://pan.quark.cn/s/7e77e6a1bc5f 2、將本地下載的安裝包上傳…

    GPT-5的誕生之痛:AI帝國的現實危機

    目錄 前言 一、“俄里翁”的隕落&#xff1a;一場夢碎的代際飛躍 二、扎克伯格的“抄家式”突襲 三、天才的詛咒&#xff1a;當AI聰明到無法與我們對話 四、燒錢的無底洞與微軟的影子 結語&#xff1a;AI帝國的黃昏&#xff0c;還是黎明前的黑暗&#xff1f; &#x1f3a…

    探索設計模式的寶庫:Java-Design-Patterns

    在軟件開發領域&#xff0c;設計模式是解決常見問題的經典方案&#xff0c;它們如同建筑師的藍圖&#xff0c;為開發者提供了經過驗證的最佳實踐。今天我要向大家介紹一個GitHub上的明星項目——java-design-patterns&#xff0c;這是一個全面、實用且持續更新的設計模式寶藏項…

    JavaScript中的作用域、閉包、定時器 由淺入深

    1. JavaScript中的作用域是什么&#xff1f; 作用域&#xff08;Scope&#xff09;是程序中定義變量的區域&#xff0c;它決定了變量的可訪問性&#xff08;可見性&#xff09;。在JavaScript中&#xff0c;作用域主要分為三種&#xff1a;全局作用域、函數作用域和塊級作用域&…

    倉庫管理系統-11-前端之頭部區域Header的用戶登錄和退出功能

    文章目錄 1 登錄功能 1.1 登錄頁面(Login.vue) 1.1.1 頁面布局 1.1.2 初始化數據 1.1.3 confirm方法 1.1.4 UserController.java(登錄接口) 1.1.5 Login.vue 1.2 登錄頁面的路由 1.2.1 創建路由文件(router/index.js) 1.2.2 注冊路由器(main.js) 1.2.3 路由視圖(App.vue) 2 退出…

    【VLNs篇】07:NavRL—在動態環境中學習安全飛行

    項目內容論文標題NavRL: 在動態環境中學習安全飛行 (NavRL: Learning Safe Flight in Dynamic Environments)核心問題解決無人機在包含靜態和動態障礙物的復雜環境中進行安全、高效自主導航的挑戰&#xff0c;克服傳統方法和現有強化學習方法的局限性。核心算法基于近端策略優化…

    飛算科技:以自主創新引領數字科技浪潮,飛算JavaAI賦能產業智能化升級

    技術創新已成為企業突破瓶頸、實現跨越式發展的核心驅動力。作為國家級高新技術企業&#xff0c;飛算數智科技&#xff08;深圳&#xff09;有限公司&#xff08;簡稱“飛算科技”&#xff09;憑借其深厚的互聯網科技、大數據與人工智能技術積淀&#xff0c;以及在民生產業、中…

    51單片機按鍵復位電路電壓隨著電容放電升高的分析

    一、引言在單片機系統中&#xff0c;復位電路是一個至關重要的組成部分&#xff0c;它確保了單片機在特定情況下能夠恢復到初始狀態&#xff0c;從而避免程序運行錯誤或系統崩潰。對于51單片機而言&#xff0c;按鍵復位電路是一種常用的復位方式&#xff0c;它通過手動按下復位…