閱讀557 返回首頁    go 阿裏雲 go 技術社區[雲棲]


git學習

git簡介

git是目前世界上最先進的分布式版本控製係統,即自動幫你記錄每次文件的修改,還可以讓同事協作編輯

git誕生

Linus創建了Linux後,全世界熱心誌願者參與其中,把源代碼文件通過diff的方式發給Linus,Linus寧願通過手工方式合並代碼也堅決的反對CVS和SVN;隨著代碼的壯大,Linus選擇了一個商業的版本控製係統BitKeeper來管理代碼;但是後來因為Linux社區牛人企圖破解BitKeeper的協議而失去免費使用權。然後Linus花了兩周時間自己用C寫了一個分布式版本控製係統,這就是Git

Git迅速成為最流行的分布式版本控製係統,尤其是2008年,GitHub網站上線,它為開源項目免費提供Git存儲,無數開源項目開始遷移至GitHub,包括jQuery,PHP,Ruby等等

集中式VS分布式

Linus一直痛恨的CVS及SVN都是集中式的版本控製係統,而Git是分布式版本控製係統,集中式和分布式版本控製係統有什麼區別呢?

集中式版本控製係統:版本庫是集中存放在中央服務器,幹活的時候,先從中央服務器取得最新的版本,然後開始幹活,幹完活了,再把自己的活推送給中央服務器。集中式版本控製係統最大的毛病就是必須聯網才能工作,而且中央服務器要是出了問題,所有人都沒法幹活了

分布式版本控製係統:分布式版本控製係統要比集中式版本控製係統的安全性高很多,因為每個人電腦裏都有完整的版本庫,某一個人的電腦壞掉了不要緊,隨便從其他人那裏複製一個就可以了。另外,Git極其強大的分支管理也把SVN等遠遠拋在了後麵

分布式版本控製係統除了Git以及促使Git誕生的BitKeeper外,還有類似Git的Mercurial和Bazaar等。這些分布式版本控製係統各有特點,但最快、最簡單也最流行的依然是Git

安裝git

最早Git是在Linux上開發的,很長一段時間內,Git也隻能在Linux和Unix係統上跑。不過,慢慢地有人把它移植到了Windows上。現在,Git可以在Linux、Unix、Mac和Windows這幾大平台上正常運行了

在Linux上安裝Git命令

git - 查看係統有沒安裝git,有很多Linux還會友好地告訴你如何安裝Git

sudo apt-get install git - 安裝git

在Mac OS X上安裝Git

1.安裝homebrew,然後通過homebrew安裝Git

2.直接從AppStore安裝Xcode,Xcode集成了Git,不過默認沒有安裝,你需要運行Xcode,選擇菜單“Xcode”->“Preferences”,在彈出窗口中找到“Downloads”,選擇“Command Line Tools”,點“Install”就可以完成安裝了

在Windows上安裝Git

Windows下要使用很多Linux/Unix工具時,需要Cygwin這樣的模擬環境,Git也一樣。Cygwin的安裝和配置都比較複雜,不過,有人已經把模擬環境和Git都打包好了,名叫msysgit,隻需要下載一個單獨的exe安裝程序,其他什麼也不用裝,絕對好用

msysgit是Windows版的Git,從https://git-for-windows.github.io下載(網速慢的同學請移步國內鏡像),然後按默認選項安裝即可。安裝完成後,在開始菜單裏找到“Git”->“Git Bash”,蹦出一個類似命令行窗口的東西,就說明Git安裝成功

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

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

Git是分布式版本控製係統,所以每個機器都必須自報家門:你的名字和Email地址。你也許會擔心,如果有人故意冒充別人怎麼辦?這個不必擔心,首先我們相信大家都是善良無知的群眾,其次,真的有冒充的也是有辦法可查的

注意:用了git config命令的--global參數,表示你這台機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的用戶名和Email地址

創建版本庫

版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄裏的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤曆史,或者在將來某個時刻可以“還原”。所以,創建一個版本庫非常簡單,首先,選擇一個合適的地方,創建一個空目錄:

$ mkdir learngit
$ cd learngit
$ pwd

