git命令使用

什麼是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倉庫
  1. 創建存放git的文檔目錄(新建一個文件夾)mkdir mycode
  2. 進入這個文件夾的目錄 cd mycode
  3. 在這個文件夾下執行git init 命令,創建一個倉庫
  4. 告訴git ,我們要跟蹤哪些文件的修改,默認git只能跟蹤文本類的文件修改,不包括圖片、視頻等。Git add * 或者具體的某個文件git add 文件名
  5. 把我們的文件正式提交到倉庫中去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

撤銷你的修改

我們有時候會希望撤銷我們的更改,這時一般可以分爲三種情況:

  1. 當你只是在源文件中修改了,而並沒有add到暫存區的情況;
  2. 當你不僅在源文件中修改了,並且還add了到了暫存區,索性的是你並沒有commit 的時候;
  3. 當你已經commit提交到倉庫的時候。

下面,分別嘗試着解決這三種情況

  1. git checkout -- 修改的文件名

感覺更像把暫存區退回到了工作區

  1. git reset HEAD readme.txt (文件名) 把暫存區的修改回退到工作區,也就是退回add之前的狀態,最後再次git checkout readme.txt結束;

感覺更像是從倉庫一路退回到了暫存區,然後又退回到了工作區

  1. 如果你已經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,如果遠程的masterdev一樣,沒關係;如果不一致,則需要clonedev分支 git checkout -b dev origin/dev 之後每個人在本地的dev分支上獨自開發(最好不要在master上開發), 開發完成之後push到遠程dev git push origin dev。 之後審覈人再確定是否合併devmaster

在進行任何的push 操作之前,一定要先 pull 一下遠程的分支代碼,畢竟這個分支代碼是被很多人修改的,你只有最新的版本才能和自己的修改合併才行。

結語

到此,關於git的日常基本操作就基本完成了,更多的git語法請移步git官網

感謝李致遠老師(https://github.com/aylizhiyuan)提供學習資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章