天天看點

Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)

〇、為什麼需要版本控制?

軟體的開發過程中:

開發完成一個版本1後,打包,部署。

然後繼續開發,定制新功能,增加新代碼…

某一天,需要再打包一個 版本1.此時項目中已經新增了很多代碼,甚至而且還有好多新代碼尚在開發測試中…

開發過程中,完成了一個功能A。

繼續寫其他功能,增加新代碼…

某一天,突然發現新功能的實作,就是一堆垃圾,完全不能使用,項目代碼需要恢複到 剛寫完功能A的狀态…

某一天,突然發現新功能被砍啦,項目代碼需要恢複到 剛寫完功能A的狀态…

某一天,突然發現接到新任務,需要對功能A進行改進,然後打包,部署,而此時項目中功能B的代碼已然很多,且功能B尚未完成…

Git是一個開源的分布式版本控制系統,用于靈活高效地處理任何或小或大的項目。

Git 是 Linus Torvalds 為了幫助管理 Linux 核心開發而開發的一個開放源碼的版本控制軟體。

Git 與常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本庫的方式,不必伺服器端軟體支援。

Git是目前世界上最先進的分布式版本控制系統(沒有之一)

官網:https://git-scm.com/

文檔:https://git-scm.com/book/zh/v2

版本控制發展:

原始的版本控制:項目寫完一個功能,就複制一個項目副本。進而有多個項目的版本,可以通過不同的檔案夾切換不同版本。此種方案會有大量的檔案出現,且不适合長線作業,終會陷入管理混亂

本地化的版本控制:引入一些管理軟體,幫助管理本地的多個版本。此種方案不能共享他人,不能多人協同開發

集中化的版本管理:一個版本伺服器,多個貢獻者,貢獻者将代碼送出到伺服器,并從伺服器下載下傳他人的代碼。 此種版本可以協同開發。典型工具如

Subversion,CVS

。但由于版本控制集中在伺服器中是以存 在單點故障問題。

分布式版本管理:多個貢獻者本地都有完整的控制版本功能,可進行版本管理。且通過一個版本伺服器共享彼此的代碼。 是本地化和集中化的彙總。好處:沒有單點問題,不強制依賴伺服器,不強制依賴網絡環境。典型工具 如

Git

下載下傳git 下載下傳TortoiseGit
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)

一、按照

Git安裝除了安裝位置外,其他一直下一步即可。
# 安裝後,打開cmd ,自報家門
# 如下資訊會在送出代碼時要使用,記錄在你的每次送出中。以後才知道哪次送出是誰做的,"git log"可以檢視
# 執行:
git config --global user.name "Your Name"  #使用者名
git config --global user.email "[email protected]"  #郵箱
# 檢視資訊
git config -l 
           
測試:cmd中執行

git version

檢視git版本

二、 倉庫

對應的就是一個

目錄

,這個目錄中的所有檔案被git管理起來。

以後會将一個

項目的根目錄

,作為倉庫。

倉庫中的每個檔案的修改、删除 git都能跟蹤。

2.1 基本指令 (重點)

**建立版本倉庫:**建立一個檔案夾,cmd指向該檔案夾,然後執行

git init

即可

.git目錄

儲存倉庫的所有内容

**新增檔案:**在檔案夾中建立一個檔案: xx.txt ,然後cmd執行該檔案夾,

​ 執行

git add xx.txt

增加一個檔案,如果出現轉移字元問題,可以采用

git config --global core.autocrlf false

git add xx.txt xx2.txt

增加多個檔案

git add abc

增加當庫目錄下的abc目錄中的所有檔案

git add .

增加庫目錄中所有檔案

送出檔案:

git commit -m "this is a test file"

【-m 後是對本次送出的描述】【送出添加的所有檔案】

git commit hello.txt hello2.txt -m "this is a test file"

送出某些檔案

git commit -a -m "this is a test file"

自動add并commit所有已跟蹤并修改或删除的檔案

檔案狀态:

git status

在送出後,如果檔案有改動,可以看到

檔案改動:

git diff hello.txt