pwd命令用於顯示當前目錄。如果使用Windows係統,請確保目錄名(包括父目錄)不包含中文

然後,通過git init命令把這個目錄變成Git可以管理的倉庫

$ git init

瞬間Git就把倉庫建好了,而且告訴你是一個空倉庫(empty Git repository),細心的讀者可以發現當前目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄裏麵的文件,不然改亂了,就把Git倉庫給破壞了。如果你沒有看到.git目錄,那是因為這個目錄默認是隱藏的,用ls -ah命令就可以看見

也不一定必須在空目錄下創建Git倉庫,選擇一個已經有東西的目錄也是可以的

把文件添加到版本庫

明確一下:所有的版本控製係統,其實隻能跟蹤文本文件的改動,比如TXT文件,網頁,所有的程序代碼等等,Git也不例外。版本控製係統可以告訴你每次的改動,比如在第5行加了一個單詞“Linux”,在第8行刪了一個單詞“Windows”。而圖片、視頻這些二進製文件,雖然也能由版本控製係統管理,但沒法跟蹤文件的變化,隻能把二進製文件每次改動串起來,也就是隻知道圖片從100KB改成了120KB,但到底改了啥,版本控製係統沒法知道。Microsoft的Word格式是二進製格式,因此,版本控製係統沒法跟蹤Word文件的改動。如果要真正使用版本控製係統,就要以純文本方式編寫文件

文本是有編碼的,如果沒有曆史遺留問題,強烈建議使用標準的UTF-8編碼,所有語言使用同一種編碼

使用Windows的童鞋要注意:千萬不要用Windows自帶的記事本編輯任何文本文件。原因是Microsoft開發記事本的團隊使用了一個非常弱智的行為來保存UTF-8編碼的文件,他們自作聰明地在每個文件開頭添加了0xefbbbf(十六進製)的字符,你會遇到很多不可思議的問題,比如:網頁第一行可能會顯示一個“?”,明明正確的程序一編譯就報語法錯誤,等等,都是由記事本的弱智行為帶來的。建議用Notepad++代替記事本,記得把Notepad++的默認編碼設置為UTF-8 without BOM即可

我們編寫一個readme.txt文件,內容如下:

Git is a version control system.
Git is free software.

一定要放到learngit目錄下(子目錄也行),放到其他地方Git再厲害也找不到這個文件。把一個文件放到Git倉庫隻需要兩步:

1.用命令git add告訴Git,把文件添加到倉庫:

$ git add readme.txt

2.用命令git commit告訴Git,把文件提交到倉庫:

$ git commit -m "wrote a readme file"

git commit命令的-m後麵輸入的是本次提交的說明,可以輸入任意內容,當然最好是有意義的,這樣你就能從曆史記錄裏方便地找到改動記錄。git commit命令執行成功後會告訴你,1個文件被改動(我們新添加的readme.txt文件),插入了兩行內容(readme.txt有兩行內容)。

時光機穿梭

已經成功地添加並提交了一個readme.txt文件,現在,繼續修改readme.txt文件,改成如下內容:

Git is a distributed version control system.
Git is free software.

現在,運行git status命令,看到:readme.txt被修改過了,但還沒有準備提交的修改;所以git status命令可以讓我們時刻掌握倉庫當前的狀態。如果能看到具體修改了什麼自然是更好的所以,需要用git diff這個命令查看

git diff顧名思義就是查看difference,顯示的格式是Unix通用的diff格式,知道了對readme.txt作了什麼修改後,再把它提交到倉庫就放心多了,提交修改和提交新文件是一樣的兩步,git add和git commit。然後我們再運行git status,可以看到:將要被提交的修改包括readme.tx

版本回退

每當文件修改到一定程度,你可以“保存一個快照”,這個快照在Git中被稱為commit。一旦文件改亂了或者誤刪了,還可以從最近的一個commit恢複,然後繼續工作。

版本控製係統肯定有某個命令可以告訴我們曆史記錄,在Git中,我們用git log命令查看。git log命令顯示從最近到最遠的提交日誌,如果嫌輸出信息太多,可以加上--pretty=oneline參數;

