第三課 Git 工做流程
與遠程倉庫同步,修改,載入(stage)和提交項目
如今你已經有一個git本地倉庫,一切都配置完畢。而後該怎麼辦?
通常來講,跟其餘的源碼控制系統的工做流程沒什麼兩樣,惟一一個區別就是載入(stage)的過程。整個工做流程大體是這樣(流程1):
與遠程倉庫同步
修改文件
查看變動
載入變動
提交載入的變動
重複
上傳
這是最複雜的狀況,若是你不與別人合做開發的話,就不須要上傳到倉庫中去(流程2):
* 修改文件
* 提交變動
* 重複
簡單吧。要記得,git是分佈式的,因此若是不是合做項目的話,實際上不須要提交到一個公共的共享服務器上--你能夠像使用RCS同樣,只用來追蹤本地文件變動。下面,讓咱們先來看個簡單的示例,緊接着再來看用git協做開發的實例。
若是你想跟着作這個例子,請克隆這個項目:
$ git clone git://github.com/schacon/simplegit
例子開始,按照流程2,咱們首先要修改README文件,將本身添加到項目做者中去。因此咱們修改這個文件。而後咱們但願提交這個變動,因此咱們運行'git commit -a' 命令。 -a 的意思是告訴git先將變動了的文件先載入(stage),而後提交-咱們後面會經過'staging area'命令實現,可是如今運行 'git commit -a' 命令,效果跟在SVN中使用'commit'命令同樣。
執行完以後,一個提交信息的提示會出如今編輯器中(這裏$EDITOR環境變量或'core.editor'這兩個git配置變量的默認值都是vim)相似下面這樣的內容:
_
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch main
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README
#
~
~
".git/COMMIT_EDITMSG" 9L, 253C
輸入一些提交的信息,譬如"added myself to the README as an author"而後退出。
vim操做提示:
按下I,o,a進入編輯模式,編輯完畢按Esc,輸入:wq保存退出。
而後會看到這樣的提示:
[master]: created 5896d4d: "added myself to the README as an author"
1 files changed, 2 insertions(+), 1 deletions(-)
顯示咱們剛剛輸入的提交信息,而且有一組關於此次提交項目中文件變動的統計數字。同時還給咱們一個提交的校驗和,'5896d4d',這個校驗和能夠用來往後確切的查看此次提交的細節。
這就是簡單用例。修改文件,'git commit -a',重複
如今,咱們來介紹一個複雜點的實例,此次咱們使用遠程倉庫,將項目上傳上去,從而跟其餘的開發者一塊兒協同工做。同時,咱們會介紹staging area。
若是你會從遠程倉庫中克隆項目,那麼與遠程倉庫項目同步也是至關簡單的--只須要執行'git pull'.若是是遠程倉庫項目沒有變化,也就是說其餘的開發者沒有對項目進行變動,會顯示這樣的信息:
Already up-to-date.
相反,執行這條命令以後會將你上次同步以後遠程倉庫中的變動同步到本地項目中,而且git會合並這些新的變動:
$ git pull
Updating c264051..b04dc3d
Fast forward
lib/simplegit.rb | 4 ++++
1 files changed, 4 insertions(+), 0 deletions(-)
例子開始,從新克隆遠程倉庫中的項目,修改README文件和lib/simplegit.rb文件(不要執行git commit -a)。如今你可使用'git status'命令來查看工做目錄發生了什麼變動:
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: README
# modified: lib/simplegit.rb
#
no changes added to commit (use "git add" and/or "git commit -a")
咱們看到,有兩個文件是在"changed but not updated"段落中出現 ,這意味着這兩個文件尚未載入(unstaged). 若是如今咱們提交,什麼也不會發生。也就是說文件必須先載入(stage),而後才能提交。
因此,咱們先來載入(stage) 文件,git中使用'git add'命令不只能夠開始追逐文件並且能夠對他們載入stage變動。因此讓咱們載入(stage) README文件的變動,而後再來查看一下狀態。
$ git add README
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: README
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
#
modified: lib/simplegit.rb
如今'lib/simplegit.rb'文件仍是未載入(unstaged), 可是README文件如今已經到了'changes to be committed'段落中-它幾經載入(stage)了。如今若是咱們運行提交命令(不要-a,這個會自動stage全部的東西),只有這個文件會被提交-而simplegit.rb依然是unstaged。這時,咱們使用-m選項來執行'git commit',這樣後面跟上字符串表示此次提交的信息。
$ git commit -m 'updated the README'
[master]: created 14bb3c6: "updated the README"
1 files changed, 1 insertions(+), 2 deletions(-)
若是如今再執行'git status',咱們會看到stage以後的文件如今已經提交了,只剩下了unstaged的'simplegit.rb'文件。
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: lib/simplegit.rb
#
如今咱們能夠stage而且提交這個文件:
$ git commit -a -m 'added a staging command to the library'
[master]: created bbaee85: "added a staging command to the library"
1 files changed, 4 insertions(+), 0 deletions(-)
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
#
nothing to commit (working directory clean)
如今咱們已經將兩次提交的變動都搞定了,並且加了提交信息,可讓咱們的合做夥伴很容易理解咱們作的變動。通過最後一次提交,咱們看到'git status'執行以後顯示咱們的工做目錄clean了(同時提示咱們如今的分枝上有兩個提交尚未上傳)
因此,如今咱們將這些變動上傳到服務器端與咱們的合做夥伴分享,前提是咱們有上傳的權限,(若是沒有上傳的權限,咱們能夠在網絡上建立一個本身的git倉庫,將其上傳),而後讓朋友下載。
運行'git push'會將咱們的變動上傳到服務器。
$ git push
Counting objects: 11, done.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (7/7), 744 bytes, done.
Total 7 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
b04dc3d..bbaee85 master -> master
到目前爲止,咱們看到了新數據都已經上傳完畢,服務器上的主分支也已經更新了。如今咱們能夠複習一下這整個的過程,讓咱們能夠更加熟練的將git應用到咱們的項目中去。