檢視該檔案的改動情況

注意:每次對庫中内容改動後,都需要 add 和 commit操作,同步git,git中會記錄目前倉庫的快照(版本)。

删除檔案:

git rm hello.txt

git commit hello.txt -m "xxx"

即可
幫助:

git help commit

git commit --help

2.2 日志 - 送出曆史 (重點)

每次 commit,随着版本的記錄,也會留下日志。

執行:

git log

# 顯示從最早的送出點 到 目前送出點的 日志

git log --oneline

#簡潔日志顯示

git log --oneline -2

#簡潔日志顯示,最近2次送出日志

git log --oneline --graph

#圖形化顯示分支走向
#   commitID                                               描述
1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append xxx
e475afc93c209a690c39c13a46716e8fa000c366 add words
eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 add one line
           
注意git的

commitID

是通過SHA1計算出來的一個非常大的數字,用十六進制表示,在分布式中保證唯一。

2.3 版本回退(了解)

每次的修改檔案并add、commit 。git中也會記錄一個版本。如果有需要可以回退到之前的一個資料版本狀态。
執行:

git reset --hard HEAD~

# 回退到上一個版本

git reset --hard HEAD~~

# 回退到上上一個版本

git reset --hard HEAD~5

# 回退到上5個版本
執行:

git rest --hard e475a

#回退到commitID 為 "e475a…"的版本, commitID可以隻寫前幾位,唯一即可。

e475afc93c209a690c39c13a46716e8fa000c366=commitID, e475a是commitID的前幾位

總結:1> 每次commit,git都會保留一個版本,每個版本都有一個全局唯一的commitID

​ 2> git有個遊标:

HEAD

,指向目前的版本,是以可以移動遊标來回退版本

​ 3> 也可以通過 commitID 回退到某個版本

​ 4> 回退并不會删除任何版本,是以版本間可以來回切換

細節:發生版本回退後,通過

git log

隻能看到最原始送出點 至 目前送出點的 日志。

git reflog

可以看全部日志

ALT+9 表示調取【Version Control】在idea中可以進行版本回退操作

三、架構

3.1 結構組成(重點)

倉庫:就是第二章中,執行了

git init

的目錄
版本庫:工作區中有一個隐藏目錄

.git

,這個目錄不屬于工作區,而是git的

版本庫

,是git管理的所有内容

暫存區:版本庫中包含一個臨時區域,儲存下一步要送出的檔案。

分支:版本庫中包含若幹分支,送出的檔案存儲在分支中

工作區-版本庫-暫存區
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
1. 檔案首先出現在工作區,如果需要有git管理,則通過

git add xx

将檔案添加到暫存區

通過

git commit ...

将暫存區的檔案y一次性送出到

分支

同時送出行為将觸發git的一次commit日志記錄。 2.關于

分支

是git的一個重要概念,後續講解,master分支是安裝git時預設建立的

3.2 檔案狀态 (重點)

切換到某分支,在工作區操作其檔案,檔案的狀态會有如下可能:

  • 未跟蹤
    • 工作區中新建立的檔案,git中并未儲存它的任何記錄
    • git add 增加到暫存時,即可建立跟蹤
  • 修改
    • 已跟蹤的檔案,在工作區被修改了。
  • 暫存
    • git add 的檔案,處于暫存狀态。
    • 每次暫存的是檔案的當時狀态,如果暫存後又做了修改,需要再次 git add檔案。
    • 每次送出時,是将所有暫存的檔案送出。
  • 送出
    • git commit 的檔案,處于送出狀态。
    • 每次送出,增加一個快照版本,分支指針後移,指向最新版本。

3.3 檔案狀态檢視

在工作區中一系列操作後,要檢視檔案狀态:

執行:

git status

可以看到檔案狀态:

On branch master #分支 master

Changes to be committed:

#說明有内容在暫存區可以送出

(use “git reset HEAD …” to unstage)

modified: hello.txt

On branch master #分支 master

Changes to be committed:

#說明有内容在暫存區可以送出

(use “git reset HEAD …” to unstage)