注意:你看到的一大串類似3628164...882e1e0的是commit id(版本號),Git的commit id是一個SHA1計算出的非常大的數字,用十六進製表示,而且每個人的commit id都不同,以自己的為準。為什麼commit id需要用這麼一大串數字表示呢?因為Git是分布式的版本控製係統,後麵我們還要研究多人在同一個版本庫裏工作,如果大家都用1,2,3……作為版本號,那肯定就衝突了。每提交一個新版本,實際上Git就會把它們自動串成一條時間線。如果使用可視化工具查看Git曆史,就可以更清楚地看到提交曆史的時間線

現在我們準備把readme.txt回退到上一個版本。首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。現在,我們要把當前版本回退到上一個版本,就可以使用git reset命令:

$ git reset --hard HEAD^

也可以用git reset回到以後的某個版本,後麵跟上你要到版本的版本號即可;版本號沒必要寫全,前幾位就可以

$ git reset --hard 3628164

Git提供了一個命令git reflog用來記錄你所有的曆史命令;他也可以幫助你回到未來的某個版本

工作區和暫存區

Git和其他版本控製係統如SVN的一個不同之處就是有暫存區的概念

工作區(Working Directory):就是你在電腦裏能看到的目錄

版本庫(Repository):工作區有一個隱藏目錄.git,這個不算工作區,而是Git的版本庫。Git的版本庫裏存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區,還有Git為我們自動創建的第一個分支master,以及指向master的一個指針叫HEAD

暫存區:git add實際上就是把文件修改添加到暫存區;git commit實際上就是把暫存區的所有內容提交到當前分支

管理修改

修改提交後,用git diff HEAD -- file命令可以查看工作區和版本庫裏麵最新版本的區別

git checkout -- file可以丟棄工作區的修改,就是讓這個文件回到最近一次git commit或git add時的狀態。git checkout其實是用版本庫裏的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”

git reset HEAD file可以把暫存區的修改撤銷掉(unstage),重新放回工作區。git reset命令既可以回退版本,也可以把暫存區的修改回退到工作區。當我們用HEAD時,表示最新的版本

git rm file刪除文件

遠程倉庫

世界上有個叫GitHub的神奇的網站,是提供Git倉庫托管服務的,所以,隻要注冊一個GitHub賬號,就可以免費獲得Git遠程倉庫。由於你的本地Git倉庫和GitHub倉庫間的傳輸是通過SSH加密的,所以,需要一點設置:

1.創建SSH Key。在用戶主目錄下,看看有沒有.ssh目錄,如果有,再看看這個目錄下有沒有id_rsa和id_rsa.pub這兩個文件,如果已經有了,可直接跳到下一步。如果沒有,打開Shell(Windows下打開Git Bash),創建SSH Key:

$ ssh-keygen -t rsa -C "youremail@example.com"

需要把郵件地址換成你自己的郵件地址,然後一路回車,使用默認值即可。如果順利的話,可以在用戶主目錄裏找到.ssh目錄,裏麵有id_rsa和id_rsa.pub兩個文件,id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以告訴任何人

2.登陸GitHub,打開“Account settings”,“SSH Keys”頁麵。然後,點“Add SSH Key”,填上任意Title,在Key文本框裏粘貼id_rsa.pub文件的內容;再點“Add Key”,你就應該看到已經添加的Key

GitHub需要識別出你推送的提交確實是你推送的,而Git支持SSH協議,所以,GitHub隻要知道了你的公鑰,就可以確認隻有你才能推送。當然,GitHub允許添加多個Key。假定你有若幹電腦,你一會兒在公司提交,一會兒在家裏提交,隻要把每台電腦的Key都添加到GitHub,就可以在每台電腦上往GitHub推送了。最後友情提示,在GitHub上免費托管的Git倉庫,任何人都可以看到喔(但隻有你自己才能改)。所以,不要把敏感信息放進去。

如果你不想讓別人看到Git庫,有兩個辦法,一個是交點保護費,讓GitHub把公開的倉庫變成私有的,這樣別人就看不見了(不可讀更不可寫)。另一個辦法是自己動手,搭一個Git服務器,因為是你自己的Git服務器,所以別人也是看不見的。這個方法我們後麵會講到的,相當簡單,公司內部開發必備。

