),當然git也是非常深入的,不過對於我而言,我覺著我已經夠用了。
git是分布式版本控制系統( distributed version control system,簡稱 dvcs ),這裡客戶端並不只提取最新版本的檔案快照,而是把**倉庫完整地映象下來。這麼一來,任何一處協同工作用的伺服器發生故障,事後都可以用任何乙個映象出來的本地倉庫恢復。因為每一次的提取操作,實際上都是一次對**倉庫的完整備份。而且相對於之前的svc系統,git不需要聯網就可以在自己的本地工作區里進行編輯。更棒的是,git還有提供分支的功能,你可以在master分支之外建立許多其它的分支,比如:feature分支、bug分支等,最後再將最後的分支合併為master分支,這樣很有利於協作者之間相互之間利用各自的分支來敲寫自己的**,最後將進行合併。可以說以上這兩個優點是git成功的主要原因。
在檔案儲存到git之前,所有資料都要進行內容的校驗和(checksum)計算,並將此結果作為資料的唯一標識和索引。即不可能在你修改了檔案或目錄之後,git一無所知。這項特性作為git的設計哲學,建在整體架構的最底層。所以如果檔案在傳輸時變得不完整,或者磁碟損壞導致檔案資料缺失,git都能立即察覺。
git使用sha-1演算法計算資料的校驗和,通過對檔案的內容或目錄的結構計算出乙個 sha-1 雜湊值,作為指紋字串。該字串由 40 個十六進製制字元(0-9 及 a-f)組成,看起來就像是:24b9da6552252987aa493b52f8696cd6d3b00373。git的工作完全依賴於這類指紋字串,所以你會經常看到這樣的雜湊值。實際上,所有儲存在git資料庫中的東西都是用此雜湊值來作索引的,而不是靠檔名。
這裡申明一下:所有的版本控制系統,其實只能跟蹤文字檔案的改動,比如txt檔案,網頁,所有的程式**等等,git也不例外。notepad++
代替記事本(因為記事本裡面會在每個檔案前面加了乙個十六進製制的字元),不但功能強大,而且免費!記得把
notepad++
的預設編碼設定為
utf-8 without bom
即可。初始化乙個
git倉庫,使用git init
命令。
新增檔案到
git倉庫,分兩步:
第一步,使用命令git add
,注意,可反覆多次使用,新增多個檔案;
第二步,使用命令git commit
,完成。
隨時掌握工作區的狀態,使用git status
命令。如果git status
告訴你有檔案被修改過,可以利用git diff
可以檢視修改內容。
head指向的版本就是當前版本,因此,
git允許我們在新舊版本之間穿梭,使用命令git reset --hard commit_id
。
穿梭前,用git log
可以檢視提交歷史,以便確定要回退到哪個版本。
要回到現在,則用git reflog
檢視命令歷史,以便確定要回到哪個版本。
下面一幅圖告訴你git的三個狀態:工作區、版本庫(裡面有暫存區):
每次修改,如果不add
到暫存區,那就不會加入到commit
中。
情形1:當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令git checkout -- file
。情形2
:當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset head file
,就回到了場景
1,第二步按場景
1操作。情形3
,不過前提是沒有推送到遠端庫(github)。
要關聯乙個遠端庫,使用命令git remote add origin git@server-name:path/repo-name.git
;
關聯後,使用命令git push -u origin master
第一次推送
master
分支的所有內容;
此後,每次本地提交後,只要有必要,就可以使用命令git push origin master
推送最新修改;
當然要從遠端庫轉殖乙個倉庫,首先必須知道倉庫的位址,然後使用git clone
命令轉殖。其中
git支援多種協議,包括https
,但通過ssh
支援的原生git
協議速度比較快。
git鼓勵大量使用分支:
當git
無法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。
用git log --graph
命令可以看到分支合併圖。
git分支十分強大,在團隊開發中應該充分應用。
合併分支時,加上--no-ff
引數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward
合併就看不出來曾經做過合併。
修復bug
時,我們會通過建立新的
bug分支進行修復,然後合併,最後刪除;
當手頭工作沒有完成時,先把工作現場git stash
一下,然後去修復
bug,修復後,再git stash pop
,回到工作現場。
開發乙個新
feature
,最好新建乙個分支;
如果要丟棄乙個沒有被合併過的分支,可以通過git branch -d
強行刪除。
檢視遠端庫資訊,使用git remote -v
;
本地新建的分支如果不推送到遠端,對其他人就是不可見的;
從本地推送分支,使用git push origin branch-name
,如果推送失敗,先用git pull
抓取遠端的新提交;
在本地建立和遠端分支對應的分支,使用git checkout -b branch-name origin/branch-name
,本地和遠端分支的名稱最好一致;
建立本地分支和遠端分支的關聯,使用git branch --set-upstream branch-name origin/branch-name
;
命令git tag
用於新建乙個標籤,預設為head
,也可以指定乙個
commit id
;git tag -a -m"blablabla..."
可以指定標籤資訊;
git tag -s -m"blablabla..."
可以用
pgp簽名標籤;
git tag
可以檢視所有標籤。
git push origin
可以推送乙個本地標籤;
git push origin --tags
可以推送全部未推送過的本地標籤;
git tag -d
可以刪除乙個本地標籤;
git push origin :refs/tags/可以刪除乙個遠端標籤。
7、自定義github
在github
上,可以任意
fork
開源倉庫;
自己擁有
fork
後的倉庫的讀寫許可權;
可以推送
pullrequest
給官方倉庫來貢獻**。
忽略某些檔案時,需要編寫.gitignore
;.gitignore
檔案本身要放到版本庫里,並且可以對.gitignore
做版本管理。
這裡介紹乙個小技巧,可以簡寫命令,如很多人都用co
表示checkout
,ci
表示commit
,br
表示branch
:
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
以後提交就可以簡寫成:
git ci -m "worte a file..."
以上是對git的基本理解,如果在以後的研究中還需要繼續加強的git的學習的話,將在進一步的深究,目前僅僅理解了git是什麼,以及它的工作原理和基本操作。 Git版本控制理解(一)
一 集中式版本控制系統與分布式的區別 集中式 版本庫集中存放在 伺服器 即存放版本庫的伺服器 必須先從 伺服器取得最新版本的,處理完後再推送到 伺服器 如svn 缺點是必須聯網。分布式 沒有所謂的 伺服器 每乙個人的電腦就是乙個完整的版本庫,因此工作的時候不需要聯網。協作的時候只需要把各自的修改推送...
Git 分支的理解
幾乎每一種版本控制系統都以某種形式支援分支。使用分支意味著你可以從開發主線上分離開來,然後在不影響主線的同時繼續工作。在很多版本控制系統中,這是個昂貴的過程,常常需要建立乙個源 目錄的完整副本,對大型專案來說會花費很長時間。git 的分支可謂是難以置信的輕量級,它的新建操作幾乎可以在瞬間完成,並且在...
git 的個人理解
所有內容均為自己理解的,可能會有些錯誤或偏差,歡迎指正 分布式的版本控制系統,即每個人本地都是乙個完整的版本庫。git主要是對檔案的修改進行跟蹤記錄,通過提交 commit 將這些修改 打包 放入本地倉庫。git中的大部分的指令都是圍繞這幾個概念展開的,只要明白這些基本概念才能理解其他命令都是這做了...