文章目錄
概述
- 內容特點:
經驗 + 總結,內容全面,實用性強。
內容精簡,基於命令來講解 Git 在工作中的應用,快速上手。 - 環境說明:
系統:windos 10
Git版本:2.26.0-64位
一、Git簡介
1. 集中式vs分佈式
1.1 集中化的版本控制系統
在集中化的版本控制系統中,諸如 CVS、Subversion 以及 Perforce 等,都有一個單一的集中管理的服務器,保存所有文件的修訂版本,而協同工作的人們都通過客戶端連到這臺服務器,取出最新的文件或者提交更新。 多年以來,這已成爲版本控制系統的標準做法。
缺點:
- 必須聯網(速度慢)。
- 所有操作必須通過與中心服務器連接才能執行。
- 中央服務器的單點故障(如果宕機一小時,那麼在這一小時內,誰都無法提交更新,也就無法協同工作。 如果中心數據庫所在的磁盤發生損壞,又沒有做恰當備份,毫無疑問你將丟失所有數據——包括項目的整個變更歷史,只剩下人們在各自機器上保留的單獨快照)。
1.2 分佈式版本控制系統
在分佈式版本控制系統中,像 Git、Mercurial、Bazaar 以及 Darcs 等,客戶端並不只提取最新版本的文件快照, 而是把代碼倉庫完整地鏡像下來,包括完整的歷史記錄。 這麼一來,任何一處協同工作用的服務器發生故障,事後都可以用任何一個鏡像出來的本地倉庫恢復。 因爲每一次的克隆操作,實際上都是一次對代碼倉庫的完整備份。
優點:
- 離線工作(速度很快)。
- 強大的分支管理能力。
- 安全性高(每個用戶本地都有完整的版本庫)。
2. Git 是什麼?
Git是目前最快、最簡單也最流行的分佈式版本控制系統!
1. 直接記錄快照,而非差異比較
- 文件變更流
其它大部分系統(CVS、Subversion、Perforce、Bazaar 等等)以文件變更列表的方式存儲信息, 將它們存儲的信息看作是一組基本文件和每個文件隨時間逐步累積的差異 (它們通常稱作“基於差異”(delta-based) 的版本控制)。
- 文件快照流
在 Git 中,每當你提交更新或保存項目狀態時,它基本上就會對當時的全部文件創建一個快照並保存這個快照的索引。 爲了效率,如果文件沒有修改,Git 不再重新存儲該文件,而是隻保 留一個鏈接指向之前存儲的文件。 Git 對待數據更像是一個快照流。這是 Git 與幾乎所有其它版本控制系統的重要區別。
2. 近乎所有操作都是本地執行
在 Git 中的絕大多數操作都只需要訪問本地文件和資源,一般不需要來自網絡上其它計算機的信息。 因爲你在本地磁盤上就有項目的完整歷史,所以大部分操作看起來瞬間完成。
3.Git 保證完整性
Git 中所有的數據在存儲前都計算校驗和,然後以校驗和來引用。 這意味着不可能在 Git 不知情時更改任何文件內容或目錄內容。Git 用以計算校驗和的機制叫做 SHA-1 散列(hash,哈希)。 這是一個由 40 個十六進制字符(0-9 和 a-f)組成的字符串,基於 Git 中文件的內容或目錄結構計算出來。 SHA-1 哈希看起來是這樣:
24b9da6552252987aa493b52f8696cd6d3b00373
Git 數據庫中保存的信息都是以文件內容的哈希值來索引,而不是文件名。
3. Git工作流程
- Workspace:工作區
- Index / Stage:暫存區
- Repository:本地倉庫
- Remote:遠程倉庫
二、安裝與配置
1. 下載
- 官網網址,下載速度很慢
網址:https://git-scm.com/download/win - 阿里鏡像,下載速度很快
網址:https://npm.taobao.org/mirrors/git-for-windows/
2. 安裝
在Windows上安裝比較簡單,按默認選項安裝即可。驗證是否安裝成功,dos命令:
$ git --version
3. 配置
- 配置用戶信息(改成你的用戶名和郵箱,這是 Git 用來記錄操作者信息的,不驗證信息的正確性。git config命令的–global參數,表示你這臺機器上所有的Git 倉庫都會使用這個配置)
$ git config --global user.name "zhoumei" $ git config --global user.email [email protected]
- 查看配置信息
$ git config --list
- 查看全局配置信息
$ git config --global --list
三、初始化本地倉庫
- 將尚未進行版本控制的本地目錄轉換爲 Git 倉庫
$ git init
- 新建一個目錄,將其初始化爲 Git 倉庫
$ git init [project-name]
- 從其它服務器克隆一個已存在的 Git 倉庫(工作中最常用)
$ git clone [url]
四、遠程倉庫
“origin”是當你運行 git clone 時默認的遠程倉庫名字。 如果你運行 git clone -o booyah,那麼你默認的遠程分支名字將會是 booyah/master。
- 查詢遠程倉庫
$ git remote
- 查看遠程倉庫的簡寫與其對應的 URL
$ git remote -v
- 查看遠程倉庫的 URL 與跟蹤分支的信息
$ git remote show [remote]
- 新增遠程倉
$ git remote add origin https://gitee.com/zhoumgt/project01.git
- 刪除遠程倉庫
$ git remote remove origin
- 配置用戶公鑰(郵箱填寫“安裝與配置”步驟中配置的用戶郵箱即可),在~/.ssh目錄下(如果沒有.ssh文件夾,手動創建一個)執行如下命令:
ssh-keygen -t rsa -C "[email protected]" -f "gitee"
執行完命令後,會在.ssh文件夾下生成兩個文件:gitee、gitee.pub(gitee是本地私鑰,gitee.pub是要在Gitee上配置的公鑰):
在~/.ssh文件夾下添加config文件(目的是解決SSH衝突)
- config配置文件內容:
#gitee Host gitee.com HostName gitee.com PreferredAuthentications publickey IdentityFile ~/.ssh/gitee
- 登錄Gitee賬號,添加SSH公鑰:
- 把本地項目推送到遠程倉庫(Gitee)
$ git push -u origin master
- 拉取遠程倉庫的代碼
$ git pull [remote] [branch]
- 把本地代碼推送到遠程倉庫
$ git push [remote] [branch]
五、常用命令
所有命令都必須在Git倉庫的根目錄下執行。
1. 查看狀態
- 查看文件變更狀態
$ git status
2. 添加文件
- 添加指定文件到暫存區
$ git add [file]
- 添加指定目錄到暫存區,包括子目錄
$ git add [dir]
- 添加當前目錄的所有文件到暫存區(-A或–all或.效果相同,也可以使用*進行匹配)
$ git add .
3. 文件重命名
- 文件重命名(對未添加到暫存區的新增文件無效)
$ git mv [file-original] [file-renamed]
4. 刪除文件
- 刪除指定文件
$ git rm [file]
- 刪除文件夾
$ git rm -r [dir]
5. 提交文件
- 提交暫存區的所有文件到倉庫(-m表示註釋,必填)
$ git commit -m [message]
- 提交暫存區的指定文件到倉庫區
$ git commit [file1] [file2] ... -m [message]
- 跳過使用暫存區,直接提交到倉庫區(沒跟蹤的新增文件不會提交)
$ git commit -a -m [message]
6. 操作日誌
- 查看提交記錄
$ git log $ git log --pretty=oneline //將每個提交放在一行顯示
- 查看所有操作記錄(版本回退時查看版本id時很有用)
$ git reflog
六、撤銷操作
1. 恢復工作區
暫存區和未追蹤的新增文件保持不變
- 恢復工作區指定文件的更改
$ git restore [file]
- 恢復工作區所有文件的更改
$ git restore .
- 恢復指定文件的內容到某個版本
$ git checkout [版本id] [fileName]
2. 撤出暫存區
工作區的內容保持不變
- 撤出暫存區的指定文件
$ git restore --staged [file]
- 撤出暫存區的所有文件
$ git restore --staged .
3. 現場保護
- 把工作區改動的文件放入緩存
$ git stash
- 把放入緩存中的文件恢復到工作區
$ git stash pop
七、版本回退
- 重置暫存區與工作區,與上一次commit保持一致(未追蹤的新增文件保持不變)
$ git reset --hard
- 回退到上一個版本
$ git reset --hard HEAD^
- 回退到上上個版本,以此類推,一次提交即爲一個版本
$ git reset --hard HEAD^^
- 回退到指定版本
$ git reset --hard [版本id]
備註:
git reset --soft 版本id
:回退到某個版本,只回退了commit的信息,該提交包含的更改變爲modify狀態,如果還要提交,直接commit即可;
git reset --hard 版本id
:徹底回退到某個版本,工作區和暫存區的更改都將被撤銷;
八、分支
- 列出所有本地分支( 當前分支前面會標一個*號)
$ git branch
- 列出所有遠程分支
$ git branch -r
- 列出所有本地分支和遠程分支
$ git branch -a
- 新建一個分支,但依然停留在當前分支
$ git branch [branch]
- 新建一個分支,並切換到該分支
$ git checkout -b [branch]
- 把本地分支推送到遠程分支(遠程自動創建與該分支同名的分支)
$ git push -u origin [branch]
- 在本地創建和遠程分支對應的分支
$ git checkout -b [本地分支名] origin/[遠程分支名]
- 建立本地分支和遠程分支的關聯
$ git branch --set-upstream-to=origin/[遠程分支名稱] [本地分支名稱]
- 切換分支,並更新工作區
$ git checkout [branch]
- 刪除本地分支(未合併的分支,使用 git branch -d 命令刪除時會失敗。可以使用 -D 選項強制刪除)
$ git branch -d [branch]
- 刪除遠程分支
$ git push origin --delete [branch]
九、合併分支
-
工作場景描述:
從遠程master分支clone項目到本地(本地自動生成master分支與遠程master分支進行關聯);
在本地新增開發分支zhoumei,推送到遠程個人分支zhoumei;
在本地開發分支開發代碼,提交併推送到遠程個人分支,待功能開發完成後,申請合併代碼(從遠程個人分支合併到遠程master分支),完成開發。 -
提交完要提交的代碼
$ git commit -m 'xxx功能開發完成'
-
把改動但不需要提交的文件,放到緩存區
$ git stash
-
查看文件變更狀態,確認改動的文件全部放到緩存區
$ git status
-
從遠程master分支更新代碼到當前分支(自動merge)
$ git pull origin master
-
如果有衝突文件,解決衝突(手動合併)
-
衝突文件手動合併完成後,提交所有要提交的文件
$ git add . $ git commit -m '解決xxx合併衝突'
-
推送到遠程個人分支zhoumei
$ git push oringin zhoumei
-
在遠程個人分支發起代碼合併請求,通知負責合併代碼的人,完成代碼合併
-
恢復緩存中的文件
$ git stash pop
十、打標籤
像其他版本控制系統(VCS)一樣,Git 可以給倉庫歷史中的某一個提交打上標籤,以示重要。 比較有代表性的是人們會使用這個功能來標記發佈結點( v1.0 、 v2.0 等等)。標籤總是和某個commit掛鉤。如果這個commit既出現在master分支,又出現在dev分支,那麼在這兩個分支上都可以看到這個標籤。
- 列出所有tag
$ git tag
- 新建一個tag在當前commit(含工作區和暫存區的文件)
$ git tag [tag]
- 新建一個tag在指定commit
$ git tag [tag] [版本id]
- 查看tag信息
$ git show [tag]
- 提交指定tag(默認情況下,git push 命令並不會傳送標籤到遠程倉庫服務器上。 在創建完標籤後你必須顯式地推送標籤到共享服務器上)
$ git push [remote] [tag]
- 提交所有tag
$ git push [remote] --tags
- 刪除本地tag
$ git tag -d [tag]
- 刪除遠程tag
$ git push [remote] --delete [tagname]
- 新建一個分支,指向某個tag
$ git checkout -b [branch] [tag]
十一、在IDEA中使用Git
-
配置git
Settings-> Version Control-> Git,Path to Git execultable修改爲:安裝根目錄\bin\git.exe。點擊Test進行測試:
-
執行命令
在Terminal窗口執行git命令:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7GvawcYR-1592025704861)(https://zhoumei.github.io/images/imgs/Snipaste_2020-06-08_14-34-16.png)] -
解決控制檯中文亂碼:
修改控制檯shell路徑:Settings-> Tools -> Terminal,Shell path修改爲:安裝根目錄\bin\bash.exe
在idea安裝目錄下找到idea.exe.vmoptions和idea64.exe.vmoptions文件,在文件的最後添加:-Dfile.encoding=UTF-8
在git安裝目錄下找到etc/bash.bashrc文件,在文件的最後添加:
export LANG="zh_CN.UTF-8" export LC_ALL="zh_CN.UTF-8"
退出控制檯,重新進入即可。
-
提交&推送:
VCS-> Commit-> Commit and Push-> 輸入遠程倉庫的賬號和密碼。 -
顏色提示:
紅色:未加入版本控制
綠色:已加入版本控制,未提交
藍色:已加入版本控制,已提交,有修改
白色:已加入版本控制,已提交,未修改
十二、添加忽略文件
有些文件無需納入 Git 的管理,也不希望它們總出現在未跟蹤文件列表。 通常都是些自動生成的文件,比如日誌文件,或者編譯過程中創建的臨時文件等。 在這種情況下,我們可以在Git倉庫的跟目錄創建一個名爲 .gitignore
的文件,列出要忽略的文件。
# 忽略所有的 .a 文件
*.a
# 但跟蹤所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略當前目錄下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目錄下名爲 build 的文件夾
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目錄及其所有子目錄下的 .pdf 文件
doc/**/*.pdf