modified: hello.txt

Changes not staged for commit:

#說明有内容沒有增加到暫存區

(use “git add …” to update what will be committed)

(use “git checkout – …” to discard changes in working directory)

modified: hello.txt

細節:通過

git diff

比對變動情況:

git diff hello10.txt

比對工作區和暫存區(若暫存區沒有,比分支)

git diff HEAD -- hello10.txt

比對工作區和分支中的最新結果 ( 了解或忽略此點 )

git diff --staged hello10.txt

對比暫存和分支中的最新結果 ( 了解或忽略此點 )

​ 坑:

-- hello10.txt

之間需要分隔,不能寫成

--hello10.txt

3.2 撤銷修改 (了解)

  • 工作區撤銷

如果在工作區檔案中添加了如下一行,你突然意識到飯碗可能不保,是以需要撤銷修改
...
My stupid boss still prefers SVN.
           
執行:

git checkout -- hello9.txt

可以撤銷到最近一次

git add 或 git commit

的狀态

即:如果 暫存區有此檔案,則将暫存區中的檔案内容恢複到工作區。 如果 暫存區沒有此檔案,則将分支中的檔案内容恢複到工作區。

注意:

-- hello9.txt

一定不能少寫

--

,否則就是其他語意啦。
  • 暫存區撤銷

如果在工作區中修改了檔案并發送到暫存區中,但檔案中有需要撤銷的内容

則可以執行:

git reset HEAD hello9.txt

将hello.txt在暫存區的内容清除。

然後可執行:

git checkout -- hello9.txt

回退到上一個版本

四、分支(重點)

就是一條時間線,線上每個點都是一次送出,都記錄了當時的檔案快照。

4.1 分支概述

1> 預設有一個分支,master。

2> 分支中接收 git commit 送出的内容,為一個一個不斷向前發展的送出點。每個送出點都儲存一個代碼版本。

3> 每個分支,都有一個指針,指針預設指向最近一次送出的版本。

4> 工作區中的内容,初始狀态,就是指針所指向的版本狀态。

5> 基于指針指向的版本代碼,在工作區中做進一步的編碼,功能完成後,即可 git commit,在分支中形成新的送出點,指針也後移一步。

6> 然後再在工作區中,添加新代碼,功能完成,再 git commit,又形成新的送出點,指針再次後移。

如此反複,不斷開發,不斷記錄版本。

7> 當有需要時,可以回退指針到某個送出點,在工作區中即可得到之前的某個版本的代碼。

如下是分支效果圖:
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)

4.2 多分支使用

情景1:在編寫一個功能時,需要一周的時間,在一周之間可能會有多次送出,但最後卻發現有問題,那這些有問題的送出點就摻雜在master分支中。使master分支很混亂;

情景2:在編譯一個功能時,有一個臨時的思路,但不确定能否最終實作預期功能,隻能試着編寫,最後發現不成立,則送出過的所有送出點都無效,也會摻雜在master分支中。

而且如果是多人協同開發,有可能影響到其他人的開發進度。

實際開發中master分支我們隻願意存放穩定的代碼送出,保證master分支穩定,有效。

方案1:一直不送出,等所有都寫完後,送出一次。雖然可以保護master分支,但開發過程中缺乏版本控制點,易丢失工作。

方案2:在需要編寫新功能時,建立一個開發用的分支,所有改動都在該分支上送出,在功能完整實作後,将該分支的最終内容合并到master分支,這樣,既保證開發中有多個版本可以控制,又保證master分支是穩定,有效的

方案2,實施過程:
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)

4.3 建立-切換

在某個庫目錄中,執行:
`執行`:git branch new_branch #建立分支,會和目前分支保持同樣的資料狀态,即新分支和目前分支指向同一個送出點
`執行`:git checkout new_branch #切換分支,工作區中顯示目前分支的内容。( 切換分支,實際隻是在切換指針 )
`執行`:git branch #檢視目前分支
       git brach -vv #檢視分支詳細資訊( 分支資訊,所跟蹤的遠端分支資訊,是否領先遠端分支等 )
           

