初識Github

Githubhtml

搞了一下午,大概知道怎麼操做github,記錄一下。
 
 
1.遵循官方文檔 https://help.github.com/articles/set-up-git#platform-linux,一步步配置好環境。用戶名,密碼,密碼緩存等等。
 
 
2.建立一個Repository。(可參見 這裏 
 
 
點擊這裏,建立一個Repository。建立Public的for free,Private的for fee,窮屌絲就算了。
 
固然也能夠用命令行建立,先get一個curl,而後調用git api 去建立。參看這裏
 
OK,若是看了上面的可參見 那裏基本這個過程就知道了,一步一步作行。這裏主要解釋一下一點概念。
 
 
什麼是repo?
 
Git stores all of your project files in a  repository . If you are able to view hidden files on your system, you'll see a subdirectory called ".git" in the project directory where you run  git init . This is where Git stores all of your commits, as well as everything else it needs. In addition to your local, you can also have remote repositories (like GitHub repos). Remote repositories are the same as your local repository, but stored on a different server or computer for easy collaboration, backup, and general awesomeness.
 
與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了。
 
這裏簡單掌握幾條command就行:
 
git add
git commit
git push
git remote
 
說一下git remote,其餘本身git xxx --help去。
git remote有一個option -v,能夠列出當前全部的遠程repository。
 
git remote還有不少的commands,例如git remote add,rm,rename等等。
給個例子:
怎麼理解remote,官方的解釋是
 

A remote is a repository stored on another computer, in this case on GitHub's server. It is standard practice (and also the default when you clone a repository) to give the name originto the remote that points to your main offsite repository (for example, your GitHub repository).jquery

Git supports multiple remotes. This is commonly used when forking a repository.linux

 

 

,其實能夠把它就理解爲遠程倉庫吧,用於存放代碼的地方,就這麼簡單,它的url相似於 https://github.com/octocat/your-repository.git。它是一個本地的概念,只要url是對的,你能夠對他任意的命名,fuck,suck都沒有問題,它的名字能夠做爲標識用,例如往服務器提交代碼時
git push origin master
 
 
3.Fork 一個repo
 
什麼是fork,爲何git搞這些無厘頭的東西,呵呵。
其實這個東西很容易理解,哪裏見過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是
 
 
original的url是
 
 
就這個不一樣了。
 
怎樣fork能夠看 這裏,具體過程就不描述了。
 
 
剛剛fork出來的repo默認有一個remote叫作origin,用git remote -v能夠查看到其url。相似是這樣的
 

https://github.com/your-name/nginx.gitnginx

 
 
而問題來了,若是你本身不管更新或者提交都用的是這個remote,那永遠不會有衝突,呵呵,緣由很簡單,你在閉門造車,本身搞本身的。master的代碼即便更新了,而你更新的是這個remote那確定是更新不到的,因此若是須要(通常都是須要的)更新,那就添加一個remote,命名爲upstream,url多是這樣的,具體根據具體的項目的git url肯定,例如nginx的original repo地址爲
 
git remote add upstream  https://github.com/git-mirror/nginx.git
 
而後利用這個地址就能夠更新了到最新代碼了。
 
說一下更新,更新通常有兩個步驟,先fetch,而後merge,若是想一步到位就直接pull。
fetch的意思就是從remote repo拉代碼到本地repo,若是要有衝突就須要merge代碼了,而pull會自動幫你fetch代碼下來,並在你沒有review過代碼以前,嘗試自動幫你merge代碼到當前的工做目錄中,通常不建議直接pull,而是先fetch,再手動merge。
 
基本的github操做就是這樣,其餘用到再慢慢研究下。
 
 
附部分命令:
 
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了。
 
不斷更新。。。
相關文章
相關標籤/搜索