git是個了不起但卻複雜的源代碼管理系統。它能支援複雜的任務,卻是以經常被認為太過複雜而不适用于簡單的日常工作。讓我們誠實一記吧:git是複雜的,我們不要裝作它不是。但我仍然會試圖教會你用(我的)基本的git和遠端代碼庫幹活的工作步驟,在15分鐘内。
<a target="_blank"></a>
我會展示以下的步驟,通常能幫我獨自在一台或多台機器上做項目。
在本地代碼庫添加一個項目
在分支上開發新功能
a) 保留新功能 或者 b) 丢棄它們
也許,回到某個早先的時間點
将本地代碼庫推送到遠端代碼庫
在另一台機器上取得遠端代碼庫
在大多數*nix系統(linux、os x)上,git已經被安裝了。你通過發送下面的指令,可以通過git自身,把它更新到最新的的開發版本(不推薦)。
git clone https://github.com/git/git
你現在可以離開bitbucket了,我們在已經有了所有那裡需要的東西了。
在我們能用git工作之前,我們需要做個一次性的配置。為了git能跟蹤到誰做了修改,我們需要設定你的使用者名。我強烈建議你使用與注冊bitbucket賬号相同的使用者名和電子郵箱位址。發送這些指令,相應地替換掉其中的“your_username”和“[email protected]”(注意引号):
git config --global user.name"your_username"
git config --global user.email [email protected]
git config --global push.default simple
我們都設好了。你無需在你的機器上再重複這些配置,但如果你在另一台機器上工作的話,不要忘記這些配置。如果你忘記做初始的配置,git不會允許你送出任何東西,這會讓你困擾。
作為例子,我們會假裝我們有一個網站(無所謂技術)存在于我們機器上的‘workspace’檔案夾下的’my_site’檔案夾内。在指令行中,去到你的站點的根檔案夾。在os x和linux上:
cd~/workspace/my_site/
在windows上:
cdc:\workspace\my_site
我們首先需要告訴git這個檔案夾是我們需要跟蹤的項目。是以我們發送這個指令來初始化一個新的本地git代碼庫
git init
git會在my_site檔案夾内建立一個名為.git的隐藏檔案夾,那就是你的本地代碼庫。
我們現在需要指令git我們需要加載(stage)所有項目檔案。發送:
git add .
最後的“.”符号的意思是“所有檔案、檔案夾和子檔案夾”。假如我們隻想要把特定檔案添加到源代碼控制中去,我們可以指定它們:
git add my_file, my_other_file
現在,我們想要送出已加載(staged)的檔案。閱讀“添加一個時間點,在這裡你的檔案處在一個可還原的狀态”。我們送出我們的檔案時,總是附帶着有意義的注釋,描述了它們現在的狀态。我一直用“initial commit”來作為第一個送出的注釋。
git commit -m"initial commit"
就這樣。現在你随時都可以復原到這個送出狀态。如果你有需要檢查你現在的已加載(staged)和未加載(unstaged)檔案的狀态、送出等,你可以詢問git的狀态:
git status
建立分支是你建立代碼的獨立版本的動作,獨立于你的主幹分支。預設地,每次你送出到git的檔案都會被儲存到“master(主幹)”分支。
現在我們來說說,你想要向項目裡添加一個功能,但你想要能夠復原到現在版本,以防出現差錯,或者你決定要放棄這個功能。這就是你建立分支的時候了。建立并同時切換到你建立的分支,發送:
git checkout -b new_feature
或者,你可以先建立一個分支然後手動切換,就像這樣:
git branch new_featuregit checkout new_feature
要看你現在項目下所有的分支,發送這個:
git branch
現在你可以在你的項目上無所顧忌地做任何你想做的:任何時候,你都可以回到你建立分支前的狀态。注意,你同時可以有多個分支,甚至可以從一個分支上再建立一個分支。
當你對你的新功能滿意了的時候,你想要把它加到主幹分支上。當你在你的新功能分支上時,你首先需要加載(stage)并且送出你的檔案:
git add .git commit -m"adds my new feature"
然後你移到你的主幹分支:
git checkout master
像這樣合并:
git merge new_feature
此時,你的主幹分支和你的新功能分支會變成一樣的了。
相反,如果你打算丢棄你在分支裡做的修改,你首先需要加載(stage)你的檔案并且在分支裡送出:
git add .git commit -m"feature to be discarded"
然後,你移到主幹分支:
現在,你的代碼處于你建立分支之前的狀态了。
如果你要把你的分支合并到主幹分支,從主幹(master)分支上發送:
git branch -d new_feature
假如修改已經合并了,它隻會删除分支。假如分支沒有合并,你會得到一個錯誤資訊。删除一個未合并的分支(通常你不想保留的修改),你需要發送一樣的指令附帶一個大寫d。意思是“強制删除分支,無論如何我不想要它了。”:
在某些時候,你可能想要回到之前的代碼版本。首先,你需要找到你想回到哪個版本。要看所有的完成了的送出,發送:
git log
這會輸出你的送出的曆史記錄,像這樣:
commit ca82a6dff817ec66f44342007202690a93763949author: your_username [email protected]: mon nov 4 12:52:11 2013 -0700 changes the frontpage layout
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7author: your_username [email protected]: mon nov 4 11:40:33 2013 -0700 adds my new feature
commit a11bef06a3f659402fe7563abf99ad00de2209e6author: your_username [email protected]: mon nov 4 10:37:28 2013 -0700 initial commit
如果你想回到“adds my new feature”這個送出,簡單地用送出的id做簽出(checkout)(我通常隻用到id開頭的9個字元)
git checkout 085bb3bcb
你也可以簽出到一個新的分支,像這樣:
git checkout -b my_previous_version 085bb3bcb
隻是别太瘋狂了!你的分支越複雜,就越難确定你真正在做什麼。
在第一次你想推送一個本地代碼庫到遠端代碼庫時,你需要把它添加到你的項目配置裡。像這樣做:
git remote add origin https://[email protected]/your_username/name_of_remote_repository.git
注意這裡的“origin”隻是一個習慣。它是你的遠端代碼庫的别名,但是你可以用其他任何你喜歡的詞。你甚至可以有多個遠端代碼庫,你隻需要給它們起不同的别名。
之後,你想要推送你的本地代碼庫的主幹分支到你的遠端代碼庫:
git push origin master
如果你使用bitbucket,在這時,你會被請求輸入你的密碼。照做,你的本地代碼庫會被推送到你的遠端代碼庫上。
如果你還沒有一份遠端代碼庫的本地版本(例如,如果你在另一台機器上開始工作,這台機器上還沒有用過這個項目),你首先需要拷貝(clone)它。去到你的代碼庫想要拷貝到的檔案夾下,并發送:
git clone https://your_username@bitbucket/your_username/name_of_remote_repository.git
另一方面,如果你已經在本地的項目上工作了,隻是想從遠端代碼庫上取得它最新的版本,移動到項目的根目錄下,并發送:
git pull origin master
git允許你為你常用的指令建立快捷方式(别名)。例如,如果你不想每次都輸入git commit -m “some comment”,而是輸入git c “some comment”,你可以向你的git全局配置裡添加一個别名來實作,像這樣:
git config --globalalias.c'commit -m'
這是我使用的别名清單:
git config --globalalias.co'checkout'
git config --globalalias.cob'checkout -b'
git config --globalalias.br'branch'
git config --globalalias.m'merge'
git config --globalalias.a'add .'
git config --globalalias.s'status'
git config --globalalias.dbr'branch -d'
有任何建議、技巧和問題?在下面留言!
原文釋出時間為:2013-12-22
本文來自雲栖社群合作夥伴“linux中國”