4.4 合并-删除

新分支改動完成後,切換到master分支:
`執行:git branch master  #切換到master分支
`執行:git merge newBr   #合并newBr分支
           
如上就進行了合并,此次合并就是将master的指針移到了newBr的位置 == 快速合并。
合并後,新分支如果不再使用,可以删除 (了解):
`執行:git branch --merged  #檢視被目前分支合并了的 分支( ops:删除分支前,先确認其已被合并,保證工作不丢失 ) 
`執行:git branch -d newBr  #删除newBr分支
           

4.5 沖突-解決

人生處處有驚喜,分支開發怎麼可能一直這麼順利,在合并過程中分支間會有不和諧出現。
場景如下
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
1> 建立新分支。分支圖1
2> 切換到新分支,并在檔案最後添加 “ hello CHINA” ,然後送出。分支圖2
3> 切換回master分支,并在檔案最後添加 “hello china” 後送出。分支圖3
4> 在master分支中合并newBr分支。合并中出現沖突。分支圖4
沖突點:兩個分支對同一個檔案都做了改動,是以在合并時git會無法确定保留哪個分支的改動。
執行:

git merge newBr

時,提示:

Auto-merging hello.txt

CONFLICT (content): Merge conflict in hello.txt

Automatic merge failed; fix conflicts and then commit the result.

#合并出現沖突後,git将雙方的修改都保留了,并且用 <<<<  ======  >>>>> 做了分隔
hello world
<<<<<<< HEAD
hello china
=======
hello CHINA
>>>>>>> newBr
           
此時需要人為手工修改,比如我們最終改為

hello China

#手動改為如下:
hello world
hello China
           
執行:

git add hello.txt

git commit hello.txt -m "conflict handle"

# 重新送出

執行:

git branch -d newBr

# 如果分支不再使用,删除新分支即可
執行:

git merge --abort

#中止合并,發生沖突時可以選擇撤銷本次合并

執行:

git merge dev2 -Xignore-all-space

#避免因為空白導緻沖突( 了解 )

4.6 快照

git在儲存每個版本時( 對應送出點 ),并不是複制所有檔案,沒有改動的檔案隻是記錄一個連結
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)

4.7 合并方式

快速合并
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
三方合并
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)

五、遠端倉庫(重點)

Git是分布式版本控制系統,同一個Git倉庫,可以分布到不同的機器上。怎麼分布呢?最早,肯定隻有一台機器有一個原始版本庫,此後,别的機器可以“克隆”這個原始版本庫,而且每台機器的版本庫其實都是一樣的,并沒有主次之分。

實際情況往往是這樣,找一台電腦充當伺服器的角色,每天24小時開機,其他每個人都從這個“伺服器倉庫“克隆一份到自己的電腦上,并且各自把各自的送出推送到伺服器倉庫裡,也從伺服器倉庫中拉取别人的送出。

完全可以自己搭建一台運作Git的伺服器,不過現階段,為了學Git先搭個伺服器絕對是小題大作。好在這個世界上有個叫GitHub的神奇的網站,從名字就可以看出,這個網站就是提供Git倉庫托管服務的,是以,隻要注冊一個GitHub賬号,就可以免費獲得Git遠端倉庫。

當然國内也有git伺服器:碼雲

公司内部往往會搭建自己的git伺服器,可能選型為: gitlab

Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)

5.1 設定SSH-Key

git本地庫和 github 或 碼雲 之間傳輸,建議設定SSH key,避免在傳輸中反複輸入密碼

執行:

ssh-keygen -t rsa -C "[email protected]"

然後一直回車即可 -C後"可以随意寫一個,作為key的title而 已,無關緊要"

最後:在

C:\Users\主機名\.ssh

目錄下生産秘鑰檔案,

id_rsa

是私鑰,不能洩露出去,

id_rsa.pub

是公鑰,可以放心地告訴任何人。

登入GitHub,在賬戶設定中,選擇 “SSH Keys” ,在Title中随便填寫一個,在Key中填寫

id_rsa.pub

