剛進入新公司,被告知團隊是用 Git 管理項目代碼 的,而你卻從來沒用過 Git。縱然同事告訴你「沒 事,先自學一下」「有問題可以問我」,但你肯定 不想一進公司就花太多時間在自我學習上,也不想 過多地打擾這些剛認識的同事。怎麼辦?
對你來說,最重要的是,先知道 Git 怎麼用。先把 最基本的掌握了,至於正規團隊使用 Git 有什麼額
外要求、Git 有什麼高級用法、Git 的原理這些,都 可以放在這之後。萬事開頭難,你先把 Git 最基本 的使用掌握了,後面的再一步一步來。
1.安裝 Git
點擊 這裏 去下載個 Git ,安裝到你的機器上。或 者如果你喜歡用 Homebrew 或 apt 什麼的來安裝 都好,總之,把它安裝好。
裝好以後,就可以正式開始上手 Git 了。
2.創建一個練習項目
學習的時候最好別拿團隊的正式項目練手,先在 GitHub 上建一個自己的練習項目。
訪問 GitHub (用別的平臺比如 bitbucket 什麼的也行) 註冊或登錄您的賬號 點擊右上角的「New Repository」來新建遠 程倉庫
進入倉庫設置頁面填寫信息:
① 是你的 倉庫名,這個倉庫名同樣會被 GitHub 設置爲 你的倉庫的根目錄的名稱;
② 是爲 .gitignore
設置項目類型, .gitignore
是 Git 倉庫中的一個特殊的文本文件,它裏面 記錄了你不希望提交到倉庫的目錄和文件的名 稱或類型,例如你的 /build
目錄;
把 ① 和 ② 填好之後,就可以點 ③ 來完成遠程倉庫的 創建了。
創建完的遠程倉庫大概長這樣:
點擊右邊的「Clone or download」,然後把倉庫 的 clone
地址複製到剪貼板:
那麼clone 地址是什麼?
3.把遠程倉庫取到本地
接下來就可以把遠程倉庫取下來了。取的方式很簡 單:在 Terminal 或 cmd 中切換到你希望放置項目 的目錄中,然後輸入:
git clone 你剛複製的地址
Git 就會把你的遠程倉庫 clone 到本地。在這個過 程中,你可能會需要輸入你的 GitHub 用戶名和密 碼:
輸入正確的用戶名和密碼以後,你會看到你的當前 目錄下多了一個新的子目錄,它的名字和剛纔新建 的 GitHub 倉庫名一致:
進入這個目錄,你會發現這裏除了你剛纔添加的 LICENSE
和 .gitignore
文件外,還有一個叫做 .git
的隱藏目錄。
這個 .git
目錄,就是你的本地倉庫(Local Repository),你的所有版本信息都會存在這裏。 而 .git
所在的這個根目錄,稱爲 Git 的工作目錄(Working Directory),它保存了你當前從倉 庫中籤出(checkout)的內容。現在你在項目的目 錄下輸入:
git log
在這裏你只能看到一個提交,這個提交是 GitHub 幫你做的,它的內容是創建你的初始 .gitignore
和 LICENSE
這兩個文件。圖中第一行中的 commit
右邊的那一大串字符(09773235… 21411),是這個 commit
的 SHA-1 校驗和(如 果不知道什麼是 SHA-1,你可以暫時把它簡單理解 爲這個 commit
的 ID);後面括號裏的內容 (HEAD -> master …)稍後再講;第一行的下 面,依次是這個 commit
的作者、提交日期和提 交信息,其中提交信息記錄了這個提交做了什麼,是提交者填寫的(當然,這條提交信息是 GitHub 幫你寫的)。
簡單看一下這些信息,然後按 q
鍵退出吧,往下 繼續。
4.寫個提交試試
把遠程倉庫取到本地之後,你就可以開始嘗試提交 代碼了。不過爲了方便,你不必真的寫代碼,你可 以在工作目錄下創建一個文本文件,例如 shopping list.txt
。
Git 的提交是用的 commit
指令。不過…… 你現在 還不能直接提交。你現在在 Terminal 輸入:
git status
status
是用來查看工作目錄當前狀態的指令:
這段文字表述了很多項信息:
- 你在
master branch
; - 當前
branch
沒有落後於origin/master
; - 你有 untracked files (未追蹤的文件),文 件名是
shopping list.txt
; - 你可以使用
git add
來開始追蹤文件。
其中前兩條你可以暫時先不理,branch 的東西我 在後面會講。關於後兩條,簡單說一下:
從上面的信息可以看出, shopping list.txt
這 個文件目前屬於 “untracked” 狀態,它的意思是 Git 倉庫對它沒有進行任何記錄,你在提交的時候 不會把它提交上去,查看提交歷史也不會看到它。 總之,對於 Git 倉庫來說,它是不存在的。
而你現在想提交這個文件,所以首先,你需要用 add
指令來讓 Git 開始跟蹤它:
git add shopping\ list.txt
輸入這行代碼,Terminal 不會給你反饋信息。但這 時你再執行一次 git status 在這裏插入代碼片
,你會發現顯示內容變了:
可以看到, shopping list.txt
的文字變成了綠 色,它的前面多了「new file:」的標記,而它的描 述也從 “Untracked files” 變成了 “Changes to be commited”。這些都說明一點: shopping list.txt
這個文件的狀態從 "untracked"
(未跟 蹤)變成了 "staged"
(已暫存),意思是這個文件 中被改動的部分(也就是這整個文件啦)被記錄進 了 staging area
(暫存區)。
解釋一下 “stage” 這個詞,這個詞對我們中國 人可能有一些理解難度。按我們英語課本上的 內容來看,stage 是一個名詞,它的意思是「舞臺」。可是不論從詞性還是詞義,「舞 臺」都不太能解釋 "stage"或 “staging area” 的意思。實質上,Git 中的 stage 取自這個詞 的另一個意思:組織和準備某個事件。而 “staging area” 的意思也並不是「舞臺區域」,而是「用來彙集物品或材料以備使用的 區域」的意思。
.
所以 stage 這個詞在 Git 裏,是「集中收集改 動以待提交」的意思;而 staging area ,就 是一個「彙集待提交的文件改動的地方」。簡 稱「暫存」和「暫存區」。至於 staged 表示 「已暫存」,就不用再解釋了吧?
所謂的 staging area,是 .git
目錄下一個叫做 index 的文件(嗯,它的文件名並不叫 stage )。你通過 add 指令暫存的內容,都會被寫進這 個文件裏。
現在文件已經放進了暫存區,就可以提交了。提交 的方式是用 commit
指令:
git commit
然後你會進入這樣一個界面,這個界面是用來填寫 提交信息(commit message)的。根據操作系統 以及設置的不同,這個界面的編輯器可能是 nano
所以 stage 這個詞在 Git 裏,是「集中收集改 動以待提交」的意思;而 staging area ,就 是一個「彙集待提交的文件改動的地方」。簡 稱「暫存」和「暫存區」。至於 staged 表示 「已暫存」,就不用再解釋了吧?
或者 vi 或者別的什麼,總之如果你不會用它,那麼 建議你儘快上網搜搜它的用法,因爲 Git 的操作會 經常用到它。在這裏我只簡單說一下它的最基本用 法:
- 在初始狀態下,你是在命令模式,不能編輯 這個文件,你需要按一下 “i”(小寫)來切換 到插入模式,然後就可以輸入你的提交信息 了:
- 在輸入完成後別按回車,而是要按 ESC 鍵返 回到命令模式,然後連續輸入兩個大寫的 “Z”(用 Shift 鍵或 Capslock 鍵都可以), 就保存並退出了。
這樣,一次提交就完成了。如上圖這樣,從界面中 你可以看到這次提交的簡單信息。這時如果你再執 行一次剛纔執行過的git log
(還記得這個指令是什麼意思嗎?它會列出你的提交歷史):
git log
可以看到,你的這條提交被列在了最上面,現在你 的提交歷史中有兩條記錄了。這說明,你已經成功 做了一次提交到本地倉庫,它已經被保存在了 .git
這個目錄裏的某個地方了。
5.更新文件後再來個提交
想來想去,我還是覺得把「java」刪掉吧:
趕緊把它提交上去。提交之 前先看看文件狀態是個好習慣:
git status
可以看到, shopping list.txt
又變紅了,不過 這次它左邊的文字不是 “New file:” 而是
“modified:”,而且上方顯示它的狀態也不是 “Untracked” 而是 “not staged for commit”,意 思很明確:Git 已經認識這個文件了,它不是個新
git status
文件,但它有了一些改動。所以雖然狀態的顯示有 點不同,但處理方式還是一樣的:
git add shopping\ list.txt
這時再 status
一下,就會看到 shopping list.txt
已經 staged (“to be commited”) 了:
git status
好,最後一步, commit
:
git commit
這時再看看 log ,你已經有三條 commit
了:
git log
6.把提交推送到中央倉庫
到現在爲止,已經寫了兩條提交,但它們都還在本 地倉庫。爲了把代碼分享出去,你還需要把這些提 交上傳到中央倉庫。如果你現在再看一下git log
把提交推送到中央倉庫 status
:
git status
你會看到,Git 提示你的當前 branch 已經領先於 ( “ahead of” )'origin/master'
兩個提交了。就 像上面我說的,branch 這個概念我到後面再講, origin/master
的中的 origin
是遠端倉庫的名 稱,是你在用 clone
指令初始化本地倉庫時 Git 自動幫你起的默認名稱; master
是 origin
上 的分支名稱。不過對於現在來說,可以暫時把 origin/master
簡單理解爲「中央倉庫」。也就 是說,這句話是告訴你,你的本地倉庫已經領先中 央倉庫兩個提交了。這兩個提交很明顯就是指的剛 才那兩個關於 shopping list.txt
的提交。
而這句話的下面也說明了,你可以使用 git push
來把你的本地提交發布(即上傳到中央倉庫)。所 以很簡單,照做吧:
git push
由於這是聯網操作,所以在這個過程 GitHub 會再 次向你索要賬戶和密碼。填入正確的賬戶和密 碼, push
操作就完成了。這時你再去你的 GitHub 倉庫頁面看一下:
你會發現 shopping list.txt
文件已經在上面 了,並且 commits
的數量從一個變成了 3 個。這 說明你已經成功把本地倉庫的提交推送到了服務器。
如果覺得一遍遍地輸入密碼很煩,可以按照 這 個頁面提供的方案來把密碼保存起來。 另外還有一個更簡單但安全性低一些的方案。 執行這行代碼:
git config credential.helper store
在這之後你只需要再輸入一次密碼, Git 就會 把你的密碼保存下來,這之後就再也不用輸入 了。說它「安全性低」,是因爲這條指令會讓 Git
把你的密碼以明文形式保存在你的電腦 上。具體這兩種保存密碼的方案選擇哪個,看 你自己了
7.小結
在這一節裏,描述了 Git 的最基本的工作模型:
- 從 GitHub 把中央倉庫 clone 到本地(使用命 令:
git clone
) - 把寫完的代碼提交(先用
git add
文件名 把文件添加到暫存區,再用git commit
提 交)
– 在這個過程中,可以使用git status
來隨時查看工作目錄的狀態
– 每個文件有 “changed / unstaged”(已修改), “staged”(已修改並暫存), “commited”(已提交) 三種狀態, 以及一種特殊狀態 “untracked”(未跟蹤) - 提交一次或多次之後,把本地提交 push 到 中央倉庫( git push )
8.注意
- 以上所有的命令行操作都是 在項目工程上打開 “
Git Bash Here
” 這個命令行窗 口上操作的; - 所有的命令都有快捷提示補充功能
tab
鍵,比如輸入 “git status
” 這個命令時,只需 要輸入 “git stat
” 再按 tab 鍵就補充剩下的了,其 他也是; - 上面提到的都是一個文件一個文件的添加 到 staged,所以用 “
git add 文件名
”,添加所有 文件到暫存區可以直接用 “git add .
”,提交直 接用 “git commit -m'你提交的信息
’”,推到中央 倉庫也可以直接用"git push origin master
"就好 了; - 上面提到輸入用戶名和密碼問題,只把 項目 clone 下來時不用"
https 的那個 url
",而是 用“ssh 的那個 url
” 這樣就不需要每次操作輸入 用戶名和密碼了。