【簡明教程】Git

為什么選擇GIT?

Git自從2005年問世以來,已經逐步成為本地和分布環境下版本控制的事實標準。Git最早由Linus Torvalds開發用來替代 BitKeeper,后者之前一直是全球Linux 內核開發人員使用的主要代碼管理工具 。Git與其他版本控制工具相比,具有更靈活的許可證和更多社會化協作特性,因此很快受到開發人員的喜愛,并在開源社區中得到廣泛使用。

Git能夠在所有常見的操作系統中使用,并且能夠支持非常多樣化的應用場景,小到跟蹤修改,存放文件,分享工作,大到支持包含眾多用戶參與的復雜協作項目。因此,Git在諸如藝術設計、工程建筑、教育教學等諸多領域都被越來越多地應用。

分布式版本控制

使得Git與其他傳統版本控制工具如此不同的是它的本地工作頻繁提交隨時發布的創新特性。它不需要與服務器連接,所有的修改歷史都保存在用戶的本地機器上,因此你可以隨時隨地進行開發,只在需要時才將修改后的工作成果(代碼)快速進行提交。Git扮演了分布式版本控制系統(Distributed Version Control System - DVCS)的角色。


開始使用GIT

安裝Git

Git非常小巧,對于大部分操作系統,你只需要將它的二進制版本拷貝到系統中,并將所在目錄添加到系統環境變量 $PATH 中就可以了。Git主要是使用C來編寫的,也就是說,對于每個操作系統,它都有一個不同的二進制版本或安裝程序,你需要根據你的系統進行選擇。

使用下面的命令,可以檢查你當前正在使用的Git版本。

git --version

可以通過下面的鏈接地址,獲取Git的官方安裝包
http://git-scm.com/download

創建用戶標識

一旦你在自己的操作系統上安裝完Git之后,你需要告訴Git你的用戶名和電子郵件地址,從而創建自己的用戶標識。你的所有代碼提交都會與你的用戶標識關聯,這一點非常重要。

git config --global user.name “Ji jiang”
git config --global user.email “jijiang@techmask.net” 
git config --global color.ui “auto” 

上面的代碼會將你的個人標識和系統偏好設置寫入你的home目錄下的.gitconfig文件中(在UNIX和Mac上為\\~,而在Windows中則是%USERPROFILE%對應的目錄)

Git不會為代碼庫自動設置安全策略,你可以通過選擇不同的安全協議(SSH或HTTPS)或者操作系統中的文件系統權限設置來支持代碼倉庫的用戶驗證和授權。


GITHUB

GitHub.com利用了Git的標準DVCS特性,并提供了一個將其社會化特性最大化的解決方案。

GitHub.com 使存儲Git倉庫和共享代碼變得非常容易。一旦你將代碼倉庫提交到了GitHub,那么后續的代碼倉庫共享,代碼審查,以及向開源項目貢獻代碼這些流程都將比之前任何時候都要簡單許多。

GitHub通過提供免費的賬號來支持開源,免費賬號可以創建公共代碼庫,這些代碼庫對于所有人都是可見的。當然你也可以花一些費用來購買私有賬號,基于費用的不同,你可以創建不同數量或規模的私有倉庫。公共和私有賬號都可以通過https://github.com/signup 來創建。


創建倉庫

一個Git倉庫可以被創建在不需要任何網絡連接的本地機器上,當然也可以通過GitHub上的用戶界面來創建。

本地創建

打開命令行工具,在任何目錄下創建一個Git倉庫目錄(你也可以使用已經存在的項目目錄),并定位到該目錄下。然后通過下面的命令將這個目錄初始化為一個Git倉庫

git init
git add .
git commit –m “The first commit” 
  • 第一條命令進行初始化,它會在當前目錄下創建一個包含所有元數據和倉庫變更歷史的.git隱藏目錄。后面所有針對這個代碼倉庫所做的操作,都會被Git記錄到這個目錄下,這樣完全不會破壞你本身代碼結構,使得整個項目更加整潔。
  • 第二條命令的符號“.”告訴Git開始跟蹤并記錄當前目錄下所有文件變化。
  • 最后一條命令則將當前目錄下的所有內容進行了一次提交,其中-m是message的意思,一般用來標識此次提交的內容變化信息。

通過GitHub創建

登錄GitHub后,點擊“New repository”菜單,在填寫了Git倉庫名稱后點擊“Create repository”你就可以在你的賬號下創建一個代碼倉庫了。

要將一個代碼倉庫取回到本地,可以通過GitHub代碼庫頁面上提供的地址,用以下命令克隆到本地環境中:

git clone git@github.com:githubtrainer/hellogitworld.git 

clone命令會執行一些額外的子任務,這些子任務對于用戶來說都是透明的。最終這個Git倉庫所包含的所有文件連同它的修改歷史都將被拷貝到你的本地環境中。

從GitHub克隆到本地的代碼倉庫相當于GitHub上原始代碼庫的本地鏡像。遠程的代碼庫地址等信息也會被預設到這個新建的本地庫中,用于更新或同步遠程GitHub代碼倉庫。


本地倉庫處理

編輯

一旦你通過克隆或初始化創建了一個新的Git項目后,你就可以像修改本地文件一樣修改項目目錄中的任何文件。與傳統VCS中的檢出概念不同,Git中沒有文件鎖的概念。

Adding

當有新的文件需要提交前,首先需要將這些文件放入暫存區,這樣Git才會對這些文件進行跟蹤。你可以將一個文件,一個文件夾或通過使用通配符將一組文件添加到暫存區中。

git add index.html
git add javascript/
git add *.js

你也可以使用-i參數,以交互方式,一步一步添加文件。

git add -i

-p參數是一種更精確的提交方式,允許你只提交部分修改的內容

git add -p

Committing

git commit命令可以將當前暫存區中的文件實際保存到倉庫的歷史記錄中。通過這些記錄,我們就可以在工作樹中復原文件。下面的命令會打開文本編輯器,要求你輸入此次提交的說明。

git commit

你也可以在命令行中直接指定提交說明,并完成提交

git commit –m ”Your commit message”

要修改上一次提交的說明,可以使用--amend參數。執行下面的命令后,文本編輯器會自動打開,你就可以編輯提交說明了。

git commit –-amend

Moving

你可以在操作系統里移動一個文件,Git能夠自動識別出文件的移動,并給這個文件打上“move”的標識。然而,使用Git命令往往是最高效的。你可以使用以下命令來移動一個文件。

git mv originalfile.txt newsubdir/newfilename.txt

Removing

使用git rm命令能夠將一個文件標識為刪除狀態,你可以在下一次提交時確認刪除。

git rm filetoremove.txt

Aborting

如果你希望忽略當前所有還沒提交的操作,并返回到最后一次提交后的狀態,可以使用下面的reset命令,其中 --hard參數能夠循環地將所有未提交或未被放入暫存區的文件進行回滾。

git reset --hard

在很多情況下,你或許只希望回滾某一個文件,此時你可以使用checkout命令

git checkout modifiedfile.txt

查看

在我們的日常工作中需要經常查看代碼倉庫的當前或歷史信息,包括當前工作目錄下變更狀態,通過對比之前的提交歷史了解代碼的變化等等。

Status

通過status命令檢查當前目錄下文件的狀態,如新添加的,被修改的,未跟蹤的等。

git status

Diff

git diff命令可以查看工作樹、暫存區、最新提交之間的差別,它提供了一個patch-style的視圖,方便用戶可以直觀的查看文件前后的變化。

git diff
git diff --staged
git diff HEAD

git diff 查看當前工作樹與暫存區的差別。如果暫存區是空的,那么它將顯示工作樹與最新提交狀態之間的差別。“+”號標出的是新添加的行,被刪除的行用“-”表示。

git diff --staged 查看暫存區與最新一次提交之間的差別

git diff HEAD 查看本次提交與上次提交之間的區別。這里的HEAD是指向當前分支中最新一次提交的指針。在git commit前查看兩次提交之間的差異,是一個良好的編程習慣。

Log

git log命令可以查看以往倉庫中提交的日志。包括可以查看某個時間點以來,最近指定次數的提交,或是指定文件或目錄的變更歷史等。

git log
git log -3
git log --since=yesterday

Blame

git blame命令可以幫你發現文件中的每一行是在什么時間以及為什么被加上或更改的。

git blame <filename>

分支

Git中的分支與其他版本控制很像,但不同點在于Git中的任何一個分支都可以被取回到本地,也可以通過push與其他團隊成員共享。使用Git創建和使用分支非常方便,這樣開發人員就可以通過創建分支來進行試驗性的開發嘗試。如果嘗試失敗了,則可以將對應的本地分支丟棄,而如果成功了,則可以將本地分支與主分支進行歸并提交。

git branch <new branch name> <from branch>
git branch <new branch name>

選擇一個分支

通過提供一個分支的名稱就可以方便地檢出或切換一個分支。

git checkout <branch name>

下面的命令中,首先通過git branch來創建一個新的分支,然后使用git checkout命令來將當前分支切換到新創建的分支上。遠程分支總是只讀的,只有在本地創建分支后才能進行對文件進行修改操作。

