1.Git與SVN的差異
SVN是集中式版本控制系統
只有中央服務器上有版本控制數據庫,其他電腦需要從服務器上CheckOut,做操作的時候需要和中央服務器做交互
Git是分佈式版本控制系統
每臺電腦上本地都有一個版本的Database,速度快,不需要網絡交互,也有一臺中央服務器,僅僅用於其他成員之間的協作
SVN存儲的是與上一個版本之間的差異,我們檢出每一版本代碼的時候,都需要疊加這些差異
Git版本存儲的是當前版本的所有內容,不需要和其他版本進行差異比較之後,進行文件合成,這體現了Git的效率
2.Git的安裝及配置
下載相應操作系統的Git版本進行安裝
配置Git自動完成 https://github.com/git/git
配置Git基本配置,用於顯示這個文件修改之後,提交的作者信息誰
Git配置三個級別及級別排序
git config --system(當前系統)<git config --global(當前用戶)<git config --local(當前倉庫)
Git文檔的查看方式
git config --help/git help config/man git -config
3.Git的基本工作流程
Git用40個16進制字符的Hash唯一標識一個對象
Git四種對象
blob(文本文件、二進制文件、鏈接文件)
tree(目錄)
commit(歷史提交)
tag(指向一個固定的歷史提交)
tag指向commit指向tree對象,而tree又包含其他tree對象和blob對象
commit指向的樹形結構,就代表提交時候工作區的某個狀態,
對這些對象的內容,進行SHA-1 Hash之後,可以得到他們的唯一標識,
Git只關心文件的內容,如果有兩個文件有相同的內容,會指向同一個blob對象,像文件名其他信息會存儲在tree對象中
存儲Git對象的倉庫
獲取倉庫的辦法
git init/git clone
倉庫的種類
裸倉庫:(不帶工作區)bare/no-bare
git三個區域
working directory(工作區,日常編輯代碼的地方,維護一個樹形結構)
staging area(暫存區,存儲一個狀態,存儲的代提交的內容)
history repository(歷史倉庫,是commit指向的一個結構)
working directory state files staging area commit history repository
history repository check out project working directory
Git命令
git add
git commit
git status
git rm(從暫存區刪除命令)
git mv(工作區重命名或移動文件,再添加到暫存區)
gitignore(忽略一個工作區的內容,不希望添加到暫存區和歷史區)
4.Git暫存區
維護了一個虛擬的樹結構,代表了下一次需要提交的內容的整體
git add(working directory->staging area .git目錄生成響應的index,每條索引有一個40位的16進制SHA-1 Hash以及對應的文件名,狀態,時間戳)
git commit(staging area->git對象庫,生成一個commit對象指向頂層對象,master分支指向commit對象)
git rm(刪除工作區和暫存區的文件)
git cache rm(只刪除暫存區的文件)
git rm(工作區文件重命名,索引區,刪除原來的索引,新增一個,文件內容不變,指向同一個對象,
暫存區索引每次更新的時候,暫存區都會重新計算所需要生成的tree對象,等到提交的時候,可以重新生成這些tree對象,提升git的效率)
5.Git本地分支與合併
不同的分支之間,做獨立的各自的工作,無縫的來回進行切換
使用stash保存分支中的內容,切換回來的時候,還原回工作區和暫存區
合併
fast-farword merge test是master的衍生分支,master回直接指向test的分支
non-fast-farword merge test和master,會合併成一個共有的分支
6.查看與對比歷史記錄
git show 查看git 對象
git log 查看git歷史
git diff 查看歷史差異
7.插銷修改
git checkout 還原工作區,用暫存區的內容覆蓋工作區的內容
git reset 還原暫存區,從歷史提交裏面還原暫存區
git clean 清除還沒有添加到暫存區的文件
git revert 產生一個新的提交覆蓋之前的提交,產生修改,還原工作區裏面的內容
8.重寫歷史記錄
git commit --amend 產生一個新的提交,用來替換掉當前所指向的提交
git rebase
git reset
git reflog