git用法簡介


昨天在github上瘋狂找vim的配置文件,固然少不了須要用到git,正好也就把它系統的學習一下吧,以前也瞭解過一些,但其實不是很理解。此次以爲相對仍是很透徹了。用到了一些進階功能。linux

首先,事實上可能不少人仍是把git當作svn之類的工具來用的,說的low一點至關於網盤,把你寫好的代碼放在服務器上作一個備份。可是,必須明白的是Linus大神寫這個神奇的東西可不只僅是爲了這個,它的設計理念固然和svn不同。svn我也不熟,就不瞎說的,只提一點,svn是集中式管理,就是全部人都要把代碼都提交到中心服務器上才能夠,而git是「分佈式版本控制系統」,其實是不須要中心服務器的,在本地就徹底能夠很好的工做,但因爲github的出現,使得咱們以爲git好像必需要有服務器同樣。git

閒言少敘,進入正題。(本文的操做基於Linux)github

基本操做

  1. git config --global user.name "lovelock"
    git config --global user.email "example@gmail.com"
    

    上面這兩條命令會在你的用戶根目錄也就是$HOME下創建一個.gitconfig文件,大體形式以下:shell

     [user]
         name = lovelock
         email = example@gmail.com
    

    固然這其實也是github的要求,其餘的代碼託管我沒有用過,但料想用戶名和郵箱應該都是須要的。vim

  2. git clone git@github.com:lovelock/linuxdots.git
    

    這條命令是把我在github分享的一個linux配置文件克隆到本地。而後就能夠進去進行各類修改,本身拿來用或者經過pull request提交到原始分支。安全

  3. 下面說一下建立新repo的方法。這個方法其實github的help頁面已經說的很詳細了,但我以爲非常很多人會遇到問題,看看stackoverflow上關於這些東西的問答就知道了。服務器

    • github上建立一個repo,這裏沒有什麼說的。
    • 創建一個本地目錄,如mkdir linuxdots,這個目錄的名字沒有必要和服務器端的相同。但一般會取一個容易區分的名字對吧。
    • cd linuxdots 進入linuxdots目錄
    • git init 會在當前目錄下建立一個.git目錄,這個用來存放git處理咱們的代碼的方法和差別文件等等。
    • 這時能夠在這個目錄下建立幾個文件,好比README.md,你可能會不知道(我最開始知道git的時候但是真不知道)這個.md的文件是什麼,它叫markdown,是一種用比HTML的標記要更少更簡單的標記來實現格式化文本的方法,如今我就在一個很舒服的markdown parser馬克飛象中編輯這篇文章。
    • git add .這是一般的作法,意思是把當前目錄下的全部文件變成staged for commit狀態,但當你的代碼複雜後,不免出現回刪除文件或文件夾的狀況,這時單純用這個命令就不行了,由於它的完整用法實際上是
      gti add <file>...
      也就是說它的做用是把尚未在stage上文件加進來,而沒有把已經在stage上而後被刪除的文件變成unstaged狀態的功能。須要git add --all來完成這件事。這時你當前目錄的全部文件都已經「蓄勢待發」了,下一步就是commit了。
    • git commit -m 'some message' git強制須要在commit時寫一條信息,記錄此次commit作了什麼。
    • git remote add origin git@github.com:lovelock/linuxdots.git,建立一個名爲origin的遠程repo,而由於指定了剛剛建立的repo,這個origin就像指針同樣指向了指定的repo
    • git push origin master是把本地的master分支上傳到github上。至此至關於完成了建立一個「軟件倉儲的過程。
  4. 這裏提一下上面幾個步驟中會遇到的錯誤。
    • 若是你按照上面提到的github的官方幫助文檔中的說法(用https協議)你可能會遇到每一次提交都讓你輸入用戶名和密碼的問題,雖然這樣看起來事很安全,但很煩不是嗎?即便設置了密碼失效時間,但仍是須要常常輸入啊。因此更乾淨利落的作法是用ssh協議。
    • 你可能聽別人或者我說用ssh協議比較方便,而後發現各類fatal error,說你沒有權限什麼的。理解這個問題又牽涉到ssh的密鑰的知識。這裏簡單提一點,你須要作的就是ssh-keygen,想簡單就一路回車,在你的根目錄下生成一個.ssh隱藏文件夾,這裏面會有兩個文件,id_rsa id_rsa.pub,你這時須要作的是把id_rsa.pub的內容複製到你的github.com帳戶裏受信任的key列表裏。這樣你的本地機器和遠程服務器就創建了信任關係,不須要每次都輸入用戶名和密碼了,但要注意每次你克隆或其餘操做時,相應的要用形如git clone git@github.com:lovelock/linuxdots.git這樣的命令,而不是git clone https://github.com/lovelock/linuxdots.git
    • 還有一點須要提,git從2.0改變了git push操做的默認行爲。1.x版本的默認操做是matching,也就是若是執行git push而沒有指定分支,它將push全部本地的分支到遠程倉儲中對應匹配的分支。而新的行爲是simple,這樣它只有當前分支會被push到你使用git pull獲取的代碼。若是你在用1.x版本的git,也很簡單,用git config --global push.default simple便可。這句又會在$HOME/.gitconfig中添加一行。

進階操做

分支操做

爲了加深我本身的理解,我在本地新建了一個倉儲用來測試。舉個例子,你的master分支下已經有了一些文件,這時你想加入一個新的功能,但怕這個新功能的引入會對master分支產生很差的影響,有了git你須要作的就是git checkout -b aNewBranchName,這至關於兩步操做git branch aNewBranchNamegit checkout aNewBranchName,也就是新建一個分支,而後進入這個分支。若是你的shell支持的話,這時shell會有變化的提示。而後你能夠在這裏進行修改了。這裏的操做不會影響master分支。而後你作了足夠的測試以後,認爲能夠合併到主分支了,那麼首先切換到master分支,而後git merge aNewBranchName,就把後者合併到了主分支中。注意,若是你在原來文件的同一行進行了修改,那麼合併時就會出錯,由於git不知道你想用哪一個覆蓋哪一個,這時就須要你手動去改了,這一點作得很好,它不替你作決定,就像一直提醒咱們不要用rm -rf這個命令同樣。詳細用法見Git分支-分支的新建與合併markdown

子模塊

常常會看到某些項目中引用別人的項目,那個項目的名稱會是灰色的,而且後面帶一個@,這就是最簡單的子模塊(submodule)了。你clone這個項目時它不會把相應的文件都下載下來,而是隻有子模塊以外的東西,須要進入項目主目錄,而後執行`git submodule init && git submodule update`把那些灰色的文件所有下載下來。還有一個問題,是若是你本身也想用別人的項目做爲子模塊,應該怎麼辦呢?我開始覺得根本不用設置,由於每一個項目中都有.git目錄,難道不會自動識別?真不會。只能在項目主目錄下新建一個.gitmodules文件,在裏面用和.gitconfig同樣的格式記錄下。以下ssh

[linuxdots]
    path = .vim/linuxdots
    url = https://github.com/lovelock/linuxdots.git

 須要強調的是,這個項目下載完成以後的名字是由你決定的而不是由項目的原做者,說這話是由於有path這個選項,好比,須要用到oh-my-zsh,那麼我把path指定成.zsh,由於我在.zshrc中把$ZSH設置爲.zsh,這樣下載完成以後它就自動重命名了。分佈式

 

更深刻的我本身目前還用不到,看了也是忘記,用到再記下來吧。

相關文章
相關標籤/搜索