git branch <new branch name> <from branch>
git checkout <new branch name>

或者你也可以直接使用git checkout -b來操作,下面命令的效果與上面兩條命令是相同的。

git checkout -b <new branch name> <from branch>

顯示所有分支

你可以通過下面的命令來顯示當前代碼庫中的所有分支

git branch -a

可以看到本地的分支顯示為白色,而這里的master分支顯示為綠色,左邊帶有“*”標識,這說明master是我們的當前工作分支。遠程分支會以紅色表示,并且加上remotes這個前綴。

歸并分支

像其他版本控制工具一樣,Git也允許你將一個或多個分支歸并到當前工作分支中。

git merge <branch one>
git merge <branch one> <branch two>

如果在歸并的過程中出現沖突,Git會提示你,并將文件中存在沖突的部分用>>>>>>>>> 和 <<<<<<<< 包裹起來。你需要手工消除這些沖突,然后用git add和git commit命令提交更改。

壓縮分支

可以將一個分支的修改內容壓縮到另一個分支中,系統會根據每一次提交的先后順序在目標分支中增加提交內容。

git rebase <source branch name>
git rebase <source branch name> <destination branch name>

提交哈希

不同于使用順序的版本號,Git會給每一次提交標識一個唯一的SHA–1的哈希值。這樣就允許我們通過這個哈希值來定位到任何一次提交。

一個完整的SHA–1哈希值包含40個字符:
64de179becc3ed324daab72f7238df1404723672

為了能夠更加高效地定位歷史提交,Git提供了一些速記符號。你也可以直接使用哈希值的一部分來定位一次提交,通常情況下你只需要提供一個哈希值中的4-5個字符,Git就能識別出對應的提交了。

速記符 定義
HEAD 最后一次提交
HEAD^ 前一次提交
HEAD^^ 之前第二次提交
HEAD~1 前一次提交
HEAD~3 之前三次提交

Git速記符能夠與其他命令配合使用,比如下面的例子:

git diff HEAD~3
git checkout HEAD^^ git merge RELEASE–1.0

高級命令

除了前面介紹的核心Git工作流程外,還有許多其他命令可以幫助你提高在日常開發中的工作效率。

Stashing

當你做了一些修改,但還未完成,此時臨時需要返回之前的某一個狀態,但同時你又希望保修這些更改,方便未來繼續使用時,Git提供了一個非常有用的功能。對于那些修改使用stash會將這些修改壓入到一個棧中。

git stash

當你需要將之前的修改取回,并繼續工作時,只需要使用stash pop將它們從棧中取回即可。

git stash pop

Stash只會將修改過的,且已被跟蹤(在暫存區中)的文件放入棧中,但是對于那些新添加的還未跟蹤(不在暫存區中)的文件,它并不會進行處理。

Tagging

Git提供了標簽機制,能夠為我們的每一次提交打上標簽,這樣我們可以通過標簽來查看所有對應的提交。如果沒有指定具體的提交哈希值,那么Git將默認為最近的一次提交(HEAD)打上標簽。

git tag <tag name>
git tag <tag name> <commithash>

通過下面的命令可以列出所有的標簽

git tag

遠程倉庫處理

對遠端代碼倉庫進行操作也是Git的核心功能。你可以通過push來發布你對遠程倉庫的更新,或使用pull來同步遠端代碼倉庫。通常情況下Git倉庫更多通過SSH協議來進行連接。

Git代碼倉庫是通過一個簡單的守護程序來提供共享服務的https://www.kernel.org/pub/software/scm/git/docs/git-daemon.htm

Remotes

通過remote命令可以給本地倉庫設置對應的遠程倉庫作為源或目標。

你所設置的遠程倉庫地址可以通過以下命令查詢:如果你是通過clone命令將一個遠程倉庫同步到本地的,那么默認的,它會顯示一個叫做“origin”的遠程庫。

git remote -v

使用下面的命令來添加遠程倉庫

git remote add <remote name> <remote address>

Push

Push命令可以將本地的代碼倉庫變更推送到遠程倉庫中。

git push <remote name> <branch name>
git push <remote name> <local branch name:remote branch name>

像這樣執行git push命令,你能就將當前本地分支的內容推送給遠程倉庫的指定分支,一般情況下是origine的master分支。完成推送以后,其他具有權限的人就可以獲取到你的更新了。

Pull

Pull命令實際上包含了兩個操作,首先是獲取(fetching)遠程倉庫的內容,然后與本地倉庫的內容與提交歷史作自動的歸并操作。

git pull

Fetch

