1.工作流程
四個區(qū)域
- 遠(yuǎn)程倉庫
- 本地倉庫
- 工作區(qū)
- 暫存區(qū)
2.Git使用初體驗
2.1配置使用者信息
git config --global user.name
//配置用戶名
git config --global user.email
//配置郵箱
git config --global --list
//查看配置
2.2常用命令
git init
// 在指定文件夾下執(zhí)行,之后該文件夾會變成一個git倉庫
git status
// 查看 Git 倉庫的狀態(tài),主要是查工作區(qū)和暫存區(qū)有沒有文件。
git add 文件名
//將文件添加到暫存區(qū)中
git commit 文件名 -m '注釋內(nèi)容'
//將文件添加到本地倉庫中并產(chǎn)生歷史版本記錄
git log
//查看當(dāng)前分支歷史提交記錄
3.Git 基礎(chǔ)命令相關(guān)操作拓展
3.1 git add 的批處理操作
git add .
//將修改的文件和新文件,直接提交到暫存區(qū)中
git add -u
//僅將執(zhí)行過 git add 后再次修改的文件直接放入暫存區(qū)中
git add -A
//上面2個命令的集合。
3.2git log 使用操作詳細(xì)介紹
git log
//當(dāng)前分支所有提交歷史記錄。
git log --all
//查看所有分支的提交歷史記錄
git log --oneline
//查看簡潔提交歷史記錄
git reflog
//查看所有分支的所有操作記錄 (包括被刪除的commit 操作記錄)后面會介紹到。
git log -n2
//查看最近2次提交的歷史記錄
git log -p -2
//最近兩次提交差異顯示
git log --pretty=oneline
//查看簡潔提交歷史記錄
3.3文件刪除和修改名稱操作
git rm 文件名稱
//從工作目錄中刪除該文件并且本地不保留。
git rm --cached 文件名稱
//從版本控制中刪除該文件,但在本地保留該文件(相當(dāng)于將文件從暫存區(qū)撤銷到工作區(qū)中)
git mv 原來名稱 新的名稱
//更改文件名并提交到本地倉庫 (暫存區(qū)和本地倉庫文件)本地倉庫需要再次執(zhí)行 **commit** 提交。
4.幫助命令
4.1Git 幫助命令介紹
git help
//展示經(jīng)常使用命令的介紹。
git help 具體操作命令
//對具體命令操作的介紹 會打開默認(rèn)游覽器進(jìn)行查看具體命令介紹。
git 具體操作命令 -h
//對具體命令操作的介紹
5.撤銷命令
5.1撤銷命令介紹
git chekout --文件名稱
//將工作區(qū)的文件撤銷到緩存區(qū)中
git reset 文件名稱 或 git reset HEAD 文件名稱
//將暫存區(qū)的代碼撤銷到工作區(qū)中。
git reset --hard 要切換 commit 的記錄id
//丟棄所有歷史記錄并將更改返回到指定的提交歷史上 (慎用)
6.Git 分支(Branch)CRUD
6.1 創(chuàng)建
git branch 分支的名稱
//創(chuàng)建新的分支
git branch 分支名稱 commitId
//在指定 commitId 基礎(chǔ)上創(chuàng)建分支
git checkout 分支的名稱
//切換分支
git checkout -b 分支的名稱
//創(chuàng)建新的分支并切換到該分支上
git checkout -b 分支名稱 commitId
//在指定 commitId 基礎(chǔ)上創(chuàng)建分支并切換到該分支
6.2 查看
git branch
//查看本地所有的分支
git branch -a
//查看本地和遠(yuǎn)程所有的分支。
6.3 修改
git branch -m 原來的名稱 新的名稱
//修改分支的名稱
git push origin 分支名稱
//將分支推送到遠(yuǎn)程倉庫中。
6.4 刪除
git branch -d 分支名稱
//刪除本地倉庫分支
git push origin --delete 分支名稱
//刪除遠(yuǎn)程倉庫分支。
7. Git 標(biāo)簽(Tag)CRUD
7.1什么是標(biāo)簽
- 將標(biāo)簽理解成里程碑。
- 對于開發(fā)完的相對比較完善的 Release 版本我們可以創(chuàng)建一個標(biāo)簽
7.2 標(biāo)簽種類的介紹
-
輕量標(biāo)簽(lightweight)
- 用于臨時的標(biāo)簽
- 輕量標(biāo)簽僅僅記錄了commit 的信息。
-
附注標(biāo)簽(annotated)
- 記錄的信息更為詳細(xì) 它包含了創(chuàng)建標(biāo)簽的作者 創(chuàng)建日期 以及標(biāo)簽信息。
- 一般建議創(chuàng)建附注標(biāo)簽。
7.3 Git 標(biāo)簽操作命令
7.3.1 創(chuàng)建
git tag 標(biāo)簽名稱
// 創(chuàng)建輕量標(biāo)簽
git tag -a 標(biāo)簽名稱 -m '標(biāo)簽注釋'
//創(chuàng)建附注標(biāo)簽
git tag -a commitId
// 指定 commitId 創(chuàng)建標(biāo)簽
7.3.2 查看
git tag 和 git tag --list | git tag --l
//查看所有的標(biāo)簽。
git tag -l 'v*.0'
//查看以 v 開頭和以 0 結(jié)尾的所有的標(biāo)簽
git show 標(biāo)簽的名稱
//查看標(biāo)簽的具體信息
git ls-remote --tags
//查看遠(yuǎn)程倉庫的標(biāo)簽列表
7.3.3 修改
git push origin 標(biāo)簽名稱
//將標(biāo)簽推送到遠(yuǎn)程倉庫中。
git push origin --tags
//提交本地所有的標(biāo)簽到遠(yuǎn)程倉庫
7.3.4 刪除
git tag -d 標(biāo)簽名稱
//刪除該標(biāo)簽
git push origin :refs/tags/標(biāo)簽名稱
//刪除遠(yuǎn)程倉庫的標(biāo)簽。
8. Git 分支合并操作
git merge 分支名稱
//一般我們都是主分支合并從分支比較多。
git rebase 分支名稱
//主要是用來將主分支合并到從分支的操作中比較常見
8.1 git rebase 和 git merge 的區(qū)別
- git merge 會生成新的 commit,git rebase 不會生成新的 commit
- git merge 是按照時間順序進(jìn)行合并,而 git rebase 是將 主分支順序不變,插入到從分支的前端。
使用場景
- git merge
一般用于新功能的開發(fā)和 bug 修復(fù);
在主分支上進(jìn)行使用 - git rebase
在從分支上進(jìn)行使用
注意事項
如果分支已經(jīng) Push 到了遠(yuǎn)程倉庫就不要對該分支進(jìn)行 git rebase 操作
如果已經(jīng)提交到了遠(yuǎn)程分支再進(jìn)行 Push 的時候容易出現(xiàn)沖突,我們可以采用 git push --force,但是最好是永遠(yuǎn)不要使用這個命令。
9. 歷史記錄對比
git diff --cached | git diff --stage
//暫存區(qū)和最新提交內(nèi)容比較
git diff --文件名
//工作區(qū)和暫存區(qū)內(nèi)容的比較。
git diff commitId1 commitId2 --文件名
// 查看不同歷史提交文件內(nèi)容的不同
git diff 分支1名稱 分支2名稱
//比較分支1 和分支2 提交文件內(nèi)容的不同。
10.Git 遠(yuǎn)程倉庫相關(guān)操作
10.1 克隆遠(yuǎn)程倉庫到本地
通過 http 鏈接克隆
git clone 遠(yuǎn)程倉庫 http 鏈接地址
通過 ssh 鏈接遠(yuǎn)程倉庫
- 1.查看是否有公鑰和私鑰
ls -al ~/.ssh
- 2.沒有則生成密鑰
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
- 3.在 Github上配置我們的公鑰內(nèi)容
- 4.git clone 克隆ssh url
10.2 遠(yuǎn)程倉庫推送、拉取操作命令
git push
//將本地分支的更新推送到遠(yuǎn)程倉庫中。
git fetch
//從遠(yuǎn)程倉庫中獲取最新的內(nèi)容 但是不會執(zhí)行合并的操作(**git merge**)
git pull
//從遠(yuǎn)程倉庫中獲取最新內(nèi)容并且合并到本地倉庫中,相當(dāng)于 **git merge** + **git fetch** 的操作
讓本地倉庫和遠(yuǎn)程倉庫建立連接
git remote add origin 遠(yuǎn)程倉庫地址
//將本地倉庫和遠(yuǎn)程倉庫進(jìn)行連接。
git push --set-upstream origin master
//就可以將我們的本地倉庫和遠(yuǎn)程倉庫建立鏈接。
11. Git 高級操作
11.1 修改最新提交的歷史記錄
git commit --amend
- 使用場景
最新提交的文件內(nèi)容寫錯了或者提交注釋信息(messge) 想修改
又不想產(chǎn)生新的的commit去修改它 - 注意事項
確保你的commit 沒有推送到遠(yuǎn)程倉庫中
11.2 修改歷史提交記錄
git rebase -i
// pick改為e
- 使用場景
發(fā)現(xiàn)以前的 commit 提交有問題,并想對其進(jìn)行修改的話 - 注意事項
該操作執(zhí)行的前提是你還沒有將你的 commit 推送到遠(yuǎn)程倉庫中
11.3 修改歷史注釋
git rebase -i
// pick改為r
11.4 合并多個 commit
git rebase -i
// 除了第一個pick,其他改為s
11.5 把暫存區(qū)的工作保存起來
git stash
- 場景
* 修改文件,要切換的別的分支去工作但是我們又不想將我們當(dāng)前分支的工作進(jìn)行提交 - 主要操作命令
git stash
//即將我們的工作內(nèi)容進(jìn)行保存
git stash list
//查看我們儲藏的列表
git stash apply
//將我們的最近儲藏取出來但是不會刪除該儲藏
git stash pop
//將我們的最近儲藏取出來并刪除該儲藏
git stash drop
//將儲藏清理掉。
git stash clear
//清除所有的儲藏
12. Git 最好不要使用的危險命令
git reset --hard
//危險之處在于如果添加的工作內(nèi)容沒有執(zhí)行 commit,執(zhí)行 git reset —hard,那么這些沒有 commit 的工作內(nèi)容有可能丟失。
git commit --amend 和 git rebase -i
//修改操作必須是在你還沒有推送遠(yuǎn)程倉庫前去執(zhí)行
//如果想將你的修改推送只能使用強(qiáng)制推送 git push -f 操作
git push -f
//這樣會強(qiáng)制將你的歷史版本覆蓋到遠(yuǎn)程倉庫。當(dāng)然別人的提交歷史也會被覆蓋掉。
13.Git 原理
做技術(shù)一定要知其然知其所以然
Git 存儲目錄結(jié)構(gòu)介紹
hooks 一般用于自動化部署使用
info 該目錄用于配置一些不希望被 Git 管控的文件
objects 該目錄用于存儲所有數(shù)據(jù)對象內(nèi)容
refs 該目錄用于存儲 Git 本地以及遠(yuǎn)程分支的引用
config 該文件包含項目特有的配置選項,并且該配置僅對該 Git 倉庫有效
description 該文件僅供 GitWeb 程序使用
HEAD 該文件表示當(dāng)前 Git 倉庫處于哪個分支 index 該文件保存暫存區(qū)信息
Git 是如何存儲的
- Git 是一個內(nèi)容尋址文件系統(tǒng)
每次我們進(jìn)行提交會通過 SHA-1 算法生成一個長度為 40 個字符的校驗和(也就是我們的 key)然后根據(jù)校驗去獲取我們文件的內(nèi)容。
這種通過唯一標(biāo)識的 key(也可以理解為內(nèi)容的地址)去獲取我們的內(nèi)容的操作就是內(nèi)容尋址。 - 核心部分是一個簡單的鍵值對數(shù)據(jù)庫
你可以向該數(shù)據(jù)庫插入任意類型的內(nèi)容,它會返回一個 40 位字符串鍵,通過該 40 位字符串鍵可以在任意時刻再次檢索(retrieve)該內(nèi)容。 - Git 的對象
blob 是具體的文件對象
tree 是某個時刻提交目錄的內(nèi)容
commit 執(zhí)行一次 commit 就會產(chǎn)生一個 commit 對象
tag 可以理解成 commit 的別名,一個 tag 對應(yīng)一個 commit - Git引用
- 什么是 Git 的引用
可以理解成一個書簽 - Git 引用的三種類型
HEAD 引用:
用來為我們的本地倉庫打上標(biāo)簽使用。
Tag 引用:
用來為我們的 Git 倉庫 tag 標(biāo)簽使用.標(biāo)簽引用不會移動它永遠(yuǎn)會指向一個 Commit 對象。
遠(yuǎn)程引用:
用來為我們的遠(yuǎn)程倉庫打標(biāo)簽使用,遠(yuǎn)程引用是只讀的
- 什么是 Git 的引用