檔案中的所有内容即可。
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)

這樣和Git伺服器通信時(clone,push,pull) git伺服器就可以識别出你的身份。

識别出你是誰;你是否有權限通路某個遠端庫;你是否可以上傳你的代碼。

5.2 建立遠端庫

Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)

5.3 關聯遠端庫

将本地git庫 和 遠端github庫建立關聯。可以友善本地庫和遠端庫的

push和pull

# 添加遠端庫      遠端庫别名               庫位址
git remote add   origin     [email protected].com:zanghongjiu99/repo.git  # 注意:origin是預設會有的别名
git remote add   test       [email protected].com:zanghongjiu99/repo2.git # 還可以設定自己的别名
git remote -v  # 檢視關聯的所有遠端庫
git remote rm origin  # 删除origin重新定義
git remote show origin # 關聯遠端庫後,本地分支和遠端分支的對應關系
git remote remove origin  # 删除關聯
git remote rename origin origin2 # 重命名
           

5.4 Push

将本地master分支的内容上傳到 關聯的遠端庫中,push結束後在github中可見
# 本地的master分支上傳到與之有跟蹤關系的遠端分支中,(克隆時就會建立跟蹤關系),如果遠端分支不存在,則會建立遠端分支
git push origin master
# 本地存在分支dev,上傳到遠端庫origin的分支dev,如果沒有dev,将建立遠端分支dev
git push origin dev:dev
# 本地庫dev:遠端庫dev  本地庫dev2:遠端庫dev2
git push origin dev:dev dev2:dev2
# push動作,其一需要你有權限push,其二需要在你pull之後沒人push過。(樂觀鎖機制)
           

5.5 Fetch-Merge (了解)

拉取遠端的新内容,存于本地版本庫。

注意:并沒有合并到本地庫的分支中,需要通過 merge 手動合并

# 拉取遠端 master分支中本地沒有的内容(即其他開發者push的内容),
git fetch origin master # 拉取的分支名為 ”origin/原始分支名“存儲位置:【.git\refs\remotes\origin】
git merge origin/master #把拉取下來的master分支的内容 合并到本地庫中的分支上
# 如上兩個指令可以将git伺服器上的最新版本狀态同步到本地庫中

# 拉取所有分支的的内容(本地沒有的,其他開發者push的内容)(假定有分支:dev2,dev3) (先忽略,如果你已經掌握了第五章可以回頭來看)
git fetch origin
git checkout dev2 并 git merge origin/dev2 #切換到dev2分支,并合并拉取下來的内容
git checkout dev3 并 git merge origin/dev3

git checkout dev2 并 git diff origin/dev2 #切換到dev2分支,比較拉取的内容中的dev2分支 和 本地dev2分支的不同
           

5.6 Pull

等價于

git fetch + git merge

拉取遠端的新内容,并合并到目前分支
# 文法格式:git pull <遠端主機名> <遠端分支名>:<本地分支名>
# 完整寫法
git pull origin master:master

# 省略本地分支名 = master:目前分支(預設)
git pull origin master

# 省略本地分支名 = dev:目前分支
git pull origin dev

# 拉取遠端origin的所有分支中的改變,并将屬于目前分支的改變自動merge
git pull origin

# 更新遠端分支
git pull
           

5.7 Clone

下載下傳遠端庫中的内容,注意clone操作會自動搭建關聯,即

5.3

中所描述的。
# 任意建立一個目錄,并執行:
git clone [email protected]:zanghongjiu99/repo.git   #ssh 位址,将遠端庫clone到本地,已設定key,不用密碼
git clone https://github.com/zanghongjiu99/zhj_repo.git  #https位址,需要輸入github密碼
           
細節:clone 隻在初次從git伺服器下載下傳項目時執行一次,後續在需要同步應該執行

pull 或 fetch

當你執行

git clone

指令的時候,預設配置下遠端 Git 倉庫中的每一個檔案的每一個版本都将被拉取下來。

