一、Git概述
版本管理的演變
1)集中式的版本管理(SVN)
- 有集中的版本管理服務器
- 具備文件版本管理和分支管理能力
- 集成效率有明顯地提高
- 客戶端必須時刻和服務器相連
2)分布式的版本管理(Git)
- 服務端和客戶端都有完整的版本庫
- 脫離服務端、客戶端照樣可以管理版本
- 查看歷史和版本比較等多數操作,都不需要訪問服務器,比集中式VCS更能提高版本管理效率

3)GIt的優(yōu)點
- 最優(yōu)的存儲能力
- 非凡的性能
- 開源的
- 容易做備份
- 支持離線操作
- 很容易定制工作流程
二、安裝Git
1、Git官方文檔地址:
https://git-scm.com/book/zh/v2
2、macOS 平臺 Git 下載地址:
https://git-scm.com/download/mac
3、Windows 平臺 Git 下載地址:
https://git-scm.com/download/win
4、Linux 平臺 Git 下載地址:
https://git-scm.com/download/linux
5、檢查安裝結果
$ git --version ## 通過執(zhí)行該命令,看git是否返回版本信息
三、使用Git之前的最小配置
- 配置user.name和user.email
$ git config --global user.name 'your_name'
$ git config --global user.email 'your_email@domain.com'
- git config命令的三個作用域
缺省等同于local
$ git config --local ## local只對某個倉庫有效
$ git config --global ## global對當前用戶所有倉庫有效
$ git config --system ## system對系統所有登錄的用戶有效
- 查看config配置,加--list
$ git config --list #會輸出global、local、system所有的配置信息
$ git config --list --global #僅輸出global的配置信息
$ git config --list --system #僅輸出system的配置信息
$ git config --list --local ##僅輸出local的配置信息
- 清除config配置,加--unset
$ git config --unset --global user.name
$ git config --unset --system user.name
$ git config --unset --local user.name
四、創(chuàng)建第一個倉庫,并創(chuàng)建local用戶
- 創(chuàng)建Git倉庫
兩種場景
- 把已有的項目代碼納入git管理
$ cd 項目所在文件夾
$ git init
- 新建的項目,直接使用git進行管理
$ cd 某個文件夾
$ git init your_project
$ cd your project


- 向Git倉庫中添加文件
$ git add file_name ## file_name表示你的文件的名字
$ git add file_name1 file_name2 file_name3 ## 添加多個文件
$ git add -u ## 保存修改和刪除,但是不包括新建文件。
$ git add . ## 保存新的添加和修改,但是不包括刪除
$ git add -A ## 保存所有的修改
五、通過幾次commit來認識工作區(qū)和暫存區(qū)、版本歷史


通過git log命令來查看版本歷史

六、給文件重命名的簡便方法
- 麻煩的方式
$ mv old_file_name new_file_name ## 第一步,修改文件名
$ git add new_file_name ## 第二步,將修改后的文件,添加到Git中
$ git rm old_file_name ## 第三步,移除掉舊的文件
- 簡單的方式
$ git mv old_file_name new_file_name ## 通過git mv命令,直接將文
件名修改
七、通過git log查看版本演變歷史
-
查看git log列表
image.png -
指定查看幾個版本的歷史
指定查看最近兩個版本的歷史記錄
指定查看最近三個版本的歷史記錄,并以列表的形式顯示
3、查看本地的分支信息

4、新建一個臨時分支,并稍作修改

查看所有分支歷史版本信息

總結
查看詳細日志
$ git log
$ git log --graph ## 圖形化顯示
$ git log branch_name ## 查看branch_name分支的日志
查看簡潔日志
$ git log --oneline
$ git log --oneline branch_name ## 查看branch_name分支的日志
$ git log --oneline --all
$ git log --oneline --graph
查看最近幾次的日志
$ git log -n4 ## n4表示查看最近4次的日志
$ git log --oneline -n4
查看git 的命令api文檔
$ git help --web log
八、gitk:通過圖形界面工具來查看git歷史
gitk命令

九、探秘.git文件夾

、
-
HEAD文件
該文件內容為當前的分支信息,切換分支的時候,該文件信息會隨之改變,如下圖所示
HEAD文件 -
config文件
存放了本地倉庫的配置信息
config文件 -
refs
refs文件中存放了,所有分支和tag(里程碑)信息(40位的hash值),對應的是分支最新的一個commit哈希
refs文件夾 -
objects
objects文件夾下都是一些兩位數的文件夾,里面存放一個40位hash文件,類型為tree,這個tree文件中又存放了一個blob對象,通cat-file命令查看,發(fā)現這個blob就是git管理的文件對象,如圖所示是一個css文件。
objects文件夾
十、commit、tree、blob三者之間的關系
commit就相當于當前倉庫的一個快照,而一個commit也對應一棵tree(目錄對應tree,文件對應blob)
tree就相當于文件夾

