Git是一個代碼版本管理工具,也就是允許我們的一個項目擁有多個版本,這樣我們可以隨心所欲的修改我們的代碼,如果出現問題,可以回退到某一個提交點。如果你還在用一堆堆注釋來更新你的代碼,那么可以嘗試一下Git了,畢竟,它不難。
常用的Git操作其實不多,明白這個過程就行了。
※ 關於Git的安裝畢竟簡單,所以這里就不說了。沒錢買mac,所以......
簡單的流程:初始化->修改文件->添加至暫存區->提交修改->回退
安裝完畢后,需要先設置用戶名和郵箱,在桌面中右鍵選擇Git Bash Here,會打開一個小黑窗如圖:
輸入如下命令進行設置即可:
$ git config --global user.name "XXX"
$ git config --global user.email "xxx@yyy.com"
① 初始化:git init
先進入工程的目錄,這里的Demo是在D:\GitDemoProject目錄下,項目暫時為空,也可以用Studio直接建一個HelloWorld。
在項目根目錄右鍵,選擇Git Bash Here打開命令窗口。
我們的所有命令都是在這個窗口輸入。
接着輸入:git init 然后回車,會有如下提示:
$ git init Initialized empty Git repository in D:/GitDemoProject/.git/
這樣我們的初始化就完成了,項目下會多出一個.git文件夾。
② 創建一個文件
如果熟悉Linux,可以直接用這個Bash來touch一個文件,我們這里直接右鍵創建一個test.txt文件並輸入:Hello Git
這里介紹一個命令:git status,在Bash輸入會得到如下提示:
$ git status On branch master Initial commit Untracked files: (use "git add <file>..." to include in what will be committed) test.txt nothing added to commit but untracked files present (use "git add" to track)
最后一行提示我們,沒有文件添加至跟蹤狀態,但是發現了新建的未跟蹤文件。
③ 添加至暫存區
上面新建的文件就是在暫存區之外的,這些文件不會被Git控制,也就是目前我們的Git實際上還沒有保存任何關於這個文件的數據。我們需要讓Git知道,這個文件是需要被標記的,如果它有任何修改,告訴我。
添加至暫存區的命令:git add 文件名
$ git add test.txt
這個時候再查看一下狀態:
$ git status On branch master Initial commit Changes 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 status
On branch master
nothing to commit, working directory clean
提示我們沒有東西可以提交,這個時候只要被跟蹤的文件發生改變,這個狀態才會發生改變。
我們來試一下!
我們打開test.txt文件並修改一下它的內容為:Hello Android
接着重新查看狀態:
$ git status On branch master Changes 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.txt no changes added to commit (use "git add" and/or "git commit -a")
現在我們被告知,有文件發生了改變(modified),需要重新添加至暫存區才能提交。
但是先不要着急,我們再新建一個文件名為readme.txt,不需要添加任何內容。
這個時候再執行一次git status查看狀態:
$ git status On branch master Changes 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.txt Untracked files: (use "git add <file>..." to include in what will be committed) readme.txt no changes added to commit (use "git add" and/or "git commit -a")
可以看到,新建的文件狀態為Untracked,這個時候,我們需要先把這兩個文件添加至暫存區,才可以進行提交,直接將這兩個文件添加至暫存區的命令是git add .
$ git add .
這個命令是把目錄下所有的文件都添加至暫存區。
接着查看狀態:
$ git status On branch master Changes 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 log commit ea017b63e4043e7750efd2eb39f39d5668b69ec4 Author: Fndroid <1603808949@qq.com> Date: Fri Aug 12 21:25:03 2016 +0800 create readme.txt and modified the test.txt commit 5b59dc7a5aa1338b06f107dea6492842a5c3286d Author: Fndroid <1603808949@qq.com> Date: Fri Aug 12 21:02:30 2016 +0800 first commit
可以看到,我們提交了兩次,每次的commit后面有一串長長的時間點哈希值,我們可以根據這個哈希值回退到那一次的提交點:
$ git reset --hard 5b59dc7a5aa1338b06f107dea6492842a5c3286d
HEAD 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 feature Switched to a new branch 'feature'
這里創建了一個叫做feature的新分支,git自動幫我們切換到這個分支上了。
② 添加新功能
我們在test.txt文件中添加幾句話(代碼),這個隨意吧,例如我的:
③ add和commit
這里在新的分支中,和master分支的操作也是一樣的,我們提交一下這次更新,但是這次,我們可以謹慎一些。
在add之前,我們可通過git diff命令查看當前做的改變:
$ git diff test.txt diff --git a/test.txt b/test.txt index 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 master Switched 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 feature Auto-merging test.txt CONFLICT (content): Merge conflict in test.txt Automatic 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 feature Already up-to-date.
⑦ 刪除多余分支
由於我們合並了feature分支,這個時候,feature分支已經是多余的了,我們可以安全的把它刪除。
$ git branch -d feature
Deleted branch feature (was 60a91d1).
到這里,分支的內容也基本掌握了,對於簡單的代碼管理,已經沒有問題了。
實際上,每一個命令,都有其他一些參數和用法,如果要了解更多相關的,可以使用help命令,例如查看add命令的具體用法:
$ git --help add
Launching default browser to display HTML ...
會自動打開瀏覽器並顯示對應命令的幫助文檔:
這個就需要自己閱讀了。
感謝支持。