5.8 協同工作流程(重點)

  • 項目管理者( 項目經理 )

    1> 由管理者負責建立一個遠端庫,初始的庫中什麼也沒有,成為裸庫,如5.2中所述。庫的名稱建議和項目同名

    2> 管理者會在idea中建立一個空項目,其中包含

    .gitignore檔案

    。 并在項目根目錄下

    git init

    . 建立本地庫。并建立

    dev分支

    3> 管理者将本地庫同步到遠端庫:

    git push 遠端庫位址 master:master dev:dev

    4> 将其他開發人員拉入遠端庫的

    開發成員清單中

    ,是的其他開發人員可以通路該遠端庫。

    5> master分支設定為

    protected分支

    ,隻有管理者有權限将代碼合并到其中。dev分支設定為

    正常分支

    所有開發人員 都可以其中合并代碼
  • 開發人員
    1> 初始化:在cmd或idea中

    clone

    遠端庫,獲得項目。執行

    git clone 遠端庫位址

    即可。會建立本地庫

    2> 獲得項目時,本地庫中隻顯示master分支,需要執行:

    git checkout dev

    即可獲得dev分支。

    3> 後續的開發中,都要在dev分支上進行。開發完一個功能并測試通過後就可以

    git add ..

    git commit ..

    送出到本地的dev分支中,然後

    git push 遠端庫位址 dev

    同步到遠端dev分支中。 是否需要在本地master中合并下?

    4> 注意如果在

    git push

    遠端庫時,有人比你早一步

    git push

    ,git伺服器将拒絕你的

    git push

    .(樂觀鎖原理) 不過很簡單,你需要

    git pull 遠端庫 dev

    git merge origin/dev

    ,然後再

    git push

    即可。

    ​ 理想狀态:遠端有的代碼,本地都有,遠端沒有的代碼,本地也有,這樣push是最好的。是以需要pull一次,進行一次合并,然後再push

    後續的開發,會接到一個個的功能任務,往複操作 3> 和 4> 而已。

  • 效果

    在實際開發中,我們應該按照幾個基本原則進行分支管理:

    首先,

    master

    分支應該是非常穩定的, 也就是僅用來釋出新版本,平時不能在上面幹活;

    那在哪幹活呢?幹活都在

    dev

    分支上,也就是說,

    dev

    分支是不穩定的,到某個時候,比如1.0版本釋出時,再有管理者把

    dev

    分支合并到

    master

    上,在

    master

    分支釋出1.0版本;

    你和你的小夥伴們每個人都在

    dev

    分支上幹活,每個人都有自己的分支,時不時地往

    dev

    分支上合并就可以了。

    是以,團隊合作的分支看起來就像這樣:

    Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
    ops:如上4個分支,由上而下分别是【遠端master,遠端dev,micheal的本地dev,bob的本地dev】

六、标簽

在衆多的送出中,總有些送出是尤為重要的,比如重大bug的解決,比如一個新版本的釋出等。這些送出身處分支的衆多送出點中,可以為他們

打标簽

,讓他們

更顯眼

,可以更快速的找到他們。

6.1 打标簽

# 建立輕量标簽
git tag v1.1.0
# 建立附注标簽 ( 就是帶說明的輕量标簽 )
git tag -a v1.1.1 -m "說明文字"
#注意,建立的标簽會自動 打在最近的送出點上
#如果要給過往的送出點 追打标簽,需要 git log 去檢視送出點的 “commitID”
git tag [-a] v1.1.1 "commitID"
           

6.2 檢視标簽

#檢視所有分支上的所有标簽 ( 檢視标簽并不區分分支 )
git tag
#查找标簽名以 “v1.1”開頭的标簽
git tag -l "v1.1*" 
#顯示标簽 及其對應的送出點資訊
git show v1.1.0
           

6.3 共享标簽

标簽不會随送出點一起 送出到遠端伺服器,需要單獨push。

pull時,标簽會一同被下載下傳到本地

# 同步一個标簽 “v1.1.1”  到git伺服器
git push origin v1.1.1
# 同步所有标簽 到git伺服器
git push origin --tags
           

6.4 删除标簽

