Git使用說明
1. 創建git項目
使用git的第一步是創建一個git項目。這一步需要在github網站上完成,在網站中創建一個全新的repository。如果我們之前在本地完成一個項目,想要將該項目發布到github,則此時新建的repository不要有任何文件,即使是README這樣的文件,然后我們可以按照如下流程完成創建:
a) cd localproject
b) git init
c) git add * //將目錄下所有的文件添加到git項目中;
d) git commit –m “add a message”;
e) git remote add origin https://github.com/username/***.git
f) git push origin master.
上述步驟完成之后,我們本地的項目就上傳到github下指定的repository下。在一開始我們提到,不要在創建repository時添加任何文件,否則我們不能正常提交,因為github上的初始版本和本地版本不一致。
如果我們是要對上述項目做二次開發,則我們可以從github網站上下載該項目,然后本地修改。流程如下:
a) git clone https://github.com/username/***.git newdirectory
b) cd newdirectory
c) modify some files
d) git commit –a “modify theproject”// shorthand for “add and commit”
e) git push origin master
流程第一步是從github上clone一個項目到本地,然后我們做修改,最后再提交。
上述流程就是很多博客中說的1分鐘學會github托管。但是只會上面的操作不足以應對平時的各種需求,我們還需要進一步了解git。
2. git的狀態轉換
針對本地的一個項目,如果不是從github上下載,則所有文件一開始都屬于untracked狀態,否則都屬于tracked狀態。屬于 untracked狀態的文件,如果我們不將其添加到git中,任意的修改都不會影響git狀態。所以如果是我們想要保存到git中的文件,我們首先要將其添加到git中,命令就是git add。添加之后的文件就屬于tracked狀態。tracked狀態本身又有三個子狀態:modified,staged和committed。一個未經修改的文件被添加到git中之后將會是staged狀態,此時我們運行git commit將會使這個文件變為committed狀態。變為committed狀態之后,git就為該項目生成了一個snapshot,我們就可以將其 push到github中。一個被commit的文件如果被修改,其狀態又會變為modified狀態,等待新的add和commit。如果我們想將一個文件從項目中除名,可以采用git rm命令。不加--cached參數的rm命令將會物理刪除文件,添加該選項將會把文件從git項目中刪除,但是不物理刪除。文件的狀態也變為 untracked狀態。git中文件狀態轉換關系如下圖:
圖1 git文件的狀態轉換
3. git文件過濾
在項目開發過程中,會存在很多臨時文件,比如備份文件~、和對象文件.o等等。這些文件無需添加到git中。我們可以在工程根目錄下設置一個.gitignore文件指明無需添加的文件。該文件內容很簡單:
*.o #表示忽略目標文件
*~ #表示忽略備份文件
.* #表示忽略隱藏文件
通過設定該文件,當我們用git add 添加一個目錄時,會自動忽略掉符合上面規則的所有文件。
4. 遠程協作
當我們采用git clone從遠程下載一個項目時,git會為我們這個項目自動添加一個遠程repository,名為origin。我們還可以通過命令:git remote add [shortname] [url]來添加新的repository作為我們下載上傳的目標。下載時我們可以采用git clone/fetch/pull來完成。上傳時采用git push [remote-name] [branch-name]完成。
5. 回滾
回滾操作可以讓我們回歸到之前的版本,取消錯誤的commit。主要有兩種方式:revert和reset。git revert 命令會通過一個新的commit 來使倉庫倒退一個commit。執行git revert cc3a9d3a5820b16bca3c1761efb5885b90371e94被回滾到hash值所在的commit。git reset是指將當前head的內容重置,不會留任何痕跡。執行git reset d5bb1731bf32fb62dc7eedc573da41fa31e27151 --hard 會直接回到hash值那時的commit狀態,之后發生了什么都不會出現在commit log里。