什麼是git
Git是一個開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目。
Git 與常用的版本控制工具 CVS, Subversion 等不同,它採用了分佈式版本庫的方式,不必服務器端軟件支持。
GIT的使用
msysgit是Windows版的Git,從http://msysgit.github.io/下載,然後按默認選項安裝即可。
安裝完成後,在開始菜單裏找到“Git”->“Git Bash”,蹦出一個類似命令行窗口的東西,就說明Git安裝成功
安裝完成後,還需要最後一步設置,在命令行輸入:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
因爲Git是分佈式版本控制系統,所以,每個機器都必須自報家門:你的名字和Email地址。你也許會擔心,如果有人故意冒充別人怎麼辦?這個不必擔心,首先我們相信大家都是善良無知的羣衆,其次,真的有冒充的也是有辦法可查的。
注意git config命令的--global參數,用了這個參數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址。
瞭解基本命令
git clone
從遠端拉取倉庫
git init
初始化一個倉庫
git add
添加到緩存區
git commit -m 修改
添加到倉庫
git diff
查看修改的具體內容
git reset --hard 版本號
跳轉到指定版本號
git log
查看所有的修改的版本號
git status
查看文件狀態
您不必現在就瞭解這些命令的使用,後文會初步解釋每個命令的使用。
理解概念:工作區,暫存區,倉庫
add
的操作是把所有的更改暫時放在暫存區,commit
操作就是真正的提交我們的代碼
如果你試圖修改,繞過了
add
部分的話,你提交的代碼是無法真正進入倉庫的,這是因爲commit
的是暫存區內的內容,而你必須將你所做的修改add
到暫存區才能commit
成功。
創建GIT倉庫
- 創建存放git的文檔目錄(新建一個文件夾)mkdir mycode
- 進入這個文件夾的目錄 cd mycode
- 在這個文件夾下執行git init 命令,創建一個倉庫
- 告訴git ,我們要跟蹤哪些文件的修改,默認git只能跟蹤文本類的文件修改,不包括圖片、視頻等。
Git add *
或者具體的某個文件git add 文件名
- 把我們的文件正式提交到倉庫中去
git commit -m 備註的信息
,最好備註下;
查看狀態
git status
查看我們跟蹤文件的狀態,時刻掌握我們的倉庫狀態
git diff
查看具體哪兒被修改了,新增的內容又是哪些
如果我們修改了我們的文件,那麼我們就需要繼續的add commit 提交最新的修改。
注意:git commit -a
合併了add
commit
兩個操作,只不過它只適用於舊文件的修改,新文件依然要添加add
commit
;
如果出現被鎖的情況,只需要刪除.git 下面的index.lock 文件即可 rm .git/index.lock 具體原因不明
Git commit -a 後會出現 vim編輯器,這個編輯器的簡單使用掌握下就OK了
要隨時掌握工作區的狀態,使用git status
命令。
如果git status
告訴你有文件被修改過,用git diff
可以查看修改內容。
查看我們的記錄log
我們不停的修改,提交,修改,提交!
在git
中,用HEAD
表示當前版本,也就是最新的提交3628164...882e1e0
(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^
,上上一個版本就是HEAD^^
,當然往上100個版本寫100個^
比較容易數不過來,所以寫成HEAD~100
。
對的,我們所有的修改提交都有記錄在這裏,並且可以通過命令來還原原來的版本
git log
查看當前的操作記錄
git reset --hard 版本編號ID
或者是HEAD ^
回到上一個版本中去
當你從新版本回到老版本的時候,我們的新版本自然就消失了,所以,如果你想回復到新版本的狀態,你可以使用git reflog
查看下你每次的操作命令,並記錄下版本ID編號,再次使用 git reset --hard 版本編號ID
回到新版本中去。
現在總結一下:
HEAD
指向的版本就是當前版本,因此,git
允許我們在版本的歷史之間穿梭,使用命令git reset --hard commit_id
。
穿梭前,用git log
可以查看提交歷史,以便確定要回退到哪個版本。
要重返未來,用git reflog
查看命令歷史,以便確定要回到未來的哪個版本。
也就是說:
現在有3個版本
版本號:333
版本號:222
版本號:111
我現在用git reset —hard 222 退回到222版本,
git log 後 就看不到333版本了
必須要用git relog才能看到222之前的333版本號
然後在通過git reset —hard 333 恢復到333
撤銷你的修改
我們有時候會希望撤銷我們的更改,這時一般可以分爲三種情況:
- 當你只是在源文件中修改了,而並沒有
add
到暫存區的情況; - 當你不僅在源文件中修改了,並且還
add
了到了暫存區,索性的是你並沒有commit
的時候; - 當你已經
commit
提交到倉庫的時候。
下面,分別嘗試着解決這三種情況
-
git checkout -- 修改的文件名
;
感覺更像把暫存區退回到了工作區
-
git reset HEAD readme.txt (文件名)
把暫存區的修改回退到工作區,也就是退回add
之前的狀態,最後再次git checkout readme.txt
結束;
感覺更像是從倉庫一路退回到了暫存區,然後又退回到了工作區
- 如果你已經
commit
了,就直接用版本回溯到之前的版本就OK了(git reset —hard 版本號
)。
感覺reset命令就是爲了在不同的倉庫版本中切換
刪除文件
儘量用git rm 文件名刪除
(暫存區中刪除),然後git commit
提交到版本庫。
如果誤刪的情況下,也就是說你只是在工作區誤刪了文件的話,可以用git checkout -- 文件名
恢復(從暫存區恢復)
小結
第一步 : 在需要git
管理的文件夾下打開git base here
;
第二步:在git
中進行項目管理的初始化 git init
;
第三步:在git
中創建自己的項目文件;
第四步:通過git add *
將所有的項目文件添加進去臨時區域內;
第五步:通過git commit -m 操作說明
將臨時區域內的項目推送到本地的倉庫上去;
第六步:對項目進行修改之後,可以先看看修改了哪些東西,使用git diff
;
第七步:確認完修改之後,可以通過git commit -a -m 操作說明 來進行上傳了;
第八步:如果需要切換版本,只需要通過git reflog
查看下自己的操作歷史,然後通過git reset --hard 版本號
就可以自由的切換不同的狀態了。
第九步: 如需刪除文件,使用git rm 文件名
來進行刪除,然後通過git commit -a -m
提交
第十步:如果發生在本地誤刪的情況,可以直接使用git checkout
把臨時區域的內容拉到本地
以上的知識只是個人在用的時候本地代碼的一個管理而已,並不涉及遠程多人共同協作,如果你只是在本地管理代碼的話,上面的命令足夠你使用了,因爲畢竟你知道了如何讓自己的代碼庫添加、刪除、和回溯。代碼的每一次修改也都會做記錄,你可以隨時恢復最新的版本和退回老的版本,並且比較每次代碼的不同之處,找到原因。
連接遠程倉庫
$ ssh-keygen -t rsa -C "[email protected]"
創建自己的ssh
密鑰,用於跟遠程的服務器進行通信,它畢竟得知道這個是你親自推送的代碼才行。
要關聯一個遠程庫,使用命令
git remote add origin git@server-name:path/repo-name.git
將我們本地的倉庫與遠程的github 上的倉庫連接起來
下一步,我們開始推送我們本地倉庫上的內容
把本地庫的內容推送到遠程,用git push
命令,實際上是把當前分支master
推送到遠程。
由於遠程庫是空的,我們第一次推送master
分支時,加上了-u
參數,git
不但會把本地的master
分支內容推送的遠程新的master
分支,還會把本地的master
分支和遠程的master
分支關聯起來,在以後的推送或者拉取時就可以簡化命令。
推送成功後,可以立刻在GitHub
頁面中看到遠程庫的內容已經和本地一模一樣:
git push -u origin master
此後,每次本地提交後,只要有必要,就可以使用命令git push origin master
推送最新修改;
上面是從本地上傳到遠程庫上去
如果想要從遠程庫中克隆一份,那麼就使用git clone git 地址
就可以了
要克隆一個倉庫,首先必須知道倉庫的地址,然後使用git clone
命令克隆。
git
支持多種協議,包括https
,但通過ssh
支持的原生git
協議速度最快。
說白了,克隆和推送都是爲了創建本地和遠程的一個連接,只要第一步連接好了,我們就可以進行下一步的操作了;
分支管理
我們可以使用git
的分支管理功能,把項目分爲開發版本、測試版本、生產版本,方便我們在工作中對代碼進行管理。
git
鼓勵大量使用分支:
查看分支:git branch
創建分支:git branch <name>
切換分支:git checkout <name>
創建+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>
結合版本回溯,master
是主分支,各個分支點都是歷史版本,目前指向最新的版本上
創建一個新的分支,叫做dev
目前我們的操作是在dev
分支上的,自然,我們現在就指向了dev
,它跟master
沒什麼關係了。
將dev
分支合併到主分支上去,分支其實就是爲了在不影響主代碼的情況下進行代碼修改,根據實際情況跟最後的版本進行合併。
這裏,我們要考慮一種情況,就是如果我在分支dev
中修改了內容,同時,我又在主分支master
中修改了內容,那麼它們合併的時候一定會出現問題!!!
這裏,不去考慮複雜的合併分支情況,一般我們開發的話,都會在分支上進行開發,確定沒問題之後,合併到主分支中去。
實際情況的考慮
遠程分支和本地分支
兩條分支最好是一一對應的, master
分支和dev
分支在本地和遠程都有兩條;
創建分支確實挺容易的,也不復雜,這裏就不考慮創建分支的成本性了。你可以理解爲創建分支就是又創建一個工作區-暫存區-倉庫這樣的倉庫2,現在你就擁有了倉庫1
,倉庫2
了。
目前感覺分支的操作都是在本地操作的,也就是針對本地分支的合併啊,在本地合併之後,再往同名的遠程分支中push
,那遠程分支怎麼完成合並呢?
一般我們
git clone
下網站源碼的時候,默認情況下是主分支是有的,但其餘的分支是沒有的,這時候我們就需要在本地創建新的分支,這些分支對應着遠程中的分支,然後將分支中的代碼pull
到本地去,比如遠程的dev
分支要這麼操作:
git clone SSH地址 //克隆整個項目(默認得到的就是主分支,其他分支並沒有)
git checkout -b dev //在本地創建分支
git pull origin dev //從遠程的DEV分支拉到本地的dev分支
git add ...
git commit ...
git push origin dev //修改完畢後傳遞到遠程的dev分支上去
假設遠程公共倉庫,有一個master
和一個dev
分支,進行多人協作開發時候(每個人的公鑰必須加入到遠程賬號下,否則無法push
), 每個人都應該clone
一份到本地。 但是clone
的只是master
,如果遠程的master
和dev
一樣,沒關係;如果不一致,則需要clone
出dev
分支 git checkout -b dev origin/dev
之後每個人在本地的dev
分支上獨自開發(最好不要在master
上開發), 開發完成之後push
到遠程dev git push origin dev
。 之後審覈人再確定是否合併dev
到master
。
在進行任何的
push
操作之前,一定要先pull
一下遠程的分支代碼,畢竟這個分支代碼是被很多人修改的,你只有最新的版本才能和自己的修改合併才行。
結語
到此,關於git
的日常基本操作就基本完成了,更多的git
語法請移步git官網。
感謝李致遠老師(https://github.com/aylizhiyuan)提供學習資料