設置全局用戶名與郵箱:html
$ git config --global user.name "Firstname Lastname" $ git config --global user.email "your_email@your_email.com"
如需將一個文件夾歸入git版本控制,能夠cd進入該文件夾,並執行以下命令:git
$ git init
注意:通過add操做和commit操做後的,均爲已跟蹤文件。github
$ git clone git://github.com/git/hello-world.git hello-world api
$ git add README
使用命令 git rm 從本地git庫中刪除文件,而且在當前工做目錄中被一併刪除:安全
$ git rm (files)
$ git rm -r (directories)
把文件從 Git 倉庫中刪除(亦即從暫存區域移除),但仍然但願保留在當前工做目錄中:
$ git rm --cached readme.txt
要在 Git 中對文件更名,能夠這麼作:服務器
$ git mv file_from file_to
查看修改以後尚未暫存起來的變化內容,不加參數直接輸入 git diff,以下:分佈式
git diff
查看已經暫存起來的文件和上次提交時的快照之間的差別,能夠用 git diff --cached命令:post
git diff --cached
提交更改到本地git庫:fetch
$ git commit -m "xxx"
git commit
加上 -a
選項,Git 就會自動把全部已經跟蹤過的文件暫存起來一併提交,從而跳過 git add
步驟:ui
$ git commit -a –m "xxx"
$ git log
下面的三條命令最終只是產生一個提交,第二個提交命令修正了第一個的提交內容。
$ git commit -m 'initial commit' $ git add forgotten_file $ git commit --amend
取消已經暫存的文件
git reset HEAD filename
取消對文件的修改(還未暫存的文件)
git checkout -- filename
查看當前遠程庫:
$ git remote -v
添加遠程庫:
git remote add 倉庫名 遠程倉庫的地址
能夠用下面的命令從遠程倉庫抓取數據到本地:
$ git fetch [remote-name]
此命令會到遠程倉庫中拉取全部你本地倉庫中尚未的數據。運行完成後,你就能夠在本地訪問該遠程倉庫中的全部分支,將其中某個分支合併到本地,或者只是取出某個分支,一探究竟。
若是是克隆了一個倉庫,此命令會自動將遠程倉庫歸於 origin 名下。因此,git fetch origin
會抓取從你上次克隆以來別人上傳到此遠程倉庫中的全部更新(或是上次 fetch 以來別人提交的更新)。有一點很重要,須要記住,fetch 命令只是將遠端的數據拉到本地倉庫,並不自動合併到當前工做分支,只有當你確實準備好了,才能手工合併。
若是設置了某個分支用於跟蹤某個遠端倉庫的分支,可使用 git pull
命令自動抓取數據下來,而後將遠端分支自動合併到本地倉庫中當前分支。在平常工做中咱們常常這麼用,既快且好。實際上,默認狀況下 git clone
命令本質上就是自動建立了本地的 master 分支用於跟蹤遠程倉庫中的 master 分支(假設遠程倉庫確實有 master 分支)。因此通常咱們運行 git pull
,目的都是要從原始克隆的遠端倉庫中抓取數據後,合併到工做目錄中的當前分支。
小結:git fetch只抓取數據,不會合並數據。git pull不只抓取數據,同時合併數據。
項目進行到一個階段,要同別人分享目前的成果,能夠將本地倉庫中的數據推送到遠程倉庫。實現這個任務的命令很簡單: git push [remote-name] [branch-name]
。若是要把本地的 master 分支推送到origin
服務器上(再次說明下,克隆操做會自動使用默認的 master 和 origin 名字),能夠運行下面的命令:
$ git push origin master // 把本地的 master 分支推送到 服務器上origin
只有在所克隆的服務器上有寫權限,或者同一時刻沒有其餘人在推數據,這條命令纔會如期完成任務。若是在你推數據前,已經有其餘人推送了若干更新,那你的推送操做就會被駁回。你必須先把他們的更新抓取到本地,合併到本身的項目中,而後才能夠再次推送。
咱們能夠經過命令 git remote show [remote-name]
查看某個遠程倉庫的詳細信息,好比要看所克隆的 origin
倉庫,能夠運行:
$ git remote show origin * remote origin URL: git://github.com/schacon/ticgit.git Remote branch merged with 'git pull' while on branch master master Tracked remote branches master ticgit
除了對應的克隆地址外,它還給出了許多額外的信息。它友善地告訴你若是是在 master 分支,就能夠用git pull
命令抓取數據合併到本地。另外還列出了全部處於跟蹤狀態中的遠端分支。
上面的例子很是簡單,而隨着使用 Git 的深刻,git remote show
給出的信息可能會像這樣:
$ git remote show origin * remote origin URL: git@github.com:defunkt/github.git Remote branch merged with 'git pull' while on branch issues issues Remote branch merged with 'git pull' while on branch master master New remote branches (next fetch will store in remotes/origin) caching Stale tracking branches (use 'git remote prune') libwalker walker2 Tracked remote branches acl apiv2 dashboard2 issues master postgres Local branch pushed with 'git push' master:master
它告訴咱們,運行 git push
時缺省推送的分支是什麼(觀察最後兩行)。它還顯示了有哪些遠端分支尚未同步到本地(第7行的 caching
分支),哪些已同步到本地的遠端分支在遠端服務器上已被刪除(譯註:Stale tracking branches
下面的兩個分支),以及運行 git pull
時將自動合併哪些分支(譯註:前5行中列出的 issues
和 master
分支)。
可使用 git remote rename
命令修改某個遠程倉庫在本地的簡稱,好比想把 pb
改爲paul
,能夠這麼運行:
$ git remote rename pb paul
$ git remote
origin
paul
pb/master
分支如今成了
paul/master
。
碰到遠端倉庫服務器遷移,或者原來的克隆鏡像再也不使用,又或者某個參與者再也不貢獻代碼,那麼須要移除對應的遠端倉庫,能夠運行 git remote rm
命令:
$ git remote rm paul
$ git remote
origin
1. 在目標GitHub項目頁面上點擊"Fork",來fork一個已有的repo到本身的github上。
2. clone遠程倉庫(1裏fork到本身gitub上的遠程倉庫)到本地(若是是克隆了一個倉庫,此命令會自動將遠程倉庫歸於 origin 名下):
$ git clone git@github.com:username/Spoon-Knife.git
3. 添加遠程端「upstream」,用於追蹤上游倉儲:
$ cd Spoon-Knife $ git remote add upstream git://github.com/octocat/Spoon-Knife.git
4. 獲取來自上游倉儲(遠程端「upstream」)的更改:
$ git fetch upstream
將上游(遠程端「upstream」)的master分支合併到本地:
$ git merge upstream/master
注意:以上兩步在合適的狀況能夠用 git pull [remoteName] [localBranchName] 命令合併:
$ git pull upstream
例如:git pull origin master 就是將origin這個版本庫的代碼更新到本地的master主支。
5. 提交全部更改到遠程端「origin」的master分支(推送遠程倉庫:$ git push [remoteName] [localBranchName])
$ git push origin master
6. 若是想把本地的某個分支test提交到遠程倉庫,並做爲遠程倉庫的master分支,或者做爲另一個名叫test的分支,以下:
$git push origin test:master // 提交本地test分支做爲遠程的master分支 $git push origin test:test // 提交本地test分支做爲遠程的test分支
1. 查看分支
git branch
2. 建立一個新的分支
$ git branch 分支名
切換分支進行工做
git checkout 分支名
注意:也能夠直接建立一個新的分支並使用其工做:
git checkout -b 分支名
3. 刪除分支
$ git branch -d [name]
-d選項只能刪除已經參與了合併的分支,對於未有合併的分支是沒法刪除的。若是想強制刪除一個分支,可使用-D選項
假設如今本地工做目錄下有兩個分支,一個是主分支master,另外一個是當前工做的主題分支mywork。
那麼當你在主題分支mywork下工做時,想要導入來自上游庫的更新時,使用git rebase
。
$ git rebase upstream/master mywork
或者直接(若是當前branch已是mywork):
$ git rebase upstream/master
注意,這將把當前branch的開發推動到一個新的起點,而不會引入多餘的commits。rebase命令會把你的"mywork"分支裏的每一個提交(commit)取消掉,而且把它們臨時保存爲補丁(patch)(這些補丁放到".git/rebase"目錄中),而後把"mywork"分支更新 到最新的"origin"分支,最後把保存的這些補丁應用到"mywork"分支上。
咱們來看一下用合併(merge)和用rebase所產生的歷史的區別:咱們將origin遠程分支rebase或者merge到mywork分支
原圖:
在rebase的過程當中,也許會出現衝突(conflict)。在這種狀況,Git會中止rebase並會讓你去解決衝突;在解決完衝突後,用"git-add"命令去更新這些內容的索引(index),而後,你無需執行 git-commit,只要執行:
$ git rebase --continue
在任什麼時候候,你能夠用--abort
參數來終止rebase的行動,而且"mywork" 分支會回到rebase開始前的狀態。
$ git rebase --abort
注意:當你在某個branch下工做時,git merge
能夠用來合併來自其餘branch的更新。我的覺得如下這段話總結的很好:
若是merge的branch來自遠程庫,一次merge操做會增長一個額外的commit(「Merge branch 'master' of something」)。若是在一個須要發送Pull Request的主題branch下面進行這種操做,(我我的以爲)這不是一種乾淨的手段。
當你在主線branch(例如master)下進行開發時,
git merge
能夠用來吸取其餘開發branch引入的新特性(包括主項目維護者用來直接merge Pull Requests),很恰當。
在在主題branch下完成須要的工做後,記得要push相應的主題branch到GitHub。
$ git push origin mywork // 若是主題branch是mywork分支,那麼把本地的mywork分支推送到origin服務器上
注意:若是遠程倉庫有mywork分支,則直接推送。若是沒有mywork分支,則會在遠程倉庫建立mywork分支。
一旦你從本身的主題branch(例如mywork分支)推送了一條Pull Request,那麼在這條Pull Request被關閉以前,再次向這個branch裏push代碼,全部的commits都會被自動追加到這個Pull Request後面(不須要再另開Pull Request)。
這個功能尤爲有用,好比你最初提交的Pull Request裏存在某些問題,項目維護者要求你打回去修改;或者要求你給你的新feature添加一條相應的unit test(這種狀況簡直太常見了)。只要追加commits到你的這個主題branch中便可。
若是是已經被項目持有者merge後關閉的Pull Request,你能夠在github頁面的最下方找到一個「Delete this branch」的藍色按鈕。這代表這個主題branch的歷史使命已經完成(mywork的commit已經被合併到主項目中),能夠安全地從遠程庫中刪除了。
在本地庫中亦可刪除這個branch:
$ git branch -d mywork
反之,若是你的主題branch並無被merge就被維護者關掉的話,你還能夠繼續再拿這個branch來開新的Pull Request去騷擾主項目。
1. 如下狀況下能夠直接使用master branch來提交Pull Request:
你只想爲主項目貢獻某一處代碼,貢獻完本身的repo就能夠扔的那種。
你打算爲主項目長期貢獻代碼,並且但願追隨原項目的主線開發,不保留本身的特性。
你打算爲主項目長期貢獻代碼,默認master branch追隨原項目主線,把本身的特性放到別的branch中。
2. 若是想用master branch徹底來作本身的開發。在這種情形下,應該使用主題branch來提交Pull Request。
master branch會從上游庫合併更新,可是這些merge自己的commits顯然不可能做爲返還到上游庫的Pull Request的一部分。同時master branch存在本身的(未被merge或者不想被merge到上游庫的)commits。
3. 鑑於Git的分佈式開發哲學,每個庫都可以看做是一個獨立的項目,顯然是後一種(爲每個新特性創建一個專門的主題branch來向主項目推送Pull Request)的貢獻方式更可取。
2. https://help.github.com/articles/fork-a-repo
3. http://gitbook.liuhui998.com/index.html