1. 程式人生 > >git入門:概念、原理、使用

git入門:概念、原理、使用

git和Github

概念

Git --- 版本控制工具(命令)

git是一個開源的分散式版本控制系統,用以有效、高速的處理從很小到非常大的專案版本管理。git是個工具,在linux裡面也就類似gcc這樣的工具一樣,是一個shell命令git是Linus Torvalds為了幫助管理Linux核心開發而開發的一個開放原始碼的版本控制軟體。Torvalds開始著手開發git是為了作為一種過渡方案來替代BitKeeper,後者之前一直是Linux核心開發人員在全球使用的主要原始碼工具。開放原始碼社群中的有些人覺得BitKeeper的許可證並不適合開放原始碼社群的工作,因此 Torvalds決定著手研究許可證更為靈活的版本控制系統。儘管最初git的開發是為了輔助Linux核心開發的過程,但是我們已經發現在很多其他自由軟體專案中也使用了git。例如:很多Freedesktop的專案也遷移到了git上。

Github --- 一個平臺(網站)

提供給使用者建立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 或者 直接在線上平臺上操作。

[email protected] 

[email protected]是開源中國社群團隊基於開源專案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上的安裝

下載安裝即可。

安裝完成後,還需要最後一步設定,在命令列輸入:

git config --global user.name "Your Name"  
git config --global user.email "[email protected]"  

因為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 [email protected]{4}  

先用git log或者git reflog看下歷史版本,然後用git reset 命令回退版本,如下:

git是用HEAD來表示當前分支中的當前版本,HEAD^表示上一個版本,HEAD^^表示上上一個版本,以此類推,如果要回退很早的版本就用[email protected]{版本號},版本號用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 [email protected]: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、忽略你自己的帶有敏感資訊的配置檔案,比如存放口令的配置檔案。

舉個例子:

# 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,閉源的可以用[email protected](開源中國的程式碼託管平臺,私有倉庫也免費)

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 "[email protected]"  

使用上面的命令建立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 [email protected]:path/repo-name.git //關聯遠端庫  
git push -u origin master //第一次推送master分支內容,-u引數指定遠端庫所在的伺服器為預設伺服器,在此例即為github伺服器  
git push origin master //後續推送master分支內容不需要帶引數-u  

說明:

1、git remote add命令就是把[email protected]:path/repo-name.git和origin關聯起來origin的名字是你自己可以隨意取的。

2、git push origin master,就是把master分支推送到遠端的origin上,也就是推送到[email protected]: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 [email protected]:chenj-freedom/git_repo.git  

github原理應用