確保你擁有一個GitHub賬號後,我們就即將開始遠程倉庫的學習

添加遠程庫

首先,登陸GitHub,然後,在右上角找到“Create a new repo”按鈕,創建一個新的倉庫。

在Repository name填入name,其他保持默認設置,點擊“Create repository”按鈕,就成功創建了一個新的Git倉庫

在GitHub上的這個name倉庫是空的,可以從這個倉庫克隆出新的倉庫,也可以把一個已有的本地倉庫與之關聯,然後,把本地倉庫的內容推送到GitHub倉庫。現在,我們根據GitHub的提示,在本地倉庫下運行命令:

git remote add origin git@github.com:hanmeng1023/name.git

請千萬注意,把上麵的hanmeng1023替換成你自己的GitHub賬戶名,否則,你在本地關聯的就是我的遠程庫,關聯沒有問題,但是你以後推送是推不上去的,因為你的SSH Key公鑰不在我的賬戶列表中。添加後遠程庫的名字就是name,這是Git默認的叫法,也可以改成別的。

下一步,就可以把本地庫的所有內容推送到遠程庫上:

git push -u origin master

把本地庫的內容推送到遠程,用git push命令,實際上是把當前分支master推送到遠程。由於遠程庫是空的,我們第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在以後的推送或者拉取時就可以簡化命令。推送成功後,可以立刻在GitHub頁麵中看到遠程庫的內容已經和本地一模一樣。之後,隻要本地作了提交,就可以通過命令git push origin master推送到github

SSH警告:當你第一次使用Git的clone或者push命令連接GitHub時,會得到一個警告;這是因為Git使用SSH連接,而SSH連接在第一次驗證GitHub服務器的Key時,需要你確認GitHub的Key的指紋信息是否真的來自GitHub的服務器,輸入yes回車即可。Git會輸出一個警告,告訴你已經把GitHub的Key添加到本機的一個信任列表裏了。這個警告隻會出現一次,後麵的操作就不會有任何警告了。如果你實在擔心有人冒充GitHub服務器,輸入yes前可以對照GitHub的RSA Key的指紋信息是否與SSH連接給出的一致

從遠程庫克隆

首先,登陸GitHub,創建一個新的倉庫,名字叫gitskills。我們勾選Initialize this repository with a README,這樣GitHub會自動為我們創建一個README.md文件

現在,遠程庫已經準備好了,下一步是用命令git clone克隆一個本地庫:

git clone git@github.com:hanmeng1023/gitskills.git。

注意把Git庫的地址換成你自己的,然後進入gitskills目錄看看,已經有README.md文件了

分支管理

分支就是科幻電影裏麵的平行宇宙。你創建一個屬於自己的分支,然後在自己的分支上幹活,直到開發完畢後,再一次性合並到原來的分支上,這樣,既安全,又不影響別人工作

HEAD嚴格來說不是指向提交,而是指向master,master才是指向提交的;所以,HEAD指向的就是當前分支。Git創建一個分支很快,除了增加一個dev指針改改HEAD的指向,工作區的文件都沒有任何變化。Git合並分支也是同理隻改變指針指向,也很快

首先,我們創建dev分支,然後切換到dev分支

git checkout -b dev

git checkout命令加上-b參數表示創建並切換,相當於以下兩條命令:

git branch dev
git checkout dev

然後,用git branch命令查看當前分支。git branch命令會列出所有分支,當前分支前麵會標一個*號。然後我們就可以在dev分支上正常修改提交。現在,dev分支的工作完成,我們就可以切換回master分支

git checkout master

現在,我們把dev分支的工作成果合並到master分支上

git merge dev

git merge命令用於合並指定分支到當前分支。合並完成後,就可以放心地刪除dev分支了

git branch -d dev

如果master分支和dev分支各自都分別有新的提交;這種情況下,Git無法執行“快速合並”,隻能試圖把各自的修改合並起來,但這種合並就可能會有衝突。git status也可以告訴我們衝突的文件。Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容

