前言
??參與項目的時候,因為個人只需用到stage commit push pull merge等簡單的命令,所以沒有單獨花時間對Git進(jìn)行了解學(xué)習(xí),機(jī)緣巧合,我認(rèn)為是時候去認(rèn)真的了解下Git的原理及常用命令了。
??在寫這篇文章的時候,我會顧慮是否有必要寫,因為網(wǎng)上關(guān)于git的各種教程和文章多不勝數(shù),但那畢竟不是我的輸出,所以最后決定就把它當(dāng)做是對寫作的一種練習(xí)。
版本控制的歷史
??你知道版本控制從什么時候就存在了嗎?
??CVS(Concurrent Versions System),是1986年發(fā)布的,但是在CVS之前就已經(jīng)有了用于代碼比較和打補丁的工具,即diff和patch,他們在今天仍然生命力頑強(qiáng)。
??SVN(Subversion),如果說CVS開啟了版本控制的大爆發(fā),那么SVN就是集中式版本控制的集大成者,SVN是由CollabNet公司資助,于2000年開始開發(fā)的,目的在于創(chuàng)建一個更好用的版本控制系統(tǒng)以取代CVS。SVN能實現(xiàn)輕量級拷貝,并采用授權(quán)文件的方式實現(xiàn)版本庫授權(quán),且文件修改的差異比較等命令不再需要網(wǎng)絡(luò)連接就能完成,但是從本質(zhì)上來講,SVN并沒有取得開創(chuàng)性的突破。SVN和CVS都是集中式版本控制系統(tǒng),即一個項目只用唯一的一個版本庫與之對應(yīng),所有項目成員都通過網(wǎng)絡(luò)向該服務(wù)器進(jìn)行提交修改,這樣的設(shè)計特別容易出現(xiàn)單點故障,查看日志和提交數(shù)據(jù)等操作都會出現(xiàn)延遲。
??Git的誕生是因為2005年4月,BitKeeper(一個商業(yè)版本控制系統(tǒng))軟件的所有者,出于某種原因收回對Linux社區(qū)免費使用BitKeeper的授權(quán),迫不得已,Linus選擇了自己開發(fā)一個分布式版本控制工具以代替BitKeeper,于是Git誕生了。
??Git是一個分布式版本控制系統(tǒng),分布式版本控制系統(tǒng)可以不需要集中式版本庫,每個人都工作在通過克隆建立的本地版本庫中,每個人都擁有一個完整的版本庫,查看日志、提交、創(chuàng)建里程碑和分支、合并分支、回退等所有操作都能直接在本地完成而不需要網(wǎng)絡(luò)連接。
.git目錄/版本庫
??我們都知道,執(zhí)行g(shù)it init后,工作區(qū)根目錄下會出現(xiàn)一個.git目錄,其實這個目錄是用于保存版本庫的,且僅此一處。在工作區(qū)的子目錄下沒有任何其他跟蹤文件或目錄,該設(shè)計使得所有的版本控制操作(除與其他遠(yuǎn)程版本庫之間的互操作外)都可以在本地完成。
??傳統(tǒng)的集中式版本控制系統(tǒng)的版本庫和工作區(qū)是分開的,甚至在不同的主機(jī)上,因此必須建立版本庫和工作區(qū)的對應(yīng)。
常用命令
git最常用工作流程
git add <filename> 把修改加入暫存區(qū)
git commit -m "some note" 把加入暫存區(qū)的內(nèi)容提交到本地版本庫
git push origin master 把本地版本庫的內(nèi)容推到遠(yuǎn)端版本庫在未克隆現(xiàn)有倉庫的情況下,如何把本地倉庫提交到遠(yuǎn)端倉庫
git init 創(chuàng)建新的git倉庫
git add <filename>
git commit -m "some note"
git remote add origin <server>
git push -u origin master把遠(yuǎn)端倉庫克隆到本地的目錄下
into local dictionary
git clone <server>分支的創(chuàng)建與提交
git checkout -b new_branch_name 創(chuàng)建新分支并切換過去
coding 在本地修改代碼
git add <filename>
git commit -m "some note"
git push origin new_branch_name 把分支和修改內(nèi)容提交到遠(yuǎn)端倉庫
??note:只有將該分支提交到了遠(yuǎn)端倉庫,該分支才會被其他人所見。
- 合并新分支到主分支上
git checkout master
git merge new_branch_name 將新分支合并到主分支 - 分支合并存在沖突
coding for conflicts
git add ...
git commit -m "some note"
git push origin master - 分支合并,功能測試正常后,刪除分支
git branch -d new_branch_name - 刪除遠(yuǎn)程分支,保留本地分支
git push origin :new_branch_name - 替換本地改動
git checkout -- filename 用暫存區(qū)的內(nèi)容替換工作區(qū)的內(nèi)容
git checkout HEAD filename 用HEAD所指向的master分支中的內(nèi)容替換工作區(qū)和暫存區(qū)的內(nèi)容
git reset HEAD filename 把暫存區(qū)的內(nèi)容撤銷掉放回工作區(qū)
工作區(qū)、暫存區(qū)、版本庫原理圖.png - 了解本地倉庫的歷史
git log
git log --author=username 只看某一人的提交記錄
git log --pretty=oneline 每條記錄只占一行輸出
git log --name-status 查看哪些文件改動了
git reflog 查看歷史命令,能看到每次提交的commit_id - 回退到歷史版本
git reset --hard commit_id 回到commit_id指定的版本(過去/未來的版本) - 標(biāo)簽:用來記錄開發(fā)的一些關(guān)鍵時期,如版本發(fā)布、系統(tǒng)升級等。
git tag <tagname> 打一個名為name的標(biāo)簽
git tag <tagname> commit_id 根據(jù)commit_id打標(biāo)簽
git tag -a <tagname> -m "some note" commit_id 打帶說明的標(biāo)簽
git tag 查看所有標(biāo)簽
git tag -d <tagname> 刪除標(biāo)簽 - 暫存狀態(tài)
git stash 把當(dāng)前工作現(xiàn)場“儲藏”起來,等以后恢復(fù)現(xiàn)場后繼續(xù)工作
git stash list 回到暫存工作現(xiàn)場的分支后,查看工作現(xiàn)場
git stash pop 恢復(fù)工作現(xiàn)場并刪除stash
git stash apply 恢復(fù)工作現(xiàn)場,不刪除stash
git stash drop 刪除stash