标簽删除需要在本地和遠端分别删除。
# 在本地删除标簽
git tag -d v1.1.1
# 删除遠端庫中的标簽
git push origin :refs/tags/v1.1.1
           

6.5 标簽使用 (重點)

标簽主要用于釋出版本。

假定已經為各個釋出版本打了标簽:

v1.0 v1.1 v2.0 ....

現在需要

1.0版本

# 分離一個指針到 v1.0送出點位置
git checkout v1.0 #( 分離頭指針,是一個臨時指針,不歸屬任何分支 )
git checkout commitId #( 分離頭指針,是一個臨時指針,不歸屬任何分支,不如标簽友善 )
# 然後将工作區的代碼打包(jar或war)即可。
mvn package
# 最後随意切一個分支,分離頭指針消失。什麼也沒發生過。
git checkout ”任意分支“
           

七、别名

一些指令比較麻煩,可以定義别名,簡化書寫。
git config --global alias.ck checkout # git ck等價git checkout
git config --global alias.commit "commit -m"  # git commitm 等價 git commit -m
git config --global alias.br branch # git br
git config --global --unset alias.commitm # 删除alias.commitm
           

八、Idea-Git(重點)

可以在idea中輕按兩下shift

搜尋【versionControl】然後在視窗中點選【log】可以檢視送出分支圖

8.1 clone遠端

操作過程見下圖
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)

8.2 送出代碼

注意在idea做開發時,一定要先切到

dev分支

,在dev分支上編碼。

完成一個階段編碼後,可以送出代碼

1. 可以通過指令:
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
2. 可以通過idea圖形界面:
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)

8.3 Push遠端庫

當然可以在idea的 “Terminal”面闆執行:

git push origin dev

.

如下示範idea的圖形界面操作

本地分支同步到遠端分支:push
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
push結束後,可以到 “Version Controll” 面闆 檢視 “Console” ,獲知push結果。

8.4 Fetch遠端庫

1. 和如上一樣,在idea的

“VCS” ==> "Git"==> "Fetch"

抓取遠端庫中的新内容

2. 準備合并遠端庫上的内容:

“VCS” ==> "Git"==> "Merge Changes..."

3. 最後如下圖:.
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)

九、忽略檔案

在idea開發時,會有很多和項目本身無關的檔案

還有一些是不能共享的項目檔案,比如包含自己資料庫資訊的 db.properties

還有java的位元組碼檔案

idea産生的檔案 項目中的不能共享的配置檔案
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
Git的應用〇、為什麼需要版本控制?一、按照二、 倉庫三、架構四、分支(重點)五、遠端倉庫(重點)六、标簽七、别名八、Idea-Git(重點)九、忽略檔案十、補充 (了解)
此類檔案,不必出現在版本控制中,可以在項目根目錄下建立忽略檔案:

.gitignore

,檔案中定義:
# 所有class字尾的檔案
*.class
# 所有jar字尾的檔案
*.jar
*.iml
*.war
# .idea 檔案夾
.idea
# 所有.txt 檔案
*.txt
# 資料庫連接配接參數 檔案
db.properties
# abc.txt除外,不忽略
!abc.txt

*.class
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
db.properties
*.class
*.iml
.idea
*.txt
           

關于忽略檔案,在github上,碼雲上都有模闆,針對各種語言都有

碼雲:https://gitee.com/rockyniu/gitignore

github:https://github.com/github/gitignore

可以下載下傳使用,并添加自己的檔案或目錄

十、補充 (了解)

10.1 儲存工作

功能還沒寫完,還不适合送出,但此時需要去解決另一個bug,需要切換分支,則目前功能工作區中的改動會被新分支的内容覆寫,是以此時可以先儲存下目前功能的内容,然後就可以放心的切換到其他分支先幹别的事,過後再回來。

git stash

:儲存目前修改( 未送出的内容 ,包括未暫存和已暫存的)
#                                             分支                      檔案
Saved working directory and index state WIP on dev: a795274 dev commit Test.java
           

git stash list

