本地**庫,其實就是我們的**目錄(本地倉庫),如果非要區別普通**目錄和git倉庫目錄,那就是基於git的**目錄裡面會多乙個.git
的目錄,這個目錄一般是不可見的。如何將乙個普通**目錄變成git工作目錄,其實很簡單。我們可以使用cmd
、git bash
或任何乙個命令列工具,進入工作目錄,然後執行下面這行**就可以了:
git init
當本地倉庫初始化好後,其實我們已經可以使用git工作了,比如將**檔案新增到版本記錄,建立本地分支,合併本地分支**等等。
如果僅僅使用git在本地搗鼓,那麼我們上面提到的遠端**託管的優勢就完全沒有意義了,所以我們要把我們的本地倉庫和遠端倉庫繫結起來,這裡就要分情況了。
如果是現在本地已經開發的乙個全新專案需要推送到遠端倉庫,你需要先這麼做:
git remote add origin
如果是在別人已經開發過的倉庫中繼續開發,我們不需要預先建立並初始化本地倉庫,直接執行下面這條命令就可以了:
當我們已經擁有乙個本地git倉庫或對我們的專案進行了修改後,我們可能迫不及待的想看看我們專案中各個檔案的當前狀態,我們只需在git bash
中執行:
git status
通常情況下,我們可能看到一堆紅色標記的列表,包括以下資訊:
changes to be committed:等待提交的更改
untracked files:未新增到版本記錄的檔案
如果是乙個全新倉庫,我們只能看到untracked files項。
當我們通過git status
看到有紅色檔案列表,而且其中有我們想要儲存到遠端倉庫中的檔案時,我們可通過git add
命令,將相應檔案新增到暫存區,我們也可以通過git add .
命令,新增所有新增或有更新的檔案,但這裡要注意刪除的檔案不會被新增。
新增刪除的檔案需要使用git add -u
或git add -u .
命令。
接下來我們還需要執行乙個命令git commit
,才能將新增的檔案(變化)提交到暫存區。這個命令的用法也有幾種,常見的是直接執行git commit -m 'log info'
,還有一種是執行git commit
開啟指定編輯器,編輯好日誌後關閉編輯器即可,一般用於日誌內容比較多的情況。
在實際開發過程中,我們需要考慮**的穩定性,未經過測試的**不能發布到線上環境。這就意味著我們如果我們一直在乙個分支上開發**是很危險的,一步留神就可能把有bug的**提交到了遠端倉庫,造成不必要的麻煩,所以一般情況下使用版本控制器,我們都會使用它的分支功能。即開發分支、主幹分支,當開發分支上的**測試穩定後,再合併到主幹分支,將主幹分支提交到遠端倉庫,這樣出錯的概率就降低了很多。
使用git bash
可以很方便的建立分支,我們只需執行git branch newbranch
即可建立乙個名為newbranch
的分支,然後我們只需執行git checkout newbranch
命令,即可將我們的工作環境切換到newbranch
分支上。
還有一種更為簡便的方法,可以直接使用checkout命令,完成建立並切換到分支:
git checkout -b newbranch
前面我們提到了,當開發分支上的**測試穩定後,我們就可以合併到主幹分支上,並提交到遠端倉庫。那麼如何合併兩個分支的**成了乙個問題。難道要對比兩個檔案的差異,一行一行的copy**?顯然git不會這麼笨,它是很智慧型的,我們只需簡單的執行一條命令即可完成**自動合併。我們設想開發分支(newbranch)將被合併到主幹分支(master)上,那麼首先我們要先將開發分支的**提交到暫存區,然後切換到主幹分支,最後執行合併操作,完整的操作流程大致如下:
git add .
git commit -m 'newbranch 上的變動內容'
git checkout master
git merge newbranch
但是,我們在合併**的時候,特別是多人開發的時候,偶爾出現衝突(兩個人同時改動了同乙個地方)也是在所難免的,這種情況,我麼恐怕就需要人肉解決下了。不過問題不大,git將檔案衝突的地方都會以特殊的形式標明的。
# 衝突示例
<<<<<<< head
aa # 當前分支上的內容
*****==
bb # 被合併分支上的內容
>>>>>>> nb
當開發分支上的**都被合併到主幹分支上,並且所有的衝突都解決好後,我們就可以將主幹分支的**推送到遠端倉庫,提供給別人使用了。這一步很簡單:
git push origin master
還記得我們執行git remote add
後面的origin
嗎?這裡和那裡是一樣的哦,而最後那個master
就是分支名稱了。如果遠端已經有該分支,便會先檢查遠端倉庫在最近一次更新之後發生過更改,如果有會提示先進行更新**,然後再提交。如果未變動過,本地**則會直接提交至遠端**倉庫。
然而,一般情況下,我們在執行git push
之前,都會先更新一次遠端倉庫中的內容:
git pull origin master
這裡我們需要注意一下,和git merge
命令一樣,pull命令是有可能導致**衝突的。而pull命令從某種意義來講實際和fetch+merge
命令一樣,這裡就不再對fetch做進一步說明了。
通常我們在開發過程中涉及的檔案比較多,修改的地方也比較多,當我們需要提交**的時候,往往想不起來我們修改了哪些內容,哪些問需被提交。這時候我們可能希望能檢視一下在前次提交**之後我們對本地倉庫所做的改動,那麼你可以這麼做:
git diff
檢視working tree和index file的差別,也可以:
檢視index file與commit的差別,還可以:
git diff head
檢視working tree和commit的差別。
diff命令的使用,大致就是這個樣子,她們之間的細節差異,可以通過網路查詢更詳細的說明,也可以在實際使用中自己去觀察,這裡就不做贅述了。
當我們的專案開發到一定階段後,也許偶爾就發現該版本的公升級存在問題,需要臨時將專案恢復到上乙個穩定版本。但是,人肉的將公升級**改回去,顯然是不現實的,更科學的解決方法是使用git的reset命令:
git reset
--hard commitid
將本地倉庫**回滾到commitid對應的版本,或者:
git reset
--hard head~number
將最近number次的提交進行回滾,number為乙個整數。那麼問題來了,當我們需要回滾到指定版本的時候,commitid從何而來?我們怎麼知道哪個commit是最近的穩定版本?
說到這裡,就該log命令出場了。我們可以使用log命令,檢視倉庫的提交歷史,以及每個提交的更改日誌,甚至更改的內容,其最基本的用法如下:
# 檢視最近兩次的提交歷史
git log
# 缺省會輸出所有的提交歷史,最近的在最上面
tag命令,是用來給我們的**庫打標籤的。聽起來可能有些不太理解,其實日常使用中,通常是用來新增版本標記。
git tag v1.0
.0
表明在這裡我們發布了1.0.0版本。這樣就可以很方便的讓我們回顧專案每個版本的樣子,歷史就是這樣用血寫成的。我們也可以通過tag命令檢視已有的標籤,只需要執行:
git tag
這樣就行了。
git已然非常強大,而且git的命令也已經非常簡潔明瞭。但是,開發者們往往希望使用工具的同時能保留自己的個性,希望能符合自己的操作習慣。比如筆者就嫌checkout命令太長了,雖然各種自動補全,但用起來還是覺得不順手,那麼有沒有什麼辦法可以再簡潔些呢?答案是肯定的。下面給大家列出筆者的縮寫配置,當然也是曾經參考了很多網上大牛們的教程的。
git config --global
alias.st status
git config --global
alias.br branch
git config --global
alias.co checkout
git config --global
alias.ci commit
配置好後再輸入git命令的時候就不用再輸入一大段了,例如我們要檢視狀態,只需:
git st
是不是很方便?這裡只列了一些最為簡單的配置,以拋磚引玉,更多更高大上的配置,就待讀者深入挖掘了。 版本控制器 Git
版本控制器 集中式 分布式 集中式 cvs svn等 缺點 必須聯網,必須推送到 伺服器 分布式 git等 不必聯網,速度快,安全性很高,每個人的電腦都有完整的版本庫 git的使用 一 安裝 linux安裝 git 檢視是否安裝 debian或ubuntu linux sudo apt get in...
git版本控制器
git是目前世界上最先進的分布式版本控制系統。將雲端專案 拉取到本地,在git bash下執行 git clone 專案位址 建立本地分支 git branch dev 建立乙個dev分支 git branch a 檢視分支資訊,上部分為本地 下部分為遠端 git push 把 提交到雲端git p...
Git版本控制器 簡介
git 讀音為 g t 是乙個開源的分布式版本控制系統,可以有效 高速地處理從很小到非常大的專案版本管理。git 是 linus torvalds 為了幫助管理 linux 核心開發而開發的乙個開放原始碼的版本控制軟體。分布式相比於集中式的最大區別在於開發者可以提交到本地,每個開發者通過轉殖 git...