Git:一篇學會Git
集中式版本控制系統和分散式版本控制系統的區別
集中式版本控制系統
集中式版本控制系統簡單理解是:在遠端伺服器由版本控制系統統一管理程式碼,開發人員可通過客戶端連線工具連線遠端伺服器,拉取程式碼到本地;只有當開發人員提交到遠端伺服器時,由遠端伺服器作版本控制。典型代表有SVN。缺點:當遠端伺服器掛了,開發人員就提交不了程式碼,也就程式碼暫時不受版本控制
分散式版本控制系統
分散式版本控制系統簡單理解是:可像集中式版本控制系統,在遠端伺服器統一來管理程式碼,但版本的控制不再是遠端伺服器,由本地控制。可把本地已提交的程式碼,以推送的方式再推送到遠端伺服器
典型代表有Git。優點:當遠端伺服器掛了,開發人員可以繼續提交程式碼,只不過暫時推送不到遠端伺服器罷了
分散式版本控制系統代表:Git
Git允許我們在本地進行版本控制,他為我們劃分了3個區域:
- 工作區: 有.git所在的資料夾即是工作區,也是我們寫程式碼的地方,也是我們本地能直接看到的
- 暫存區:臨時儲存的區域,不受版本控制,在資料夾上未體現。
- 本地庫: 程式碼已提交的區域,受版本控制,在資料夾上未體現。
大家可簡單理解成這樣:git為我們的倉庫複製了3份,3個區域各一份;而工作區的程式碼是我們能直接看到並操作的,而暫存區和本地庫是資料夾上看不到的。
本地庫和遠端庫
- 本地庫是我們本地已提交的程式碼的地方,且能受版本控制
- 遠端庫通常是公司統一管理程式碼的地方,最新最正式的程式碼都要以這裡為準
git常用命令
命令 | 作用 | 備註 |
---|---|---|
git config --global user.name 使用者名稱 | 設定使用者簽名 | 安裝git後首次使用即可,這裡和以後本地庫推送和拉取遠端庫的那個賬號密碼沒有關係 |
git config --global user.email 郵箱 | 設定使用者簽名 | 安裝git後首次使用即可,這裡和以後本地庫推送和拉取遠端庫的那個賬號密碼沒有關係 |
git init | 初始化本地庫 | 切換到A資料夾下,使用該命令,則A資料夾作為git倉庫 |
git status | 檢視當前可追加和可提交的檔案 | 紅色標記的檔案為可追加檔案,綠色標記檔案為可提交檔案 |
git add 檔名 | 將未追蹤狀態的檔案進行追加到暫存區 | 【git add .】 |
git commit -m "日誌資訊" 檔名 | 將已追蹤檔案提交到本地庫 | |
git reflog | 檢視歷史提交記錄 | |
git reset --hard 版本號 | 切換到指定版本 | |
git rm --cached 檔名 | 將暫存區的檔案進行刪除 |
命令詳解
git reflog
git reflog:可檢視歷史提交版本;如下:
HEAD表示指標,正指向master分支(有master的那個分支正是當前分支)0;當有(HEAD -> master)的那個版本就是我們當前本地庫當前的分支!
git reset
git reset是切換歷史版本,最常用用的是:git reset --hard 版本號;當切換了版本,也是被日誌記錄起來的,如下:
分支
通常在實際開發中,都會建立多個分支,有生產分支,測試分支,開發分支等等,確保分支間的程式碼不受影響;即使開發程式碼有問題了,也不會影響到其他分支程式碼的正常使用
分支常用命令
命令 | 作用 | 備註 |
---|---|---|
git branch -v | 檢視分支情況 | 結果前面帶*的為目前所在分支 |
git branch 分支名 | 建立分支 | 建立分支,可以理解為將當前的倉庫重新複製了一份,和其他分支區分開(實際底層不是複製,而是指標); |
git checkout 分支名 | 切換分支 | 切換分支後,倉庫下的檔案會變成該分支下的狀態 |
git merge 分支名 | 合併分支 | 是當前分支使用該命令去合併其他分支,比如說master分支要合併dev分支的程式碼,需要切換到master分支,然後執行git merge dev |
注意:不同的分支,他們的3個區域是不同的,是獨立存在的。並且A分支要合併B分支時,B分支修改的程式碼先要提交到B分支的本地庫,A分支才能合併有效
合併分支衝突解決
在實際開發,衝突是避免不了。衝突發生的主要原因是:不同分支同一個檔案的同一個位置都進行了修改,在進行合併時,就會發生合併失敗的情況;
在實際開發的解決步驟如下:
- 假設master分支去合併dev分支發生衝突了,這時候會出現下面的提示:
- 當合並失敗時,git會把衝突的檔案自動合併一份到工作區,但是在暫存區和本地庫是不會有的;這時候我們需要手動的去處理工作區自動合併的檔案,如下:
- 假設衝突的檔案處理好了。還是正常的 git add 操作,但在commit時就不能像以前一樣。只能git commit 或 git commit -m "message",不能帶檔名。
- 根據上述的過程,衝突就會解決,之前的(master | merging) 變成 (master) 就表示合併成功了,如下:
Git團隊協作場景
本團隊內協作
流程如下,已有文字說明:
注:能直接對遠端庫進行推送和克隆的人,是需要先加入到團隊裡面,並且管理員進行授權的
跨團隊協作
開發中有可能會存在:需要其他公司來參與專案的開發,但可能由於某種原則,其他公司人員不能加入到團隊中,這時候就要如下圖的操作流程:
Git結合Github使用
建立遠端庫並推送程式碼
- 先建立遠端庫:
- 檢視目前有哪些連結有別名
命令:git remote -v,可檢視當前連結別名情況 - 為指定連結建立別名
命令:git remote add 別名 連結地址 - 推送指定分支的本地庫程式碼到遠端庫
命令:git push 連結名/別名 遠端分支名
當遠端庫程式碼被修改時,要更新本地庫
如果要拉取遠端庫的程式碼,需要指定地址和分支,命令: git pull 連結名/別名 遠端庫分支名
克隆遠端庫程式碼到本地
命令:git clone 連結名;這裡可暫時不用別名,因為當進行克隆操作時,實際上git把我們做了3件事
- 拉取遠端倉庫總資料夾A到當前的B資料夾下
- 將A資料夾進行初始化成git倉庫
- 為遠端庫連結建立別名;可使用 git remote -v檢視
團隊內協助
如果A剛進去公司,公司專案是放在github的某個遠端庫上,A需要先克隆專案下來,克隆完後完成相應的功能開發,要推送到遠端庫,這時是推送不上去,需要下面的操作:
-
倉庫管理員需要邀請A加入團隊
-
將邀請函連結發給A
-
A訪問邀請函連結,A要同意管理員傳送的邀請請求
-
當同意後,可推送程式碼到遠端庫。命令:git push 連結名/別名 遠端分支名
-
其他成員可拉取A提交的程式碼。命令:git pull 連結名/別名 遠端分支名
SSH免密登入
每次在拉取和推送時都要輸入使用者名稱和密碼顯然是很麻煩的事,其實可以通過https和ssh兩種方式來進行免密登入,但由於在公司裡ssh用得更多,下面就講下ssh免密登入配置,步驟如下:
- 開啟git bash客戶端,輸入ssh-keygen -t rsa -C 自己的郵箱;然後連續點選空格3次即可
- 複製 .ssh資料夾(在使用者家目錄下)下的id_rsa.pub檔案內容,去github上面進行配置,如下:
到這裡就已經完成了。後面如果要訪問倉庫地址,就可直接用ssh的地址,如下:
Git結合IDEA使用
環境準備
有一些檔案如.class .imi等檔案是不需要提交到本地庫和遠端庫的,因此我們只需要先配置好忽略提交的檔案資訊,操作如下:
1.在使用者家目錄下,即.gitconfig所在目錄下,建立git.ignore檔案,將下面的內容貼上進去:
# Compiled class file
*.class
# Eclipse
.project
.classpath
.settings/
# Intellij
*.ipr
*.iml
*.iws
.idea/
# Maven
target/
# Gradle
build
.gradle
# Log file
*.log
log/
# out
**/out/
# Mac
.DS_Store
# others
*.jar
*.war
*.zip
*.tar
*.tar.gz
*.pid
*.orig
temp/
- 開啟 .gitconfig檔案,配置第一步檔案的路徑資訊,如下:
[core]
excludesfile = C:/Users/xiaoming/git.ignore
- 在idea配置git的路徑資訊,如下:
- 這樣環境就準備好了
idea常見Git操作
idea初始化倉庫
idea新增檔案到暫存區
如果是資料夾級別新增到暫存區,取消下面的提示,請選擇“cancel”,如下:
idea提交檔案到本地庫
idea檢視提交日誌
idea切換版本
idea建立分支
idea切換分支
idea合併分支
合併分支出現衝突
當合並出現衝突時,會出現下面的彈框:
Accept Yours:只接受當前分支所作出的修改
Accept Theirs:只接受其他分支所作出的修改
Merge:手動合併
通常是選擇第3個來手動合併,如下:
最後手動合併的最終結果以中間的為準,如果確定中間的合併結果沒問題,點選【Apply】即可