:檢視存儲清單
# 辨別            分支                      儲存檔案
[email protected]{0}: WIP on dev: a795274 dev commit Test.java
           

git checkout 其他分支

:可以放心的切到其他分支,完成其他工作

git checkout dev

:切回dev分支,并:

git stash apply

:恢複儲存的工作,繼續編碼

注意:沒用的存儲建議删除:

git stash drop [email protected]{0}

:删除某一個儲存點

git stash clear

:清空所有儲存點

10.2 回退詳解

三種回退模式:mixed、hard、soft,預設mixed。

  • git reset --mixed HEAD~
  • git reset --hard HEAD~
  • git resst --soft HEAD~
回退是指:送出點回退。就是在某個分支上指針後移。回到之前的某個版本。
# 基本使用: 目前分支 指針回退兩步,就是回退到上上一個送出點。(無論是 mixed,soft,hard)
git reset HEAD~~
git reset HEAD~2
# 基本使用: 目前分支 指針指向到對應commitID的的送出點
git reset commitID
           
會退時,除了指針必然移動,還有些細節:
##################### Soft ##########################
# 指針後退一步,但暫存區内容不變,工作區内容不變
git reset --soft HEAD~
加入有3個送出點,依次為 A --> B --> C
A中:添加一個檔案abc.txt
B中:修改abc.txt,及其他一些修改
C中:添加一個檔案def.txt 并送出。
C中:繼續修改,并最終完成功能,做最終送出。可以還有一種選擇:
【先從C回退到A,然後再送出,送出點就變為:A --> D.送出後内容總量不變,但起到送出點被壓縮】
           
##################### Mixed ##########################
# 指針後退一步,但暫存被清空:即版本庫回到了上次送出的狀态。 但工作區不變。
git reset --mixed HEAD~
# 然後執行:
git checkout -- abc.txt #從版本庫中拉取abc.txt檔案,可以将工作區的某個檔案回退到上個版本
##############################################
# 或者執行,達到将暫存内容清空
git reset --mixed HEAD #指向目前送出點,其實沒回退指針,但會清空暫存。
# 然後執行:
git checkout --abc.txt ##從版本庫中拉取abc.txt檔案,恢複當目前版本的原始狀态 ( 撤銷了所有修改 )
           
###################### Hard ###########################
#指針後退一步,暫存清空,且将工作區也同步到指針所指的狀态
git reset --hard HEAD~  # 用于拉取某個特定送出點的檔案
           

10.3 修補送出

送出後發現有問題,比如有些注釋忘記修改,比如送出描述不夠詳細等等。

當然可以修改後,在送出一次,但是還有更好的辦法:

git commit --amend -m"xxxxx"

:會再次送出并替換上次送出

千峰gitlab

.txt 并送出。

C中:繼續修改,并最終完成功能,做最終送出。可以還有一種選擇:

【先從C回退到A,然後再送出,送出點就變為:A --> D.送出後内容總量不變,但起到送出點被壓縮】

```sh
##################### Mixed ##########################
# 指針後退一步,但暫存被清空:即版本庫回到了上次送出的狀态。 但工作區不變。
git reset --mixed HEAD~
# 然後執行:
git checkout -- abc.txt #從版本庫中拉取abc.txt檔案,可以将工作區的某個檔案回退到上個版本
##############################################
# 或者執行,達到将暫存内容清空
git reset --mixed HEAD #指向目前送出點,其實沒回退指針,但會清空暫存。
# 然後執行:
git checkout --abc.txt ##從版本庫中拉取abc.txt檔案,恢複當目前版本的原始狀态 ( 撤銷了所有修改 )
           
###################### Hard ###########################
#指針後退一步,暫存清空,且将工作區也同步到指針所指的狀态
git reset --hard HEAD~  # 用于拉取某個特定送出點的檔案
           

10.3 修補送出

送出後發現有問題,比如有些注釋忘記修改,比如送出描述不夠詳細等等。

當然可以修改後,在送出一次,但是還有更好的辦法:

git commit --amend -m"xxxxx"

:會再次送出并替換上次送出

繼續閱讀