通過命令行來證明上面的圖

十一、數一下tree的個數

答案:有兩棵樹(commit對應的一棵樹,文件夾doc對應的一顆樹),一個commit,一個blob

十二、分離頭指針情況下的注意事項
分離頭指針指的是,HEAD當前沒有指向任何一個分支,而是某一個歷史commit上。
1、分離頭指針狀態(tài)下,開發(fā)的代碼,需要關聯到分支,如果不關聯到分支,在分離頭指針狀態(tài)下,切換到分支上時,分離頭指針狀態(tài)下開發(fā)的代碼,將會被git清除


十三、進一步理解HEAD和branch
# 基于新分支創(chuàng)建一個老的分支,此時git會自動切換到新建的分支上
$ git checkout -b newbranch oldbranch
# git diff命令可以這樣比較兩個commit(快照)的之間的差異
$ git diff d3af93fba4f0a 990c6561e69fee
# 使用git diff命令比較版本,也可以使用HEAD來指代當前版本與之前n個版本之間的區(qū)別
$ git diff HEAD HEAD~n
十四、刪除無用的分支
git branch -d 分子名稱
當-d無法刪除,并且確認分支無用的情況下,使用-D進行強制刪除

十五、怎樣修改最新commit的message

十六、怎樣修改老舊commit的message
!怎樣修改老舊commit的message](https://upload-images.jianshu.io/upload_images/4038260-6ec0f55a8ef04bcd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
想要修改modify index and style這個commit message,則需要使用rebase變基操作,這里要用到這個commit的父親commit,此時會彈出一個交互窗口,使用r命令來修改message

修改保存退出,又會彈出一個交互窗口,在這個交互窗口中修改commit messge,保存退出


十七、怎樣將連續(xù)的commit合并成為一個
git rebase -i 父親commit的hash
在交互窗口中,將要合并的commit 使用squash(壓縮命令進行合并),保存退出

輸入合并的message保存退出

十八、怎樣將間隔的commit合并成為一個

在交互窗口中將要合并的兩個commit放到一起,使用s命令進行合并,保存退出
此時會有消息提示
git status查看狀態(tài)
git rebase continue命令輸入合并后的commit messge后,再保存退出

十九、怎么比較暫存區(qū)和HEAD所含文件的差異
git diff --cached-------比較暫存區(qū)和HEAD的差別
git diff --cached
二十、怎么比較工作區(qū)和暫存區(qū)的差異
git diff 比較工作區(qū)暫存區(qū)所有的文件差異

git diff -- filepath(可以指定多個文件)
git diff -- filepath
二十一、如何讓暫存區(qū)恢復成HEAD的版本
git reset HEAD--------取消暫存區(qū)的修改,恢復到HEAD版本
git reset HEAD
二十二、如何讓工作區(qū)恢復成暫存區(qū)的版本

修改暫存區(qū)使用git checkout命令,修改暫存區(qū)則使用git reset命令

二十三、怎么取消暫存區(qū)部分文件的修改
取消暫存區(qū)中index.html的修改

二十四、消除最近的幾次提交

二十五、看看不同commit的指定文件的差異

二十六、正確刪除文件看的方法

二十七、開發(fā)中緊急加塞了緊急任務怎么處理
正常開發(fā)需求,修改了index.html和js文件

此時臨時加塞了一個需求,比如項目bug修改,這個時候就需要把上面需求開發(fā)的代碼暫存起來,用到命令git stash

可以看到之前兩個文件的修改都被暫存到stash中了,然后我們就能開發(fā)我們的新需求

新需求開發(fā)完畢,提交版本庫后,我們回過頭來取出stash中暫存的兩個文件修改

發(fā)現我們之前開發(fā)的代碼被恢復了回來
二十八、如何指定不需要git管理的文件
通過添加名為.gitignore的文件,來指定
二十九、如何將git倉庫備份到本地




新建一個文件夾git-backup,克隆遠程倉庫,可以看到遠程倉庫有兩個分支master,temp
然后再遠程倉庫git_learning中添加備份倉庫地址,新建一個pyy的分支,并push到備份倉庫

然后查看備份倉庫中的分支信息,發(fā)現也更新了pyy的分支










