標籤:
Git是一個代碼版本管理工具,也就是允許我們的一個項目擁有多個版本,這樣我們可以隨心所欲的修改我們的代碼,如果出現問題,可以回退到某一個提交點。如果你還在用一堆堆注釋來更新你的代碼,那麼可以嘗試一下Git了,畢竟,它不難。
常用的Git操作其實不多,明白這個過程就行了。
※ 關於Git的安裝畢竟簡單,所以這裡就不說了。沒錢買mac,所以......
簡單的流程:初始化->修改檔案->添加至暫存區->提交修改->回退
安裝完畢後,需要先設定使用者名稱和郵箱,在案頭中右鍵選擇Git Bash Here,會開啟一個小黑窗
輸入如下命令進行設定即可:
$ git config --global user.name "XXX"
$ git config --global user.email "[email protected]"
① 初始化:git init
先進入工程的目錄,這裡的Demo是在D:\GitDemoProject目錄下,項目暫時為空白,也可以用Studio直接建一個HelloWorld。
在項目根目錄右鍵,選擇Git Bash Here開啟命令視窗。
我們的所有命令都是在這個視窗輸入。
接著輸入:git init 然後斷行符號,會有如下提示:
$ git initInitialized empty Git repository in D:/GitDemoProject/.git/
這樣我們的初始化就完成了,項目下會多出一個.git檔案夾。
② 建立一個檔案
如果熟悉Linux,可以直接用這個Bash來touch一個檔案,我們這裡直接右鍵建立一個test.txt檔案並輸入:Hello Git
這裡介紹一個命令:git status,在Bash輸入會得到如下提示:
$ git statusOn branch masterInitial commitUntracked files: (use "git add <file>..." to include in what will be committed) test.txtnothing added to commit but untracked files present (use "git add" to track)
最後一行提示我們,沒有檔案添加至跟蹤狀態,但是發現了建立的未追蹤檔案。
③ 添加至暫存區
上面建立的檔案就是在暫存區之外的,這些檔案不會被Git控制,也就是目前我們的Git實際上還沒有儲存任何關於這個檔案的資料。我們需要讓Git知道,這個檔案是需要被標記的,如果它有任何修改,告訴我。
添加至暫存區的命令:git add 檔案名稱
$ git add test.txt
這個時候再查看一下狀態:
$ git statusOn branch masterInitial commitChanges to be committed: (use "git rm --cached <file>..." to unstage) new file: test.txt
我們的檔案狀態不再是Untracked了。
④ 提交修改
命令:git commit -m "xxx"
xxx指的是這次提交的訊息,用簡短明了的一句話描述這詞提交的內容可以協助我們快速的進行版本切換。
$ git commit -m "first commit"[master (root-commit) 5b59dc7] first commit 1 file changed, 1 insertion(+) create mode 100644 test.txt
這個時候,我們就完成了一次提交了。目前為之,整個項目的目前的版本已經被Git儲存起來了,在有需要的時候可以進行回退。
現在再看看狀態:
$ git statusOn branch masternothing to commit, working directory clean
提示我們沒有東西可以提交,這個時候只要被跟蹤的檔案發生改變,這個狀態才會發生改變。
我們來試一下!
我們開啟test.txt檔案並修改一下它的內容為:Hello Android
接著重新查看狀態:
$ git statusOn branch masterChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: test.txtno changes added to commit (use "git add" and/or "git commit -a")
現在我們被告知,有檔案發生了改變(modified),需要重新添加至暫存區才能提交。
但是先不要著急,我們再建立一個檔案名稱為readme.txt,不需要添加任何內容。
這個時候再執行一次git status查看狀態:
$ git statusOn branch masterChanges not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) modified: test.txtUntracked files: (use "git add <file>..." to include in what will be committed) readme.txtno changes added to commit (use "git add" and/or "git commit -a")
可以看到,建立的檔案狀態為Untracked,這個時候,我們需要先把這兩個檔案添加至暫存區,才可以進行提交,直接將這兩個檔案添加至暫存區的命令是git add .
$ git add .
這個命令是把目錄下所有的檔案都添加至暫存區。
接著查看狀態:
$ git statusOn branch masterChanges to be committed: (use "git reset HEAD <file>..." to unstage) new file: readme.txt modified: test.txt
這個時候就可以進行第二次的提交了,我們直接輸入:git commit命令,注意不輸入-m "xxx",視窗會跳轉到如下所示的地方:
這裡就需要一點vim的知識了,這個檔案其實就是用來表示檔案提交的內容的,所有以#開頭的行都會被忽略,所以我們可以另開一行來編寫我們的提交資訊。這裡不懂的話可以直接用-m來代替。
修改完並儲存好會回到原來的地方:
$ git commit[master ea017b6] create readme.txt and modified the test.txt 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 readme.txt
⑤ 回退
假設我們現在發現,第二次的提交是有問題的,我們需要回到第一次提交的地方,要怎麼做呢?
這裡我們可以使用git reset命令,這個命令需要我們填入一個表示回退點的值,這樣才能確認回退到的地點。而這個值,可以通過git log來查看:
$ git logcommit ea017b63e4043e7750efd2eb39f39d5668b69ec4Author: Fndroid <1603808949@qq.com>Date: Fri Aug 12 21:25:03 2016 +0800 create readme.txt and modified the test.txtcommit 5b59dc7a5aa1338b06f107dea6492842a5c3286dAuthor: Fndroid <1603808949@qq.com>Date: Fri Aug 12 21:02:30 2016 +0800 first commit
可以看到,我們提交了兩次,每次的commit後面有一串長長的時間點雜湊值,我們可以根據這個雜湊值回退到那一次的提交點:
$ git reset --hard 5b59dc7a5aa1338b06f107dea6492842a5c3286dHEAD is now at 5b59dc7 first commit
這個時候,回到你的項目根目錄中可以看到,我們建立的readme.txt檔案已經不見了,而且,test.txt檔案的內容被還原為Hello Git
※ 後援動作會拋棄會退點以後的所有提交,所以,請謹慎。
到這裡,整一個流程已經走完了,我們已經可以自如的控制這個工程的多個版本了。
分支
在上面的這個內容中,我們的項目的不同版本是建立在一條直線上的,如果回退,那麼在回退點的後所有的提交都會丟失,實際上還做不到隨心所欲,所以,分支就出來了。
我們可以通過git branch命令查看當前所在的分支:
$ git branch* master
*開頭的就是所在的分支,這裡預設的情況下只有一個master分支。
而一般的情況下,我們項目的穩定版,都應該是在這一個分支,而其他的新功能和bug修複,可以新建立一些分支進行,當程式碼完成並通過測試的時候,再和master分支合并來推進整個開發的進城。
在我們的Demo中,假設當前的test.txt檔案已經是穩定版(不要驚呆了),我們需要增加一些新功能(就隨便寫幾句話進去而已),那麼我們可以這樣做:
① 建立一個新的分支:git checkout -b 分支名
$ git checkout -b featureSwitched to a new branch ‘feature‘
這裡建立了一個叫做feature的新分支,git自動幫我們切換到這個分支上了。
② 添加新功能
我們在test.txt檔案中添加幾句話(代碼),這個隨意吧,例如我的:
③ add和commit
這裡在新的分支中,和master分支的操作也是一樣的,我們提交一下這次更新,但是這次,我們可以謹慎一些。
在add之前,我們可通過git diff命令查看當前做的改變:
$ git diff test.txtdiff --git a/test.txt b/test.txtindex e51ca0d..8612dc2 100644--- a/test.txt+++ b/test.txt@@ -1 +1,3 @@-Hello Git\ No newline at end of file+Hello Git++I am a good new feature.\ No newline at end of file
確認無誤之後,就可以add和commit了,養成使用diff和status命令的習慣是很好的。
$ git add test.txt
$ git commit -m "add a new feature"[feature 60a91d1] add a new feature 1 file changed, 3 insertions(+), 1 deletion(-)
③ 切換分支
假設這個時候,我們想查看一下master分支的內容,就需要進行分支切換,代碼非常簡單:
$ git checkout masterSwitched to branch ‘master‘
這個時候,可以查看一下我們的test.txt檔案的內容:
可以看到,切換回來之後,檔案的內容也被還原了,是不是很神奇。
④ 修改主分支
這裡假設,有同事對主分支進行了修改,這個檔案的內容被改為“Hello Android”並且提交了。
$ git add .
$ git commit -m "modified test.txt"[master 9f55797] modified test.txt 1 file changed, 1 insertion(+), 1 deletion(-)
⑤ 合并分支
假設我們覺得我們的feature分支修改沒問題也通過了測試,那麼我們就可以把feature和master分支進行合并了
※ 注意合并之前要先回到master分支,在master分支執行合并命令,這裡由於有③,就省略了。謹記。
我們執行合并命令git merge 分支名:
$ git merge featureAuto-merging test.txtCONFLICT (content): Merge conflict in test.txtAutomatic merge failed; fix conflicts and then commit the result.
可以看到,有一個衝突發生了(CONFLICT),因為我們故意執行了③,使得test.txt檔案發生了改變。
如果我們的master分支在我們建立分支feature之後沒有進行任何更改,這裡就不會有衝突,但是一般不會這麼理想,我們要介紹如何解決這個衝突。
⑥ 解決衝突
這個時候我們開啟衝突對應的檔案test.txt
可以看到內容發生變化了,不同分支的內容使用“====”分隔開,這個時候我們就要判斷需要哪些內容了,假設我們覺得feature分支的內容是正確的,就可以直接在這個檔案中更改,把多餘的符號和字元刪除即可:
這個時候再進行一次add和commit操作:
$ git add .
$ git commit -m "fix conflict"[master d918a21] fix conflict
可以看到衝突被修複了,這裡再重新合并即可:
$ git merge featureAlready up-to-date.
⑦ 刪除多餘分支
由於我們合并了feature分支,這個時候,feature分支已經是多餘的了,我們可以安全的把它刪除。
$ git branch -d featureDeleted branch feature (was 60a91d1).
到這裡,分支的內容也基本掌握了,對於簡單的代碼管理,已經沒有問題了。
實際上,每一個命令,都有其他一些參數和用法,如果要瞭解更多相關的,可以使用help命令,例如查看add命令的具體用法:
$ git --help addLaunching default browser to display HTML ...
會自動開啟瀏覽器並顯示對應命令的協助文檔:
這個就需要自己閱讀了。
感謝支援。
Android開發學習之路-Git的極簡教程?