用帶參數的git log也可以看到分支的合並情況:

git log --graph --pretty=oneline --abbrev-commit

合並分支時,如果可能,通常Git會用Fast forward模式,但這種模式下,刪除分支後,會丟掉分支信息。如果要強製禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支曆史上就可以看出分支信息。

git merge --no-ff -m "merge with no-ff" dev

請注意--no-ff參數,表示禁用Fast forward。因本次合並要創建一個新的commit,所以加上-m參數把commit描述寫進去。合並分支時,加上--no-ff參數就可以用普通模式合並,合並後的曆史有分支,能看出來曾經做過合並,而fast forward合並就看不出來曾經做過合並

Git還提供了一個stash功能,可以把當前工作現場“儲藏”起來,等以後恢複現場後繼續工作:

git stash

現在,用git status查看工作區,就是幹淨的(除非有沒有被Git管理的文件)。然後用git stash list命令看Git把stash內容存在某個地方了,但是需要恢複一下,有兩個辦法:

1.用git stash apply恢複,但是恢複後,stash內容並不刪除,你需要用git stash drop來刪除

2.用git stash pop,恢複的同時把stash內容也刪了

再用git stash list查看,就看不到任何stash內容了。可以多次stash,恢複的時候,先用git stash list查看,然後恢複指定的stash,用命令:

git stash apply stash@{0}

即:當手頭工作沒有完成時,先把工作現場git stash一下,然後修複bug後,再git stash pop,回到工作現場

如果要丟棄一個沒有被合並過的分支,可以通過git branch -D <name>強行刪除

要查看遠程庫的信息,用git remotegit remote -v會顯示更詳細的可以抓取和推送的origin的地址。如果沒有推送權限,就看不到push地址

多人協作的工作模式通常是這樣:

1.首先,可以試圖用git push origin branch-name推送自己的修改;

2.如果推送失敗,則因為遠程分支比你的本地更新,需要先用git pull試圖合並;

3.如果合並有衝突,則解決衝突,並在本地提交;

4.沒有衝突或者解決掉衝突後,再用git push origin branch-name推送就能成功

如果git pull提示“no tracking information”,則說明本地分支和遠程分支的鏈接關係沒有創建,用命令git branch --set-upstream branch-name origin/branch-name。這就是多人協作的工作模式,一旦熟悉了,就非常簡單

標簽管理

發布版本時,我們通常先在版本庫中打一個標簽(tag),這樣,就唯一確定了打標簽時刻的版本。將來無論什麼時候,取某個標簽的版本,就是把那個打標簽的時刻的曆史版本取出來。所以,標簽也是版本庫的一個快照

在Git中打標簽非常簡單:首先,切換到需要打標簽的分支上;然後,敲命令git tag <name>就可以打一個新標簽;可以用命令git tag查看所有標簽

默認標簽是打在最新提交的commit上的。有時候,如果忘了打標簽,方法是找到曆史提交的commit id,然後打上就可以了

可以用git show <tagname>查看標簽信息。還可以創建帶有說明的標簽,用-a指定標簽名,-m指定說明文字

git tag -a v0.1 -m "version 0.1 released" 3628164

還可以通過-s用私鑰簽名一個標簽

git tag -s v0.2 -m "signed version 0.2 released" fec145a

簽名采用PGP簽名,因此,必須首先安裝gpg(GnuPG),如果沒有找到gpg,或者沒有gpg密鑰對,就會報錯。用命令git show <tagname>可以看到PGP簽名信息

用PGP簽名的標簽是不可偽造的,因為可以驗證PGP簽名

因為創建的標簽都隻存儲在本地,不會自動推送到遠程。所以,打錯的標簽可以在本地安全刪除:

git tag -d v0.1

如果要推送某個標簽到遠程,使用命令git push origin <tagname>。或者使用git push origin --tags一次性推送全部尚未推送到遠程的本地標簽。如果標簽已經推送到遠程,要刪除遠程標簽就麻煩一點,先通過git tag -d v0.9從本地刪除;然後從遠程刪除。刪除命令也是push,格式為:

git push origin :refs/tags/v0.9

要看看是否真的從遠程庫刪除了標簽,可以登陸GitHub查看

使用GitHub

GitHub還是一個開源協作社區,通過GitHub,既可以讓別人參與你的開源項目,也可以參與別人的開源項目

如何參與一個開源項目呢?比如人氣極高的bootstrap項目,你可以訪問它的項目主頁https://github.com/twbs/bootstrap,點“Fork”就在自己的賬號下克隆了一個bootstrap倉庫,然後,從自己的賬號下clone:

git clone git@github.com:hanmeng1023/bootstrap.git

一定要從自己的賬號下clone倉庫,這樣你才能推送修改

你修複bootstrap的一個bug,或者新增一個功能後,往自己的倉庫推送。如果你希望bootstrap的官方庫能接受你的修改,你就可以在GitHub上發起一個pull request。當然,對方是否接受你的pull request就不一定了

使用碼雲

使用GitHub時,經常遇到的問題是訪問速度太慢,有時候還會出現無法連接的情況(原因你懂的)。此時就可以使用國內的Git托管服務——碼雲(gitee.com)。和GitHub相比,碼雲也提供免費的Git倉庫,並且,免費版本還包含私有庫。此外,還集成了代碼質量檢測、項目演示等功能。對於團隊協作開發,碼雲還提供了項目管理、代碼托管、文檔管理的服務,5人以下小團隊免費。

使用碼雲和使用GitHub類似,我們在碼雲上注冊賬號並登錄後,需要先上傳自己的SSH公鑰。選擇右上角用戶頭像 -> 菜單“修改資料”,然後選擇“SSH公鑰”,填寫一個便於識別的標題,然後把用戶主目錄下的.ssh/id_rsa.pub文件的內容粘貼進去。點擊“確定”即可完成並看到剛才添加的Key。

如果已經有了一個本地的git倉庫(例如,一個名為learngit的本地庫),如何把它關聯到碼雲的遠程庫上呢?首先,我們在碼雲上創建一個新的項目,選擇右上角用戶頭像 -> 菜單“控製麵板”,然後點擊“創建項目”;項目名稱最好與本地庫保持一致;然後,我們在本地庫上使用命令git remote add把它和碼雲的遠程庫關聯

git remote add origin git@gitee.com:hanmeng1023/learngit.git

之後,就可以正常地用git push和git pull推送了。如果在使用命令git remote add時報錯,這說明本地庫已經關聯了一個名叫origin的遠程庫,此時,可以先用git remote -v查看遠程庫信息;如果看到本地庫確實已經關聯了origin的遠程庫,並且,該遠程庫指向GitHub;我們可以刪除已有的GitHub遠程庫

git remote rm origin

再關聯碼雲的遠程庫(注意路徑中需要填寫正確的用戶名):

git remote add origin git@gitee.com:hanmeng1023/learngit.git

那麼一個本地庫能不能既關聯GitHub,又關聯碼雲呢?答案是肯定的,因為git本身是分布式版本控製係統,可以同步到另外一個遠程庫,當然也可以同步到另外兩個遠程庫。使用多個遠程庫時,我們要注意,git給遠程庫起的默認名稱是origin,如果有多個遠程庫,我們需要用不同的名稱來標識不同的遠程庫。

如果要推送到GitHub,使用命令:

git push github master

如果要推送到碼雲,使用命令:

git push gitee master

這樣一來,我們的本地庫就可以同時與多個遠程庫互相同步

碼雲也同樣提供了Pull request功能,可以讓其他小夥伴參與到開源項目中來

自定義Git

之前我們已經配置了user.name和user.email,實際上,Git還有很多可配置項。比如,讓Git顯示顏色,會讓命令輸出看起來更醒目:

git config --global color.ui true

在Git工作區的根目錄下創建一個特殊的.gitignore文件,然後把不能提交的文件名填進去,Git就會自動忽略這些文件。不需要從頭寫.gitignore文件,GitHub已經為我們準備了各種配置文件,隻需要組合一下就可以使用

忽略文件的原則是:

