git和Github
概念
git --- 版本控制工具(命令)。
工具介紹官方網站:http://git-scm.com
工具下載地址:http://git-scm.com/download/
git是一個開源的分布式版本控制系統,用以有效、高速的處理從很小到非常大的項目版本管理。git是個工具,在linux里面也就類似gcc這樣的工具一樣,是一個shell命令。git是Linus Torvalds為了幫助管理Linux內核開發而開發的一個開放源碼的版本控制軟件。Torvalds開始着手開發git是為了作為一種過渡方案來替代BitKeeper,后者之前一直是Linux內核開發人員在全球使用的主要源代碼工具。開放源碼社區中的有些人覺得BitKeeper的許可證並不適合開放源碼社區的工作,因此 Torvalds決定着手研究許可證更為靈活的版本控制系統。盡管最初git的開發是為了輔助Linux內核開發的過程,但是我們已經發現在很多其他自由軟件項目中也使用了git。例如:很多Freedesktop的項目也遷移到了git上。
Github --- 一個平台(網站)。
Github官方網站:https://github.com/
提供給用戶創建git倉儲空間,保存(托管)用戶的一些數據文檔或者代碼等。
Github目前擁有140多萬開發者用戶。隨着越來越多的應用程序轉移到了雲上,Github已經成為了管理軟件開發以及發現已有代碼的首選方法。GitHub可以托管各種git庫,並提供一個web界面,但與其它像SourceForge或Google Code這樣的平台不同,GitHub的獨特賣點在於從另外一個項目進行分支的簡易性。為一個項目貢獻代碼非常簡單:首先點擊項目站點的“fork”的按鈕,然后將代碼檢出並將修改加入到剛才分出的代碼庫中,最后通過內建的“pull request”機制向項目負責人申請代碼合並。已經有人將GitHub稱為代碼玩家的MySpace。
Github公有倉庫免費,私有倉庫要收費的!
git和Github的關系
指定了remote鏈接和用戶信息(git靠用戶名+郵箱識別用戶)之后,git可以幫你將提交過到你本地分支的代碼push到遠程的git倉庫(任意提供了git托管服務的服務器上都可以,包括你自己建一個服務器 或者 GitHub/BitBucket等網站提供的服務器)或者將遠程倉庫的代碼 fetch 到本地。
Github只是一個提供存儲空間的服務器,用來存儲git倉庫。當然現在Github已經由一個存放git倉庫的網站空間發展為了一個開源社區(不只具有存儲git倉庫的功能了),你可以參與別人的開源項目,也可以讓別人參與你的開源項目。
Github類似產品
有很多Github類似的平台,用於提供git倉庫的存儲。
BitBucket
公有、私有倉庫都免費。
GitCafe
GitLab
GitLab可以下載軟件GitLab CE 或者 直接在在線平台上操作。
Git@OSC
Git@OSC是開源中國社區團隊基於開源項目GitLab開發的在線代碼托管平台。
網址:http://git.oschina.net/
CSDN代碼托管平台
CSDN CODE系統搭建於阿里雲IaaS平台之上,向個人開發者、IT團隊及企業提供代碼托管、在線協作、社交編程、項目管理等服務。
網址:https://code.csdn.net
git和CVS、SVN的區別
git是分布式版本控制系統,代碼提交是在本地的(如此速度就快),當然生成補丁(patch)然后push到遠程服務器上是需要聯網的。
CVS、SVN是集中式版本控制系統,代碼提交都是提交到遠程服務器上,是需要一直聯網的(如此速度就慢)(這里的一直聯網不是說你寫代碼的時候要聯網,而是說你提交代碼的時候必須聯網;但是git不同,git提交代碼是本地的不需要聯網,生成patch后push patch才需要聯網,相當於svn的遠程的集中服務器對於git來說,這個集中的遠程服務器就在本地)。這個地方比較難理解。
CVS、SVN這樣的集中式版本控制系統,它的完整代碼倉庫(代碼倉庫不僅僅只包含了代碼,還包含各個歷史版本的信息等)在中心服務器上,一旦這個中心服務器掛了,也就是完整的代碼倉庫掛了,雖然你本地可能之前有從中心服務器上取得過代碼,但是那些歷史版本信息都沒有了,而且你也無法再提交代碼。
git不同,git沒有中心服務器的概念,每一個git客戶端(git節點)都含有一個完整的代碼倉庫(前提是你之前從遠程git倉庫fetch過代碼),所以那些歷史版本信息都在你本機上,假如哪一個git節點掛掉了,隨意從其他git節點clone一個代碼倉庫過來就ok了, 那些原來的代碼、版本信息之類的都還是完整的(當然如果你在這個掛掉的git節點上新增的代碼是沒有掉了的)。
綜上,git的每一個節點(第一次從遠程git倉庫取得代碼后,該git節點就是一個完整的代碼倉庫)相當於SVN的中心服務器,都包含完整的代碼倉庫。
git的工作原理
架構圖
功能特性
git的功能特性:
從一般開發者的角度來看,git有以下功能:
1、從遠程服務器上克隆clone完整的git倉庫(包括代碼和版本信息)到自己的機器(單機)上。
2、在自己的機器上根據不同的開發目的,創建分支,修改代碼。
3、在單機上自己創建的分支上提交代碼。
4、在單機上合並分支。
5、把遠程服務器上最新版的代碼fetch下來,然后跟自己的主分支合並。
6、生成補丁(patch),把補丁發送給主開發者。
7、看主開發者的反饋,如果主開發者發現兩個一般開發者之間有沖突(他們之間可以合作解決的沖突),就會要求他們先解決沖突,然后再由其中一個人提交。如果主開發者可以自己解決,或者沒有沖突,就通過。
8、一般開發者之間解決沖突的方法,開發者之間可以使用pull命令解決沖突,解決完沖突之后再向主開發者提交補丁。
從主開發者的角度看,git有以下功能:
1、查看郵件或者通過其它方式查看一般開發者的提交狀態。
2、打上補丁,解決沖突(可以自己解決,也可以要求開發者之間解決以后再重新提交,如果是開源項目,還要決定哪些補丁有用,哪些不用)。
3、向遠程服務器(公共的)提交結果,然后通知所有開發人員。
優點:
1、適合分布式開發,強調個體。
2、遠程服務器(公共的)壓力和數據量都不會太大。
3、速度快、靈活。
4、任意兩個開發者之間可以很容易的解決沖突。
5、離線工作。(當然提交遠程服務器或者從遠程服務器fetch代碼是要聯網的)。
git中的一些概念和原理
工作區
Working Directory
電腦上能看到的目錄即工作目錄,比如:/e/git_repo/
版本庫
Repository
工作區有一個隱藏目錄.git,這個不算工作區,而是git的版本庫。
git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD。構造參見上面的結構圖。
暫存區
Stage
暫存區就是版本庫中的一個區域,具體參見上面的結構圖。
工作區、版本庫、暫存區之間的關系
git工作的流程就是:
第1步,使用git add把文件從工作區添加到版本庫中的暫存區,git add命令可以多次用;
第2步,使用git commit提交代碼,就是把暫存區的所有內容提交到當前分支。
綜上,需要提交的文件修改通通放到暫存區(可能有多次的git add),然后,一次性提交暫存區的所有修改到當前分支(git commit)。
分支
分支(branch)有什么用呢?假設你准備開發一個新功能,但是需要兩周才能完成,第一周你寫了50%的代碼,如果立刻提交,由於代碼還沒寫完,不完整的代碼庫會導致別人不能干活了。如果等代碼全部寫完再一次提交,又存在丟失每天進度的巨大風險。
現在有了分支,就不用怕了。你創建了一個屬於你自己的分支,別人看不到,還繼續在原來的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到開發完畢后,再一次性合並到原來的分支上,這樣,既安全,又不影響別人工作。
分支內部原理
1、如下圖所示,版本的每一次提交(commit),git都將它們根據提交的時間點串聯成一條線。剛開始是只有一條時間線,即master分支,HEAD指向的是當前分支的當前版本。
2、當創建了新分支,比如dev分支(通過命令git branch dev完成),git新建一個指針dev,dev=master,dev指向master指向的版本,然后切換到dev分支(通過命令git checkout dev完成),把HEAD指針指向dev,如下圖。
3、在dev分支上編碼開發時,都是在dev上進行指針移動,比如在dev分支上commit一次,dev指針往前移動一步,但是master指針沒有變,如下:
4、當我們完成了dev分支上的工作,要進行分支合並,把dev分支的內容合並到master分支上(通過首先切換到master分支,git branch master,然后合並git merge dev命令完成)。其內部的原理,其實就是先把HEAD指針指向master,再把master指針指向現在的dev指針指向的內容。如下圖。
5、當合並分支的時候出現沖突(confict),比如在dev分支上commit了一個文件file1,同時在master分支上也提交了該文件file1,修改的地方不同(比如都修改了同一個語句),那么合並的時候就有可能出現沖突,如下圖所示。
這時候執行git merge dev命令,git會默認執行合並,但是要手動解決下沖突,然后在master上git add並且git commit,現在git分支的結構如下圖。
可以使用如下命令查看分支合並情況。
- git log --graph --pretty=oneline --abbrev-commit
6、合並完成后,就可以刪除掉dev分支(通過git branch -d dev命令完成)。
如此,就是分支開發的原理。其好處也是顯而易見的。
分支策略
如何合適地使用分支?
在實際開發中,我們應該按照幾個基本原則進行分支管理:
1、master分支應該是非常穩定的,也就是僅用來發布新版本,平時不要在master分支上編碼開發。master分支應該與遠程倉庫保持同步;
2、平常編碼開發都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1.0版本發布時,再把dev分支合並到master上,在master分支發布1.0版本;dev分支也應該與遠程保持同步;(git push/git pull也要解決沖突)
3、你和團隊成員每個人都在本地的dev分支上干活,每個人都有自己的分支,時不時地往遠程dev分支上push/pull就可以了。(push/pull的時候是要解決沖突的.)
上面這個圖是大致示意圖,其實上面這個圖是省略了git push/git pull操作的,比如bob在本地dev分支上,新建了一個feature1分支干完活,在本地的dev分支上合並了feature1分支,然后要把dev分支push到公共服務器上,這樣michael才能pull下來bob完成的內容。更詳細一點的圖如下:
PS:git本沒有公共服務器的概念,git的每個節點都是一個完整的git庫,但是公共服務器是方便了git節點之間的代碼互相push/pull(要不然每個git節點都需要互相連接,每增加一個git節點就要連接其他的git節點)。如下圖所示:
有公共服務器的結構 無公共服務器的結構
有公共服務器的,增加tom節點時候,只需要tom和公共服務器相連接,tom就可以取得(pull)michael提交(push,此處不是commit,commit是本地提交,沒有推送到公共服務器)的代碼,也可以取得bob提交(push)的代碼。
如果沒有公共服務器,tom要想取得(pull)michael的代碼,則必須在tom和michael之間建立一個網絡連接; 要想取得(pull)bob的代碼,必須在tom和bob之間建立一個網絡連接。
git安裝
linux上的安裝
- yum install git
windows上的安裝
http://git-scm.com/download/win
下載安裝即可。
安裝完成后,還需要最后一步設置,在命令行輸入:
- git config --global user.name "Your Name"
- git config --global user.email "email@example.com"
因為git是分布式版本控制系統,所以,每個機器都必須自報家門:你的名字和Email地址。注意git config命令的--global參數,用了這個參數,表示你這台機器上所有的git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址。然后在本機會生成一個.gitconfig文件,里面包含了user.name和user.email的信息。
WINDOWS下需要再添加一個配置,如下:
- git config --global core.autocrlf false
如果沒有加這個配置,在后續git操作的時候可能會報warning,如下:
這是因為在windows中的換行符為CRLF(\r\n), 而在linux下的換行符為:LF(\n)。
使用git來生成一個工程后,文件中的換行符為LF,在windows中,執行git add file操作時,系統提示:LF將被轉換成CRLF。
CRLF -- Carriage-Return Line-Feed 回車換行,就是回車(CR,ASCII 13,\r) 換行(LF,ASCII 10,\n)。
git命令
git目錄最好都不要包含中文名。
單機操作命令/單倉庫命令
創建版本庫repository
- mkdir git_repo
- cd git_repo
- git init
會在目錄中生成.git文件夾,該文件夾就是git倉庫的管理文件,不要隨意改動里面的內容。該文件夾默認是隱藏,ls命令看不到,用ls -ah命令可以看到。
新建一個file1.txt文件,文件內容如下(隨意寫的):
- This is file1.txt.
- for test~~~
把文件添加到代碼庫
- git add file1 file2...
- git commit -m "comment"
git add是把想要提交的文件先提交到commit緩存中;
git commit才是真正的文件提交。
通過git add命令,就等於是把文件加入到git管理中,會有各種git信息跟蹤,比如代碼版本號,修改了哪里等等。
查看代碼倉庫狀態
- git status
假設我修改了file1.txt文件內容如下:
- hello everybody!
- This is an file1.txt.
- end file.
然后用git status命令看一下:
上面的提示告訴我們file1.txt被修改過了,但是還沒有add到commit緩存中,即還沒有准備提交(commit)。
查看修改內容
雖然git status告訴我們file1.txt被修改了,但是沒告訴我們哪里被修改,為了具體查看文件什么地方被修改,就使用如下命令:
- git diff file
git diff命令要在git add命令之前使用,否則一旦添加到commit緩存后,git diff命令就失效了。
通過git add后,再看git status狀態,就變成了准備提交(commit)的狀態了。
隨后再git commit一下,就提交成功。
commit后,我們再看看git status,如下:
上圖黃色框中說明當前目錄多了個less文件是沒有被git跟蹤管理的,這個是我不小心加入的文件,在此無用,可以刪去。如果是你需要的文件,那么就通過git add把它加入git管理。
刪去了less文件后,看git status,如下所示:
查看兩個版本之間的不同
- git diff 版本1 版本2 [文件]
文件是可選的參數,不帶[文件]參數的是比較所有的不同修改:
帶[文件]參數的,你可以只查看某個文件的不同:
查看commit歷史
- git log
查看命令歷史
- git reflog
版本回退
- git reset --hard HEAD^
- git reset --hard HEAD@{4}
先用git log或者git reflog看下歷史版本,然后用git reset 命令回退版本,如下:
git是用HEAD來表示當前分支中的當前版本,HEAD^表示上一個版本,HEAD^^表示上上一個版本,以此類推,如果要回退很早的版本就用HEAD@{版本號},版本號用git reflog查看。
撤銷修改
分3種情況
場景1:當你改亂了工作區某個文件的內容,想直接丟棄工作區的修改時,用命令git checkout -- file 或者 手動修改。
場景2:當你不但改亂了工作區某個文件的內容,並且還添加到了暫存區(即已經git add了)時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,可以用版本回退(參考版本回退一節),不過前提是沒有推送到遠程庫。
下面舉例說明:
場景1
如果文件還是在工作區中,還沒有git add到暫存區,那么撤銷修改有2種辦法:,如下:
第1種辦法:手動復原,把不想要的修改地方復原。(該方法可以只修改文件的一部分)
第2種辦法:使用命令git checkout -- file。(這里的 -- 很重要,后續的版本分支也是是用git checkout命令,它沒有 --)
(該方法只能全部復原文件,因為git checkout -- file其實就是把版本庫中的file替換現在工作區的file)
場景2
當你不但改亂了工作區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步驟。
第1步:用命令git reset HEAD file,就回到了場景1;
第2步:按場景1操作。
git reset HEAD file命令是把緩存區中的file文件刪去,對工作區后續做的修改並沒有影響,比如上面的例子,git add后又修改了文件的內容everybody->chenj_freedom,git reset HEAD file后,file的內容還是chenj_freedom。
場景3
已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,不過前提是沒有推送到遠程庫。
刪除文件/誤刪除還原
從版本庫中刪除文件
- git rm file 或者 git add file
- git commit
誤刪除復原
- git checkout -- file
git checkout -- file其實就是用版本庫中的file文件替換工作區的文件,所以無論工作區的file文件是被修改了還是被刪除了,用這個命令都可以一鍵還原。
遠程倉庫命令
關聯遠程倉庫
- git remote add 遠程倉庫名 [url]
舉例:
- git remote add origin git@github.com:chenj-freedom/learngit.git
如上,origin是遠程倉庫的名字(注意:是倉庫的名字,倉庫中含有分支等信息)。
查看遠程倉庫
- git remote //查看遠程倉庫
- git remote -v //查看遠程倉庫,更詳細信息
如下圖:
fetch說明本地有提取遠程倉庫的權限,push說明本地有推送代碼到遠程倉庫的權限。
克隆遠程倉庫
- git clone [url]
舉例:
git clone操作會自動為你將遠程倉庫命名為origin,並抓取遠程倉庫中的所有數據,建立一個指向它的master指針,在本地命名為orgin/master,然后,git自動建立一個屬於你自己的本地master分支,始於origin上master分支相同的位置(master分支的關聯,這個也叫做跟蹤遠程分支),你可以就此開始工作。
原理如下圖所示:
跟蹤遠程分支
從遠程分支checkout出來的本地分支,稱為:跟蹤分支 (tracking branch)。跟蹤分支的本質就是使得本地分支名指向遠程分支名指向的內容(本質就是設置指針),如上一小節的圖,使得本地分支名(master)指向遠程分支名(origin/master)指向的節點。設置了跟蹤分支之后,使用git push/git pull命令就會自動使得本地分支(local-branch-name)自動push/pull遠程分支(remote-branch-name)的內容。
命令格式如下:
- git checkout -b [local-branch-name] [remote-name]/[remote-branch-name] //傳統格式
- git checkout --track [remote-name]/[remote-branch-name] //簡化格式
第一行的是傳統格式,第二行的是簡化格式,簡化格式中,本地分支名默認和遠程分支名相同。
舉例:假設遠程倉庫中現在有一個分支dev11。
用傳統格式跟蹤分支后,設置本地分支名和遠程分支名相同時,用命令git remote show origin命令查看。這時候,git push配置為把本地dev11分支推送到遠程dev11分支,本地master分支推送到遠程master分支;git pull命令配置為遠程dev11分支合並到本地dev11分支,遠程master分支合並到本地master分支。
但是假如用傳統方式,設置本地分支名和遠程分支名不相同時,用命令git remote show origin命令查看。git pull命令還是2個分支(master和dev11)都能拉取並合並到本地對應的分支,但是push命令就只有master分支能推送了。因此:最好是配置本地分支名和遠程分支名一樣。(所以直接用--track就默認本地分支名和遠程分支名一樣)
推送內容
- git push [remote-name] [local-branch-name]:[remote-branch-name]
注意:
1、該命令其中local-branch-name或者remote-branch-name是可以二者省略其一。
2、只有在遠程服務器上有寫權限,或者同一時刻沒有其他人在推數據,這條命令才會如期完成任務。如果在你推數據前,已經有其他人推送了若干更新,那你的推送操作就會被駁回。你必須先把他們的更新抓取(git pull)到本地,合並到自己的項目中,然后才可以再次推送。
舉例:git push origin master
這里git自動把master擴展成了refs/heads/master:refs/heads/master,意為“取出我在本地的master分支,推送到遠程倉庫的master分支中去”。
若想把遠程的master分支叫做other分支,可以使用git push origin master:other。
抓取內容
- git fetch [remote-name] //抓取遠程倉庫的全部內容,但是不會自動合並
- git pull //抓取遠程倉庫跟蹤分支的內容,並自動合並到本地相應的分支
git pull是你在本地的哪個分支使用本命令,它會自動抓取本地這個分支所跟蹤的遠程分支的內容,然后合並到本地分支上,對其他分支不會抓取內容。
舉例1:git fetch origin
此命令會到遠程倉庫中拉取所有你本地倉庫中還沒有的數據。運行完成后,你就可以在本地訪問該遠程倉庫中的所有分支。
git fetch會抓取從你上次克隆以來別人上傳到此遠程倉庫中的所有更新(或是上次fetch以來別人提交的更新)。有一點很重要,需要記住,git fetch命令只是將遠端的數據拉到本地倉庫,並不自動合並到當前工作分支,需要你自己手工合並。如下圖所示:
在本地新建一個git_repo文件夾,不通過git clone命令來克隆一個遠程庫,而是通過git remote add關聯遠程庫,並用git fetch來抓取遠程庫的所有未抓取過的數據,當抓取下來之后,必須手動合並git merge遠程庫的內容,才會顯示出分支內容,否則,沒有手動合並,git fetch是不會自動合並的。
舉例2:git pull
實驗前提:在github頁面上,dev11分支創建一個新文件remote_file.txt,在master分支創建新文件master_remote_file.txt。並且用git checkout -b跟蹤遠程分支dev11和master了。接下來用git pull命令(注意:是在本地dev11分支上使用git pull命令,所以會抓取dev11分支跟蹤的遠程分支的內容,並合並到本地dev11分支上。
但是這時候master分支的內容還是沒有改變。如下:
刪除遠程分支
即刪除遠程倉庫中的分支。
- git push [remote-name] :[remote-branch-name]
還記得git push命令嗎?git push [remote-name] [local-branch-name]:[remote-branch-name],把本地分支設置為空(冒號之前的內容),就相對於把一個空分支推送到遠程倉庫中的remote-branch-name分支去了,就相當於刪除了遠程倉庫中的該分支。
舉例:
刪除遠程倉庫本地關聯
- git remote rm [remote-name]
舉例:git remote rm origin
刪除遠程分支本地關聯
刪除遠程分支關聯也即刪除本地跟蹤分支。
- git branch -d [local-branch-name]
和刪除本地分支一樣的命令。
分支管理命令
創建、切換、查看分支
假設dev是要創建分支名字。
- git branch //查看分支
- git branch dev //創建分支
- git checkout dev //切換分支
- git checkout -b dev //創建並切換分支
合並分支
假設dev是要創建分支名字。
- git merge --no-ff -m "commit comment" dev //禁用Fast forward模式合並分支
- git merge dev //Fast forward模式合並分支
在Fast forward模式下,當刪除分支后,會丟掉分支信息。
刪除分支
假設dev是要創建分支名字。
- git branch -d dev
- git branch -D dev //強行刪除掉還未合並的分支
bug分支
由於git的分支功能強大,所以修改bug一般也是新建一個bug分支,修改后,合並到你的工作分支(master分支或者dev分支或者其他),再刪除bug分支。
假設場景,當你正在dev分支上編碼工作,突然接到一個需要緊急修復的bug,你應該會想建立一個bug分支,但是你dev的工作還沒有提交(無論是add或者commit),這時候可以使用“存儲工作現場”命令,如下:
- git stash //存儲工作現場,對working directory來說
然后首先確定要在哪個分支上去解決bug,比如我想要在master分支上解決bug,就先切換到master分支,然后從master分支上創建一個bug分支。(當然你也可以從別的分支上解決bug,比如dev分支上解決bug)。解決bug后合並到工作分支(就是你從哪個分支創建bug分支的那個分支)。
注意:git stash是針對工作區(working directory)來說的,對緩存區無效。所以再切換到bug分支的時候,緩存區的內容要先commit一下,要不然bug解決后,切換回工作分支,緩存區的內容就丟失了,git stash只存儲工作區現場的內容。
- git checkout master //先切換到master分支
- git checkout -b bug //創建bug分支,並切換到bug分支上
- ... //解決bug
- git add . //在bug分支上add
- git commit -m "fix bug" //在bug分支上commit
- git checkout master //切換回master分支
- git merge --no-ff bug //在master分支上合並bug分支
- git branch -d bug //刪除bug分支
現在bug解決了,要回到原來dev上的工作,可是時間太久了,忘記了。那么可以用一下命令查看工作現場列表。
- git stash list //查看工作現場列表
可以看出來工作現場保存的是dev分支上的現場。所以要先切換回dev分支,在恢復工作現場。如果沒有先切換到dev分支,比如在master分支就去恢復工作現場,那么會執行合並dev分支的操作。
恢復工作現場的命令,如下:
- git stash apply //恢復工作現場
- git stash drop //刪除工作現場列表中的對應項
或者直接
- git stash pop //恢復工作現場並刪除工作現場列表中的對應項
自定義git命令
忽略特殊文件
問題提出:
有些時候,你必須把某些文件放到Git工作目錄中,但又不能提交它們,比如保存了數據庫密碼的配置文件啦,等等,每次git status都會顯示Untracked files ...,這樣顯示對於用戶很不友好,應該怎么辦?
回答:
step1:使用.gitignore文件,然后把要忽略的文件名填進去,git就會自動忽略這些文件。
step2:把.gitignore文件加入到git倉庫(目錄)中。
忽略文件的原則是:
1、忽略操作系統自動生成的文件,比如縮略圖等;
2、忽略編譯生成的中間文件、可執行文件等;
3、忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件。
在github里有一些.gitignore文件的例子,網址:https://github.com/github/gitignore
舉個例子:
- # Compiled Object files
- *.slo
- *.lo
- *.o
- *.obj
- # Precompiled Headers
- *.gch
- *.pch
- # Compiled Dynamic libraries
- *.so
- *.dylib
- *.dll
配置git命令
- git config //不帶global參數的是對當前倉庫進行配置(當前倉庫)
- git config --global //帶global參數的是對本地所有倉庫的配置(當前用戶)
當前倉庫的git配置文件放在.git/config文件;
當前用戶的git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig。
搭建自己的git服務器
github托管私有項目是要收費的,所以可能會有搭建自己的git服務器的需求,具體不詳述,直接參考網址:點擊這里
平常開源的我就用github,閉源的可以用git@OSC(開源中國的代碼托管平台,私有倉庫也免費)
Github使用
賬號設置
本地Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密的。
為何GitHub需要SSH Key呢?因為GitHub需要識別出你推送的提交確實是你推送的,而不是別人冒充的,而Git支持SSH協議,所以,GitHub只要知道了你的公鑰,就可以確認只有你自己才能推送。
當然,GitHub允許你添加多個Key。假定你有若干電腦,你一會兒在公司提交,一會兒在家里提交,只要把每台電腦的Key都添加到GitHub,就可以在每台電腦上往GitHub推送了。
step1:創建github賬號。(我這里的賬號是chenj-freedom,后續文章會使用到)
step2:創建SSH key。
- ssh-keygen -t rsa -C "chenj_freedom@qq.com"
使用上面的命令創建SSH key(把郵箱換成你自己的郵箱)。命令中會要求你設置ssh key生成的路徑,設置密碼(passphrase)等等,命令執行完畢后,會在你設置的路徑中生成.ssh目錄,里面含有id_rsa(私鑰)文件和id_rsa.pub文件(公鑰)。私鑰文件不能外泄,公鑰文件可以公開。
這個生成的key是針對每一台電腦的,每個機器根據郵箱名字來識別用戶的。
step3:登陸github網站,設置公鑰。
打開"Account settings"->"SSH Keys"頁面,然后點擊"Add SSH Key",在Key文本框中粘貼id_rsa.pub公鑰文件的內容,點擊"Add Key",就可以看到剛添加的key了。
>>>
把本地庫推送到github遠程庫
step1:登陸github,點擊"Create a new repo"。
填入倉庫名字(最好和本地庫名字一樣),其他保持默認,創建一個新的代碼倉庫。創建完畢后,會顯示如下提示:
github上的倉庫有https和ssh兩種連接方式,都是OK的。
step2:把本地庫推送到github遠程庫上(關聯)。
- git remote add origin git@server-name:path/repo-name.git //關聯遠程庫
- git push -u origin master //第一次推送master分支內容,-u參數指定遠程庫所在的服務器為默認服務器,在此例即為github服務器
- git push origin master //后續推送master分支內容不需要帶參數-u
說明:
1、git remote add命令就是把git@server-name:path/repo-name.git和origin關聯起來,origin的名字是你自己可以隨意取的。
2、git push origin master,就是把master分支推送到遠程的origin上,也就是推送到git@server-name:path/repo-name.git倉庫中。
3、git push origin master,這里也可以不推送master分支,可以推送其他分支。
關聯遠程庫后,可以用git remote -v命令查看,如下:
根據step1中圖上面的提示,你可以create a new repository on the command line或者push an existing repository from the command line或者import code from another repository,我們根據第二種提示來把本地庫關聯到github遠程庫上(推送)。
推送成功后,可以看到github頁面中顯示的遠程庫和本地是一樣的了。
從github遠程庫克隆到本地庫
- git clone git@github.com:chenj-freedom/git_repo.git
github原理應用
比如A有一個開源項目托管在github上,地址是git@github.com:A/git_A.git。賬戶A對該地址的遠程倉庫是有讀/寫的權限的,但是其他賬戶,比如賬戶B和賬戶C對git@github.com:A/git_A.git只有讀的權限,但是沒有寫的權限。(這是github這個平台幫我們設置的git服務器的權限,每個賬戶只能對自己賬戶下的遠程倉庫讀/寫,對其他賬戶邊的遠程倉庫只有讀權限,沒有寫權限)
其他賬戶(比如賬戶B)要讀git@github.com:A/git_A.git的倉庫,可以在github網站上進行fork操作,就會克隆一個git_A倉庫到自己的賬戶下,然后本地對自己賬戶下的這個git_A倉庫是有讀/寫的權限的。
當想把自己的代碼貢獻給賬戶A,那么在github網站上進行pull request操作即可,至於賬戶A是否願意接受你的代碼,那是由賬戶A決定的。
推薦相關git教程
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000( 此教程更為詳細):
http://git.oschina.net/progit/
http://www.yiibai.com/git/home.html
參考鏈接:http://blog.csdn.net/chenj_freedom/article/details/50543152