與SVN相比,Github主要不一樣的是就是分佈式,什麼意思,簡單的就是說,都知道SVN提交代碼是直接往服務器那裏提的,任何修改都會在SVN server那裏獲得體現,但這裏有一個問題,對於一個開源項目而言,感受這就是悲劇性的,想想,每一次commit代碼前,已經有可能幾百人幾千人在你前面commit了代碼,而後當你看到那一堆紅(conflict)的時候,你和你的小夥伴們都確定驚呆了。固然,做爲一個版本管理工具,Github其實也有這個過程,由於確定須要往一個集中的地方commit,merge等等,可是這個過程前,還有一個過程SVN沒有的,就是往本身本地提交代碼。這個意味着,你開發的東西是在你本身分支上開發的,不會影響到任何的人,並且別人也不會影響到你,當須要和代碼時,只要將本身分支的代碼合併到主線(master)上就ok了。至於本地倉庫是在哪裏,若是看了上面的英文就知道,當git init以後,目錄下就會有一個子目錄叫作.git,這裏就是你的本地倉庫。
基本過程就是,你全部的代碼修改都先提交到本地的倉庫裏,而後若是要合併到master,那麼就須要拉取master的代碼,若是conflict,就解決掉,而後merge,而後commit到本地倉庫,這個時候你就已經從本身的分支返回到master分支上,而後提交(push)到遠程服務器就over了。
其實這個東西很容易理解,哪裏見過fork,寫C的時候見過,幹什麼的,建立(fork)子進程,fork出來的子進程和父進程有什麼關係,就是共享text segment,copy父進程的heap,stack,data's space,可是不一樣的就是pid。好吧,你就這樣理解git的這個fork吧,看來IT的東西都是想通的。fork就是按照original的repo建立了一個你本身的repo,初始fork出來的時候,全部的東西都是同樣的,除了「pid」,你的repo的git url是
而問題來了,若是你本身不管更新或者提交都用的是這個remote,那永遠不會有衝突,呵呵,緣由很簡單,你在閉門造車,本身搞本身的。master的代碼即便更新了,而你更新的是這個remote那確定是更新不到的,因此若是須要(通常都是須要的)更新,那就添加一個remote,命名爲upstream,url多是這樣的,具體根據具體的項目的git url肯定,例如nginx的original repo地址爲
fetch的意思就是從remote repo拉代碼到本地repo,若是要有衝突就須要merge代碼了,而pull會自動幫你fetch代碼下來,並在你沒有review過代碼以前,嘗試自動幫你merge代碼到當前的工做目錄中,通常不建議直接pull,而是先fetch,再手動merge。
Git經常使用操做命令收集:
1) 遠程倉庫相關命令
檢出倉庫:$ git clone git://github.com/jquery/jquery.git
查看遠程倉庫:$ git remote -v
添加遠程倉庫:$ git remote add [name] [url]
刪除遠程倉庫:$ git remote rm [name]
修改遠程倉庫:$ git remote set-url --push [name] [newUrl]
拉取遠程倉庫:$ git pull [remoteName] [localBranchName]
推送遠程倉庫:$ git push [remoteName] [localBranchName]
* 若是想把本地的某個分支test提交到遠程倉庫,並做爲遠程倉庫的master分支,或者做爲另一個名叫test的分支,以下:
$ git push origin test:master // 提交本地test分支做爲遠程的master分支
$ git push origin test:test // 提交本地test分支做爲遠程的test分支
2)分支(branch)操做相關命令
查看本地分支:$ git branch
查看遠程分支:$ git branch -r (若是仍是看不到就先 git fetch origin 先)
建立本地分支:$ git branch [name] ----注意新分支建立後不會自動切換爲當前分支
切換分支:$ git checkout [name]
建立新分支並當即切換到新分支:$ git checkout -b [name]
直接檢出遠程分支:$ git checkout -b [name] [remoteName] (如:git checkout -b myNewBranch origin/dragon)
刪除分支:$ git branch -d [name] ---- -d選項只能刪除已經參與了合併的分支,對於未有合併的分支是沒法刪除的。若是想強制刪除一個分支,可使用-D選項
合併分支:$ git merge [name] ----將名稱爲[name]的分支與當前分支合併
合併最後的2個提交:$ git rebase -i HEAD~2 ---- 數字2按需修改便可(若是需提交到遠端$ git push -f origin master 慎用!)
建立遠程分支(本地分支push到遠程):$ git push origin [name]
刪除遠程分支:$ git push origin :heads/[name] 或 $ git push origin :[name]
* 建立空的分支:(執行命令以前記得先提交你當前分支的修改,不然會被強制刪乾淨沒得後悔)
$ git symbolic-ref HEAD refs/heads/[name]
$ rm .git/index
$ git clean -fdx
3)版本(tag)操做相關命令
查看版本:$ git tag
建立版本:$ git tag [name]
刪除版本:$ git tag -d [name]
查看遠程版本:$ git tag -r
建立遠程版本(本地版本push到遠程):$ git push origin [name]
刪除遠程版本:$ git push origin :refs/tags/[name]
合併遠程倉庫的tag到本地:$ git pull origin --tags
上傳本地tag到遠程倉庫:$ git push origin --tags
建立帶註釋的tag:$ git tag -a [name] -m 'yourMessage'
4) 子模塊(submodule)相關操做命令
添加子模塊:$ git submodule add [url] [path]
如:$ git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs
初始化子模塊:$ git submodule init ----只在首次檢出倉庫時運行一次就行
更新子模塊:$ git submodule update ----每次更新或切換分支後都須要運行一下
刪除子模塊:(分4步走哦)
1) $ git rm --cached [path]
2) 編輯「.gitmodules」文件,將子模塊的相關配置節點刪除掉
3) 編輯「 .git/config」文件,將子模塊的相關配置節點刪除掉
4) 手動刪除子模塊殘留的目錄
5)忽略一些文件、文件夾不提交
在倉庫根目錄下建立名稱爲「.gitignore」的文件,寫入不須要的文件夾名或文件,每一個元素佔一行便可,如
target
bin
*.db
6)後悔藥
刪除當前倉庫內未受版本管理的文件:$ git clean -f
恢復倉庫到上一次的提交狀態:$ git reset --hard
回退全部內容到上一個版本:$ git reset HEAD^
回退a.py這個文件的版本到上一個版本:$ git reset HEAD^ a.py
回退到某個版本:$ git reset 057d
將本地的狀態回退到和遠程的同樣:$ git reset –hard origin/master
向前回退到第3個版本:$ git reset –soft HEAD~3
7)Git一鍵推送多個遠程倉庫
編輯本地倉庫的.git/config文件:
[remote "all"]
url = git@github.com:dragon/test.git
url = git@gitcafe.com:dragon/test.git
這樣,使用git push all便可一鍵Push到多個遠程倉庫中。
----------------------------------另外---------------------------------------
1. 從工程刪除文件後,想刪除的文件從倉庫中刪除,不要直接
git rm -r .
這會將當前目錄下全部的文件刪除,而是要
git rm -r --cache .
若是真的不慎執行了第一步,那隻能
git reset --hard HEAD
回退到最後一次commit了。
不斷更新。。。