假如你剛加入一個(gè)項(xiàng)目組,該項(xiàng)目使用Git作為源代碼管理,但你之前沒(méi)有用過(guò)Git,你該怎么辦?
剛開(kāi)始你完全沒(méi)必要去系統(tǒng)學(xué)習(xí)Git,只要了解幾條命令就足以勝任:首先用git clone下載代碼,每當(dāng)你修改一個(gè)文件或者新添加了一個(gè)文件你用git add暫存修改,修改好之后用git commit提交代碼變更記錄,最后用git push提交到服務(wù)器上。如果你隨時(shí)想查看提交記錄用git log。我們來(lái)看看具體該怎么做:
注意,如果沒(méi)有其他特殊說(shuō)明,本教程的所有操作都是在系統(tǒng)shell中運(yùn)行,不包含任何圖形化工具的操作。
安裝Git Git官方網(wǎng)站上有相應(yīng)平臺(tái)版本下載(Mac上一般默認(rèn)有Git,如果你用Mac先敲下git命令,確認(rèn)下有沒(méi)有)。在不想安裝的情況下,你也可以去這里在線練習(xí),該網(wǎng)頁(yè)提供模擬的Git命令供你一步步練習(xí)使用。
全局設(shè)置
git config --global user.name "John Doe" // John Doe換成你自己名字`
git config --global user.email johndoe@example.com // johndoe@example.com 換成你的郵件地址
用戶名和郵件是用來(lái)追蹤代碼提交者的,每次你提交代碼,歷史記錄里面會(huì)有這個(gè)信息。
-
獲取遠(yuǎn)程代碼倉(cāng)庫(kù)地址如果你還沒(méi)有Git服務(wù)器的地址,請(qǐng)找你同事求助,問(wèn)一問(wèn)“我們Git服務(wù)器地址是什么?”,一般情況下你會(huì)得到這樣一個(gè)地址:
username@host:/path/to/repository
其中username是你的用戶名,host當(dāng)然就是git的服務(wù)器地址??赡苁荌P或者域名
一個(gè)真實(shí)的例子可能像這樣:
jeffrey@192.168.1.100:project.git~
或者這樣的
user@server:/projects/project.git也可能是這樣的
https://server/namespace/project.git
如果你同事只告訴你一個(gè)服務(wù)器和路徑,你也不知道用戶名密碼,你還得再找其他人幫你增加新用戶。為了方便描述,之后用_ https://server/namespace/project.git_來(lái)指代這個(gè)你得到的地址。 下載項(xiàng)目源代碼[^ 1]
git clone https://server/namespace/project.git
下載之前最好先切換到你想放源代碼的文件夾,通過(guò)執(zhí)行上面這個(gè)命令下載項(xiàng)目代碼到該文件夾中。
[^ 1]:“下載”確切的說(shuō)是創(chuàng)建一個(gè)遠(yuǎn)程代碼倉(cāng)庫(kù)的一個(gè)本地克隆,如果你有疑問(wèn),暫時(shí)就理解成“下載源代碼”即可,本系列后面文章會(huì)有詳細(xì)解釋。修改了一個(gè)代碼文件之后使用git add命令
git add the-modified-file.cc添加新代碼文件到項(xiàng)目中同樣也使用git add命令
git add the-added-file.cc提交本地倉(cāng)庫(kù)更改
git commit -m "fix a xxx bug提交到遠(yuǎn)程服務(wù)器
git push origin master
該提交命令的格式是~git push [remote-name] [branch-name]~. origin指的是遠(yuǎn)程服務(wù)器分支,master為本地分支。二者的值都是在你一開(kāi)始用clone命令的時(shí)候被git自動(dòng)設(shè)置好了的了。所以只要簡(jiǎn)單的使用origin master即可。
需要注意的幾點(diǎn)有:
多次更改需多次git add。上述#5中,如果你在你執(zhí)行了add之后有又有新的更改想提交,請(qǐng)?jiān)俅螆?zhí)行add命令,如此反復(fù)。否則此時(shí)通過(guò)commit命令被提交的只是上次add之前的更改,add之后的新改動(dòng)不會(huì)被提交。下一篇文章會(huì)詳細(xì)描述為什么需要這么做,和這個(gè)機(jī)制有什么優(yōu)點(diǎn);
git push才會(huì)提交代碼到服務(wù)器,其他操作都是在本地進(jìn)行。上述#7中_git commit _命令只是把代碼提交到本地倉(cāng)庫(kù),此時(shí)其他人還看不到你的更改。只有通過(guò)#8的push操作后代碼才會(huì)真正被提交到遠(yuǎn)程服務(wù),此時(shí)其他人才會(huì)看到你的更改;現(xiàn)在你應(yīng)該還不會(huì)如何撤銷更改,所以請(qǐng)謹(jǐn)慎使用push操作;
修改和提交代碼到服務(wù)器前最好先同步最新代碼。因?yàn)槟悻F(xiàn)在還不熟悉其他操作,為了避免merge,最好能在別人沒(méi)有改動(dòng)的情況下修改代碼,或者運(yùn)行下git fetch origin先同步別人的更改后再修改文件。
放心練習(xí),只要不做git push操作,都是安全的。這里之所以沒(méi)有推薦在本地新建一個(gè)代碼倉(cāng)庫(kù)作為練習(xí)是因?yàn)槟阃耆梢杂媚愕恼鎸?shí)項(xiàng)目隨便練習(xí)操作,只要不git push就行。真實(shí)的項(xiàng)目你可以看到別人是怎么用Git的,也不用人為花時(shí)間造練習(xí)數(shù)據(jù)。玩壞了直接在文件系統(tǒng)刪掉整個(gè)目錄,或者在其他目錄重新git clone一份項(xiàng)目代碼即可。即使公司暫時(shí)沒(méi)有可以使用的源代碼倉(cāng)庫(kù)你還可以去[github]上隨便找一個(gè)感興趣的小項(xiàng)目clone下了練習(xí)即可。如果你還是要堅(jiān)持新建本地代碼倉(cāng)庫(kù)練習(xí)隨筆找個(gè)目錄執(zhí)行git init即可,執(zhí)行git init之后該目錄下除了沒(méi)有項(xiàng)目文件以外和其他git倉(cāng)庫(kù)沒(méi)有區(qū)別。
那如何知道自己和別人的提交記錄呢?使用git log即可。輸出結(jié)果會(huì)像這樣:
$ git log
commit ca82a6dff817ec66f44342007202690a93763949`
Author: Scott Chacon <schacon@gee-mail.com>`
Date: Mon Mar 17 21:52:11 2008 -0700`
changed the version number`
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7`
Author: Scott Chacon <schacon@gee-mail.com>`
Date: Sat Mar 15 16:40:33 2008 -0700`
removed unnecessary test`
commit a11bef06a3f659402fe7563abf99ad00de2209e6`
Author: Scott Chacon <schacon@gee-mail.com>`
Date: Sat Mar 15 10:31:28 2008 -0700`
first commit
或者你想看看每次提交具體的改動(dòng)內(nèi)容,請(qǐng)加上-p選項(xiàng)
git log -p
下面顯示的結(jié)果包涵了具體改動(dòng)內(nèi)容歷史記錄
$ git log -p -2 // -2表示只想看最近兩次提交歷史
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
spec = Gem::Specification.new do |s|
s.platform = Gem::Platform::RUBY
s.name = "simplegit"
- s.version = "0.1.0"
+ s.version = "0.1.1"
s.author = "Scott Chacon"
s.email = "schacon@gee-mail.com"
s.summary = "A simple gem for using Git in Ruby code."
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
removed unnecessary test
diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index a0a60ae..47c6340 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -18,8 +18,3 @@ class SimpleGit
end
end
-
-if $0 == __FILE__
- git = SimpleGit.new
- puts git.show
-end
\ No newline at end of file