另一種同步方式是使用Fetch命令將遠程倉庫內容放入本地緩存,接著你可以對獲取的內容進行檢查評估,然后人工進行歸并操作。

git fetch <remotename>
git merge <remotename/branchname>

探索GITHUB

在你熟悉了Git相關的所有操作,并能夠熟練地克隆代碼倉庫,提交和發布更新的代碼之后,你就可以開始探索GitHub帶來的社會化編程特性了,這也是Git和GitHub與其他傳統版本控制工具的最大不同之處。

Forking

如果你想修改GitHub中的開源項目,可以通過Fork操作來實現。Fork一個代碼倉庫,GitHub將會完整地將這個代碼倉庫拷貝到你自己的賬戶下,然后你就可以像自建倉庫一樣使用這個代碼倉庫并進行修改了。

點擊Fork按鈕你就可以將任何可訪問的代碼倉庫導入到自己的賬戶中。

所有被fork的代碼倉庫都會在倉庫頁面顯示它原來的名稱。

Pull Request

被fork的代碼倉庫始終會保持與源代碼倉庫的關聯關系,這樣你修改源代碼之后,可以方便地通過Pull Request請求對方倉庫采納你所做的修改。只要Pull Request被源庫管理員接受,那么你將成為這個項目的Contributor。

要提交Pull Request申請,你需要先選擇你fork的代碼倉庫中的一個分支,然后帶點擊分支左側的綠色按鈕,這時會跳轉到查看分支差別的頁面,在確認修改無誤后,點擊“Create Pull Request”按鈕,并在表單中填寫此次請求的相關說明,最后點擊“Send pull request”按鈕,你的請求就順利發出了。

源庫的管理員會收到你的請求,然后通過review你的修改來決定是否接受代碼歸并。


GUIS

標準Git版本中都自帶了兩套用戶界面,分別使用Tcl和Tk編寫。它能為用戶提交修改或查看提交歷史等操作提供更直觀的視圖。

Git Gui提供了一個面板,用戶可以選擇需要添加的文件,查看暫存文件列表,完成提交等常用操作。

git git

Gitk提供了一個圖表視圖很直觀地顯示了項目的提交歷史和分支。

gitk --all

SUBVERSION & GIT

Git是一個高度協作化的版本控制系統,它同時支持與遠程Subversion庫進行交互。

Cloning

你可以通過下面的命令將遠程Subversion倉庫(使用傳統的)克隆到本地目錄中。新創建的Git項目不會帶有Subversion中與代碼無關的控制文件。

git svn clone --stdlayout <svn-repo-url>

由于Git需要進行很多轉換操作,因此從Subversion克隆到本地代碼庫可能需要較長的時間。

推送Git提交到Subversion

Git提交也可以被推送到遠程Subversion倉庫中

git svn dcommit

從Subversion更新

當遠程Subversion代碼倉庫發生變化,你可以使用svn rebase命令,將變更同步回本地Git倉庫。

git svn rebase

使用Subversion操作GitHub項目

如果你仍然希望保留Subversion的相關工作流程,并且使用GitHub來存放和管理你的項目。那也非常簡單。在GitHub中的所有代碼倉庫都能支持SVN工具和操作。

使用下面的命令從GitHub上做一次傳統的SVN檢出操作

svn checkout https://github.com/<username>/<project>

同樣可以使用下面的命令作部分檢出操作

svn checkout https://github.com/<username>/<project> <partial>

其他參考材料

Git官方網站
包括:安裝包,版本說明,文檔
http://git-scm.org

GitHub
官網,注冊,幫助文檔
https://github.com
https://github.com/signup/
https://help.github.com


簡書簽約作者:技匠,以上內容歡迎大家分享到朋友圈/微博等。如需轉載,請通過簡信聯系授權。謝謝大家!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容

  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,689評論 9 163
  • Git是目前最流行的版本管理系統,也是最先進的分布式版本控制系統(distributed version cont...
    pro648閱讀 5,740評論 1 17
  • 記得那時十二歲的那一年的夏天,我隨媽媽去小姨家,就是那一年見到了那個帶給我青春太多難以忘記的人。 記得那一天...
    揮手作別閱讀 490評論 0 0
  • 百哥是我高中的同學,他經常跟我抱怨說“他是個極度憂傷的藝術生”,然而我還是覺得他就是個極度空虛的死瘦子。就在我窮極...
    夏洛飛閱讀 562評論 0 0
  • 這本書分為三個部分,第一部分是“芝加哥的同學聚會”,這個部分主要是講了這些同學們,在面對生活變化時的恐懼以及這樣變...
    Hey你好啊閱讀 542評論 6 2