比如A有一個開源專案託管在github上,地址是[email protected]:A/git_A.git。賬戶A對該地址的遠端倉庫是有讀/寫的許可權的,但是其他賬戶,比如賬戶B和賬戶C對[email protected]:A/git_A.git只有讀的許可權,但是沒有寫的許可權。(這是github這個平臺幫我們設定的git伺服器的許可權,每個賬戶只能對自己賬戶下的遠端倉庫讀/寫,對其他賬戶邊的遠端倉庫只有讀許可權,沒有寫許可權

其他賬戶(比如賬戶B)要讀[email protected]:A/git_A.git的倉庫,可以在github網站上進行fork操作,就會克隆一個git_A倉庫到自己的賬戶下,然後本地對自己賬戶下的這個git_A倉庫是有讀/寫的許可權的。

當想把自己的程式碼貢獻給賬戶A,那麼在github網站上進行pull request操作即可,至於賬戶A是否願意接受你的程式碼,那是由賬戶A決定的。

其它

相關推薦

git入門概念原理使用

git和Github 概念 Git --- 版本控制工具(命令)。 git是一個開源的分散式版本控制系統,用以有效、高速的處理從很小到非常大的專案版本管理。git是個工具,在linux裡面也就類似gcc這樣的工具一樣,是一個shell命令。git是Linus

Java泛型(一)入門原理使用

core clas set out keyword getclass code 避免 post 遠在 JDK 1.4 版本的時候,那時候是沒有泛型的概念的。當時 Java 程序員們寫集合類的代碼都是類似於下面這樣: List list = new ArrayList();

8.霍夫變換線條——投票原理霍夫空間線的極座標表示_2

目錄 投票原理 霍夫空間 線的極座標表示 投票原理 就像我之前說的,檢查每一行是不可能的,即使是一臺非常非常快的電腦。 我們要做的是讓資料告訴我們,讓資料決定線在哪裡。 因為這是民主,我們該怎麼辦?   我們要做的是投票。 因此,投票是一種通用的技術

演算法列隊的原理使用及案例

Queue 是資料集合,僅允許在列表的一端插入,另一端刪除 性質:先進先出 程式碼實現 class Queue: def __init__(self, size=100): self.queue = [0 for _ in ra

機器學習入門概念原理及常用演算法

機器學習(Machine Learning, ML)是一門多領域交叉學科,涉及概率論、統計學、逼近論、凸分析、演算法複雜度理論等多門學科。專門研究計算機怎樣模擬或實現人類的學習行為,以獲取新的知識或技能,重新組織已有的知識結構使之不斷改善自身的效能。 它是人工智慧的核心,是使

高併發程式設計系列4大併發工具類的功能原理以及應用場景

通常我們所說的併發包也就是java.util.concurrent,集中了Java併發工具類和併發容器等,今天主要介紹Java併發程式設計的工具類,我先從Java併發工具包談起。 01 — 併發工具包涵蓋範圍 1.併發工具類 提供了比synchronized更加高階

sslscan詳解安裝使用原理示例

一、安裝sslscan 1、git下載sslscan原始碼       [[email protected] ~]# git clone https://github.com/rbsec/ss

Flume概念原理與Kafka優勢對比

1 .背景      flume是由cloudera軟體公司產出的可分散式日誌收集系統,後與2009年被捐贈了apache軟體基金會,為hadoop相關元件之一。尤其近幾年隨著flume的不斷被完善以及

Python基礎入門List與TupleDict與Set之間的比較

定義方式: L=[1,2,3] T=('a','b',['A','B']) D={key:value,} S=(['a','b','c']) 比較:list與tuple皆為有序,dict與set為無序 因此dict與set不能通過下標序號呼叫,沒有append(),ins

android camera(二)攝像頭工作原理s5PV310 攝像頭介面(CAMIF)

一、攝像頭工作原理 上一篇我們講了攝像頭模組的組成,工作原理,做為一種瞭解。下面我們析攝像頭從暫存器角度是怎麼工作的。如何閱讀攝像頭規格書(針對驅動調節時用到關鍵引數,以GT2005為例)。 規格書,也就是一個器件所有的說明,精確到器件每一個細節,軟體關心的暫存器、硬體關心的電氣特性、封裝等等。單單驅動

Python 入門裝飾器(decorator)@functools.wraps@staticmethod@classmethod

裝飾器 1、要了解裝飾器,就需要知道什麼是高階函式,高階函式就是將函式作為引數賦值給另一個函式 2、Python的 decorator 本質上就是一個高階函式,它接收一個函式作為引數,然後,返回一個新函式 3、decorator是在被裝飾的

python入門基礎,列表元組字典及集合型別

這篇文章是python基本資料結構的高階教程,一般的用法請自行參考python入門教程python入門教程基礎變數及其作用域函式運算子Python運算子優先順序從最高到最低優先順序的所有運算子運算子描述**指數 (最高優先順序)~ + -按位翻轉, 一元加號和減號 (最後兩個

keepalived 功能 原理腦裂

簡介: keepalived設計之初是專為LVS負載均衡軟體設計的,用來管理和監控LVS集群系統中的各個服務節點狀態,,後來加入實現高可用的VRRP功能。通過vrrp協議實現高可用功能的 常用的功能 管理LVS負載均衡軟體 對LVS叢集節點健康檢查功能

詳解MemcachedRedis等快取的特徵原理應用

詳解Memcached、Redis等快取的特徵、原理、應用 http://youzhixueyuan.com/explain-the-principles-of-memcached-and-redis.html http://youzhixueyuan.com/advanced-archit

springboot與快取—使用原理整合redis

      Java快取介面標準JSR-107:Java Caching定義了5個核心介面,分別是CachingProvider(快取提供者), CacheManager(快取管理器), Cache(快取元件), Entry (key-value對)和Expiry(條目有效期

HDFS應用場景原理基本架構及使用方法概述

以下主要參考小象科技的董西成老師的視訊 1. HDFS概述 2. HDFS基本架構和原理 3. HDFS程式設計 4. HDFS 2.0新特性 一、HDFS概述 HDFS是什麼? 1、源自於Google的GFS論文,發表於2003年10月,HDFS是GFS克隆版

GPS天線結構原理測試

【有源陶瓷天線構成】GPS天線是由接收天線和前置放大器兩個部件組成。GPS接收天線的作用,是將衛星來的無線電訊號的電磁波能量變換成接收機電子器件可攝取應用的電流。絕大部分內建GPS天線為右旋極化陶瓷介質,其組成部分為:陶瓷天線、低噪音訊號模組、線纜、接頭。   

泛型應用原理協變逆變泛型快取

object(最初的封裝各個型別引數做法) 1,任何父類的地方都可以使用之類來代替 2,object是一切型別的父類 public static void ShowObject(object oParameter) { Console.WriteLine("我是{0} 類,型

PostgreSQL生態原理應用案例開發與管理實踐 - 南京站 (最全資料下載,PPT+回顧視訊)

活動介紹 PostgreSQL發展非常的迅猛,覆蓋OLTP,OLAP,NoSQL,搜尋,時空,流,圖,影象等應用場景,往企業級全棧資料庫的方向發展。PostgreSQL的應用場景豐富,在穩定性、效能、可用性、可靠性、容災、安全性、擴充套件性等方面不亞於商用資料庫Oracle,常被業界稱為“開源界的Oracl

資料庫基礎原理優化操作及方案

  資料庫檔案讀寫就要考慮到效率問題!在資料庫中提高效率用到什麼,是事務!如果一條條插入,其實每次插入都會維持一個事務,也就相當於檔案的開啟和關閉,10000次的開啟和關閉是很消耗效能的,所以要在插入前使用BEGIN TRANSACTION開啟事務,再10000條資料插入完成