1.忽略操作係統自動生成的文件,比如縮略圖等;

2.忽略編譯生成的中間文件、可執行文件等,也就是如果一個文件是通過另一個文件自動生成的,那自動生成的文件就沒必要放進版本庫,比如Java編譯產生的.class文件;

3.忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件

最後一步就是把.gitignore也提交到Git!當然檢驗.gitignore的標準是git status命令是不是說working directory clean

使用Windows的童鞋注意了,如果你在資源管理器裏新建一個.gitignore文件,它會非常弱智地提示你必須輸入文件名,但是在文本編輯器裏“保存”或者“另存為”就可以把文件保存為.gitignore了

有些時候,你想添加一個文件到Git,但發現添加不了,原因是這個文件被.gitignore忽略了;如果你確實想添加該文件,可以用-f強製添加到Git:

git add -f filename

或者你發現,可能是.gitignore寫得有問題,需要找出來到底哪個規則寫錯了,可以用git check-ignore命令檢查:

git check-ignore -v filename

可以給命令添加別名,例如:

git config --global alias.st status //用st表示status

--global參數是全局參數,也就是這些命令在這台電腦的所有Git倉庫下都有用

也可以給撤銷(unstage)事件配置別名:

git config --global alias.unstage 'reset HEAD'

配置一個git last,讓其顯示最後一次提交信息:

git config --global alias.last 'log -1'

這樣,用git last就能顯示最近一次的提交

配置Git的時候,加上--global是針對當前用戶起作用的,如果不加,那隻針對當前的倉庫起作用。每個倉庫的Git配置文件都放在.git/config文件中。配置別名也可以直接修改這個文件,如果改錯了,可以刪掉文件重新通過命令配置

搭建Git服務器

搭建Git服務器需要準備一台運行Linux的機器,強烈推薦用Ubuntu或Debian;這樣,通過幾條簡單的apt命令就可以完成安裝。假設你已經有sudo權限的用戶賬號,下麵,正式開始安裝

1.安裝Git

sudo apt-get install git

2.創建一個git用戶,用來運行git服務

sudo adduser git

3.創建證書登錄:收集所有需要登錄的用戶的公鑰,就是他們自己的id_rsa.pub文件,把所有公鑰導入到/home/git/.ssh/authorized_keys文件裏,一行一個

4.初始化Git倉庫:先選定一個目錄作為Git倉庫,假定是/srv/sample.git,在/srv目錄下輸入命令:

sudo git init --bare sample.git

Git就會創建一個裸倉庫,裸倉庫沒有工作區,因為服務器上的Git倉庫純粹是為了共享,所以不讓用戶直接登錄到服務器上去改工作區,並且服務器上的Git倉庫通常都以.git結尾。然後,把owner改為git:

sudo chown -R git:git sample.git

5.禁用shell登錄:出於安全考慮,第二步創建的git用戶不允許登錄shell,這可以通過編輯/etc/passwd文件完成。找到類似下麵的一行:

git:x:1001:1001:,,,:/home/git:/bin/bash

改為:

git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell

這樣,git用戶可以正常通過ssh使用git,但無法登錄shell,因為我們為git用戶指定的git-shell每次一登錄就自動退出

6.克隆遠程倉庫:現在,可以通過git clone命令克隆遠程倉庫了,在各自的電腦上運行:

git clone git@server:/srv/sample.git

剩下的推送就簡單了

如果團隊很小,把每個人的公鑰收集起來放到服務器的/home/git/.ssh/authorized_keys文件裏就是可行的。如果團隊有幾百號人,就沒法這麼玩了,這時,可以用Gitosis來管理公鑰

因為Git是為Linux源代碼托管而開發的,所以Git也繼承了開源社區的精神,不支持權限控製。不過,因為Git支持鉤子(hook),所以,可以在服務器端編寫一係列腳本來控製提交等操作,達到權限控製的目的。Gitolite就是這個工具

最後更新:2017-09-22 09:33:10

  上一篇:go  機器學習利器——決策樹和隨機森林
  下一篇:go  java 泛型詳解、Java中的泛型方法、 java泛型詳解