git教程
1、準備
準備工具:notepad++,git安裝包
安裝notepad++,git
開啟git bash
cd 命令進入到操作目錄
[
pwd
] 顯示當前目錄[
ls
] 顯示當前目錄內檔案[
-ah
] 顯示當前目錄內所有檔案(包括隱藏檔案)
2、初步操作
全域性配置:
設定使用者名稱和郵箱
$ git config ——global user。name “Your Name”$ git config ——global user。email “email@example。com”
[
reset
] 清屏
初始化一個Git倉庫,使用git init命令:
git init
新增檔案到Git倉庫,分兩步:
git add
注意,可反覆多次使用,新增多個檔案;
使用以下命令提交到git倉庫暫存區
git commit -m
3、修改檢視
修改後使用以下命令檢視當前狀態
git status
使用以下命令可以檢視修改內容
gif diff
修改後重新提交步聚:
git add 修改的檔名git commit 修改的檔名
4、版本跳轉
檢視修改日誌git log 如果嫌輸出資訊太多,看得眼花繚亂的,可以試試加上——pretty=oneline引數: git log ——pretty=oneline 命令列中一大串類似1094adb。。。的是commit id(版本號),是一個SHA1計算出來的一個非常大的數字,用十六進位制表示
版本回退: HEAD指向的版本就是當前版本, HEAD就是上一個版本,上上一個版本就是HEAD^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100。 回退上一個版本:
$ git reset ——hard HEAD^
Git允許我們在版本的歷史之間穿梭,使用命令git reset ——hard commit_id。
穿梭前,用git log可以檢視提交歷史,以便確定要回退到哪個版本。
要重返未來,用git reflog檢視命令歷史,以便確定要回到未來的哪個版本。
5、工作區與暫存區
工作區(Working Directory)就是我們操作的目錄 版本庫(Repository) 工作區有一個隱藏目錄。git,這個不算工作區,而是Git的版本庫。 暫存區(stage): Git的版本庫裡存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區, 還有Git為我們自動建立的第一個分支master,以及指向master的一個指標叫HEAD。 因為我們建立Git版本庫時,Git自動為我們建立了唯一一個master分支, 第一步是用git add把檔案新增進去,實際上就是把檔案修改新增到暫存區; 第二步是用git commit提交更改,實際上就是把暫存區的所有內容提交到當前分支master。 git commit就是往master分支上提交更改。
6、修改檔案
每次修改,如果不用git add到暫存區,那就不會加入到commit中。 第一次修改 -> git add -> 第二次修改 -> git add -> git commit
7、回退上一個版本
場景1:當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令git checkout —— file。
場景2:當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD
,就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考 版本回退一節,不過前提是沒有推送到遠端庫。
8、刪除以及恢復
命令git rm用於刪除一個檔案。如果一個檔案已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心, 你只能恢復檔案到最新版本,你會丟失最近一次提交後你修改的內容。 恢復操作: $ git checkout —— 檔名
9、連線遠端倉庫
要關聯一個遠端庫,使用命令
git remote add origin git@server-name:path/repo-name。git
;
關聯後,使用命令
git push -u origin master
第一次推送master分支的所有內容;
此後,每次本地提交後,只要有必要,就可以使用命令
git push origin master
推送最新修改;
git remote add origin https://github。com/prcool/git。git(倉庫地址)
git push origin與git push -u origin master的區別
$ git push origin
上面命令表示,將當前分支推送到origin主機的對應分支。
如果當前分支只有一個追蹤分支,那麼主機名都可以省略。
$ git push
如果當前分支與多個主機存在追蹤關係,那麼這個時候-u選項會指定一個預設主機,這樣後面就可以不加任何引數使用git push。
$ git push -u origin master
上面命令將本地的master分支推送到origin主機,同時指定origin為預設主機,後面就可以不加任何引數使用git push了。
不帶任何引數的git push,預設只推送當前分支,這叫做simple方式。此外,還有一種matching方式,會推送所有有對應的遠端分支的本地分支。Git 2。0版本之前,預設採用matching方法,現在改為預設採用simple方式。
生成ssh公鑰
$ ssh-keygen -t rsa -C “youremail@example。com”
ssh-keygen -t rsa -C “463852090@qq。com”
ssh-keygen -t rsa -C “463852090@qq。com”
在繼續閱讀後續內容前,請自行註冊GitHub賬號。由於你的本地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” 你需要把郵件地址換成你自己的郵件地址,然後一路回車,使用預設值即可,由於這個Key也不是用於軍事目的,所以也無需設定密碼。
如果一切順利的話,可以在使用者主目錄裡找到。ssh目錄,裡面有id_rsa和id_rsa。pub兩個檔案,這兩個就是SSH Key的秘鑰對,id_rsa是私鑰,不能洩露出去,id_rsa。pub是公鑰,可以放心地告訴任何人。
第2步:登陸GitHub,開啟“Account settings”,“SSH Keys”頁面:
然後,點“Add SSH Key”,填上任意Title,在Key文字框裡貼上id_rsa。pub檔案的內容。 點“Add Key”,你就應該看到已經新增的Key:
第3步:新建倉庫 在github中新建倉庫 第4步:遠端連線
git remote add origin git@github。com:github使用者名稱/倉庫名。git
git remote add origin git@github。com:prcool/test。git
git remote add origin git@github。com:prcool/prcool。git
git remote add origin git@gitee。com:prcool/pro-heima。git
若為gitee碼雲,
git remote add origin git@gitee。com:prcool/prcool。git
修改ssh存放地址: /d/front end engineering/git/ssh/id_rsa 複製公鑰 clip < ~/。ssh/id_rsa。pub
命令流程: 新建公鑰: ssh-keygen -t rsa -C “463852090@qq。com” 新建倉庫, 遠端連線: git remote add origin git@github。com:github使用者名稱/倉庫名。git git push -u origin master
命令流程:
echo “# prcool” >> README。mdgit initgit add README。mdgit commit -m “first commit”git remote add origin https://github。com/prcool/prcool。gitgit push -u origin master
SSH警告 當你第一次使用Git的clone或者push命令連線GitHub時,會得到一個警告:
The authenticity of host ‘github。com (xx。xx。xx。xx)’ can‘t be established。 RSA key fingerprint is xx。xx。xx。xx。xx。 Are you sure you want to continue connecting (yes/no)? 這是因為Git使用SSH連線,而SSH連線在第一次驗證GitHub伺服器的Key時,需要你確認GitHub的Key的指紋資訊是否真的來自GitHub的伺服器,輸入yes回車即可。
Git會輸出一個警告,告訴你已經把GitHub的Key新增到本機的一個信任列表裡了:
Warning: Permanently added ’github。com‘ (RSA) to the list of known hosts。 這個警告只會出現一次,後面的操作就不會有任何警告了。
要關聯一個遠端庫,使用命令git remote add origin git@server-name:path/repo-name。git;
關聯後,使用命令git push -u origin master第一次推送master分支的所有內容;
此後,每次本地提交後,只要有必要,就可以使用命令git push origin master推送最新修改;
分散式版本系統的最大好處之一是在本地工作完全不需要考慮遠端庫的存在,也就是有沒有聯網都可以正常工作,而SVN在沒有聯網的時候是拒絕幹活的!當有網路的時候,再把本地提交推送一下就完成了同步,真是太方便了!
10、克隆
git clone git@github。com:prcool/test。git
git clone git@gitee。com:prcool/pr-heima。git克隆後會在本地工作區目錄,新建一個資料夾,即為遠端克隆的檔案
如果有多個人協作開發,那麼每個人各自從遠端克隆一份就可以了。
你也許還注意到,GitHub給出的地址不止一個,還可以用https://github。com/michaelliao/gitskills。git這樣的地址。實際上,Git支援多種協議,預設的git://使用ssh,但也可以使用https等其他協議。
使用https除了速度慢以外,還有個最大的麻煩是每次推送都必須輸入口令,但是在某些只開放http埠的公司內部就無法使用ssh協議而只能用https。
小結 要克隆一個倉庫,首先必須知道倉庫的地址,然後使用git clone命令克隆。
Git支援多種協議,包括https,但透過ssh支援的原生git協議速度最快。
11、分支
建立分支git branch 分支名 切換到分支 git checkout 分支名 建立並切換到分支 git branch -b 分支名 例:git checkout -b dev
檢視當前分支:git branch git branch命令會列出所有分支,當前分支前面會標一個*號。 切換回主分支: git checkout master
把分支的工作成果合併到master分支上: git merge 分支名
git merge命令用於合併指定分支到當前分支。 合併完後可以刪除分支: git branch -d 分支名
Git鼓勵大量使用分支:
檢視分支:git branch
建立分支:git branch
切換分支:git checkout
建立+切換分支:git checkout -b
合併某分支到當前分支:git merge
刪除分支:git branch -d
12、解決分支合併的衝突conflict
當Git無法自動合併分支時,就必須首先解決衝突。解決衝突後,再提交,合併完成。
解決衝突就是把Git合併失敗的檔案手動編輯為我們希望的內容,再提交。
用git log ——graph命令可以看到分支合併圖。
分支策略 在實際開發中,我們應該按照幾個基本原則進行分支管理:
首先,master分支應該是非常穩定的,也就是僅用來發布新版本,平時不能在上面幹活;
那在哪幹活呢?幹活都在dev分支上,也就是說,dev分支是不穩定的,到某個時候,比如1。0版本釋出時,再把dev分支合併到master上,在master分支釋出1。0版本;
你和你的小夥伴們每個人都在dev分支上幹活,每個人都有自己的分支,時不時地往dev分支上合併就可以了。 Git分支十分強大,在團隊開發中應該充分應用。
合併分支時,加上——no-ff引數就可以用普通模式合併,合併後的歷史有分支, 能看出來曾經做過合併,而fast forward合併就看不出來曾經做過合併
檢視分支歷史: $ git log ——graph ——pretty=oneline ——abbrev-commit
git 在pull或者合併分支的時候有時會遇到這個介面。可以不管(直接下面3,4步),如果要輸入解釋的話就需要:
1。按鍵盤字母 i 進入insert模式
2。修改最上面那行黃色合併資訊,可以不修改
3。按鍵盤左上角“Esc”
4。輸入“:wq”,注意是冒號+wq,按回車鍵即可
13、bug分支
修復bug時,我們會透過建立新的bug分支進行修復,然後合併,最後刪除;
當手頭工作沒有完成時,先把工作現場git stash一下,然後去修復bug,修復後,再git stash pop,回到工作現場。
首先,假如我的工作區是dev分支,現在發現master上有bug: 先在自己的工作區dev上使用命令git stash git stash 可以把當前工作現場“儲藏”起來,等以後恢復現場後繼續工作: 用git status檢視工作區,就是乾淨的(除非有沒有被Git管理的檔案),因此可以放心地建立分支來修復bug。 首先確定要在哪個分支上修復bug,假定需要在master分支上修復,就從master建立臨時分支: git checkout master git checkout -b issue-101 修復bug,修復完後,然後提交: git commit -m “fix bug 101” 修復完成後,切換到master分支,並完成合並,最後刪除issue-101分支: git checkout master git merge ——no-ff -m “merged bug fix 101” issue-101 現在,是時候接著回到dev分支幹活了! git checkout dev git status 工作區是乾淨的,剛才的工作現場存到哪去了?用git stash list命令看看: git stash list 工作現場還在,Git把stash內容存在某個地方了,但是需要恢復一下,有兩個辦法:
一是用git stash apply恢復,但是恢復後,stash內容並不刪除,你需要用git stash drop來刪除;
另一種方式是用git stash pop,恢復的同時把stash內容也刪了: 再用git stash list檢視,就看不到任何stash內容了: $ git stash list 你可以多次stash,恢復的時候,先用git stash list檢視,然後恢復指定的stash,用命令:
$ git stash apply stash@{0}
14、強行刪除
開發一個新feature,最好新建一個分支;
如果要丟棄一個沒有被合併過的分支,可以透過git branch -D
強行刪除。
15、多人協作
要檢視遠端庫的資訊,用git remote: $ git remote 用git remote -v顯示更詳細的資訊:如果沒有推送許可權,就看不到push的地址。
推送分支: 就是把該分支上的所有本地提交推送到遠端庫。推送時,要指定本地分支,這樣,Git就會把該分支推送到遠端庫對應的遠端分支上: 如果要推送其他分支,比如,就改成: git push origin dev
master分支是主分支,因此要時刻與遠端同步;
dev分支是開發分支,團隊所有成員都需要在上面工作,所以也需要與遠端同步;
bug分支只用於在本地修復bug,就沒必要推到遠端了,除非老闆要看看你每週到底修復了幾個bug;
feature分支是否推到遠端,取決於你是否和你的小夥伴合作在上面開發。
因此,多人協作的工作模式通常是這樣:
首先,可以試圖用git push origin
推送自己的修改;
如果推送失敗,則因為遠端分支比你的本地更新,需要先用git pull試圖合併;
如果合併有衝突,則解決衝突,並在本地提交;
沒有衝突或者解決掉衝突後,再用git push origin
推送就能成功!
如果git pull提示no tracking information,則說明本地分支和遠端分支的連結關係沒有建立, 用命令git branch ——set-upstream-to
origin/
。
這就是多人協作的工作模式,一旦熟悉了,就非常簡單。
小結 檢視遠端庫資訊,使用git remote -v;
本地新建的分支如果不推送到遠端,對其他人就是不可見的;
從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠端的新提交;
在本地建立和遠端分支對應的分支,使用git checkout -b branch-name origin/branch-name,本地和遠端分支的名稱最好一致;
建立本地分支和遠端分支的關聯,使用git branch ——set-upstream branch-name origin/branch-name;
從遠端抓取分支,使用git pull,如果有衝突,要先處理衝突。
注意: git pull 失敗 ,提示:fatal: refusing to merge unrelated histories
其實這個問題是因為 兩個 根本不相干的 git 庫, 一個是本地庫, 一個是遠端庫, 然後本地要去推送到遠端, 遠端覺得這個本地庫跟自己不相干, 所以告知無法合併
具體的方法, 一個種方法: 是 從遠端庫拉下來程式碼 , 本地要加入的程式碼放到遠端庫下載到本地的庫, 然後提交上去 , 因為這樣的話, 你基於的庫就是遠端的庫, 這是一次update了
第二種方法: 使用這個強制的方法
git pull origin master ——allow-unrelated-histories
後面加上 ——allow-unrelated-histories , 把兩段不相干的 分支進行強行合併
後面再push就可以了 git push gitlab master:init gitlab是別名 , 使用
Java程式碼 git remote add gitlab ssh://xzh@192。168。1。91:50022/opt/gitrepo/withholdings/WithholdingTransaction
master是本地的branch名字 init是遠端要推送的branch名字
本地必須要先add ,commit完了 才能推上去
關於這個問題,可以參考http://stackoverflow。com/questions/37937984/git-refusing-to-merge-unrelated-histories。
在進行git pull 時,新增一個可選項
git pull origin master ——allow-unrelated-histories
16、rebase
小結 rebase操作可以把本地未push的分叉提交歷史整理成直線;
rebase的目的是使得我們在檢視歷史提交的變化時更容易,因為分叉的提交需要三方對比。
17、建立標籤
小結 命令git tag
用於新建一個標籤,預設為HEAD,也可以指定一個commit id;
命令git tag -a
-m “blablabla。。。”可以指定標籤資訊;
命令git tag可以檢視所有標籤。
在Git中打標籤非常簡單,首先,切換到需要打標籤的分支上:
$ git branch
dev master $ git checkout master Switched to branch ’master‘ 然後,敲命令git tag
就可以打一個新標籤:
$ git tag v1。0 可以用命令git tag檢視所有標籤:
$ git tag v1。0 預設標籤是打在最新提交的commit上的。有時候,如果忘了打標籤,比如,現在已經是週五了,但應該在週一打的標籤沒有打,怎麼辦?
方法是找到歷史提交的commit id,然後打上就可以了:
比方說要對add merge這次提交打標籤,它對應的commit id是f52c633,敲入命令:
$ git tag v0。9 f52c633 再用命令git tag檢視標籤:
注意,標籤不是按時間順序列出,而是按字母排序的。可以用檢視標籤資訊: git show v0。9 還可以建立帶有說明的標籤,用-a指定標籤名,-m指定說明文字:
$ git tag -a v0。1 -m “version 0。1 released” 1094adb 用命令git show
可以看到說明文字:
$ git show v0。1
如果標籤打錯了,也可以刪除:
$ git tag -d v0。1 因為建立的標籤都只儲存在本地,不會自動推送到遠端。所以,打錯的標籤可以在本地安全刪除。
如果要推送某個標籤到遠端,使用命令git push origin
: $ git push origin v1。0 或者,一次性推送全部尚未推送到遠端的本地標籤:
$ git push origin ——tags 如果標籤已經推送到遠端,要刪除遠端標籤就麻煩一點,先從本地刪除:
$ git tag -d v0。9 然後,從遠端刪除。刪除命令也是push,但是格式如下:
$ git push origin :refs/tags/v0。9 要看看是否真的從遠端庫刪除了標籤,可以登陸GitHub檢視。 小結 命令git push origin
可以推送一個本地標籤;
命令git push origin ——tags可以推送全部未推送過的本地標籤;
命令git tag -d
可以刪除一個本地標籤;
命令git push origin :refs/tags/
可以刪除一個遠端標籤。
18、使用github
小結 在GitHub上,可以任意Fork開源倉庫;
自己擁有Fork後的倉庫的讀寫許可權;
可以推送pull request給官方倉庫來貢獻程式碼。
19、使用碼雲
先在碼雲上建立倉庫
然後,我們在本地庫上使用命令
git remote add
把它和Gitee的遠端庫關聯:
git remote add origin git@gitee。com:liaoxuefeng/learngit。git
之後,就可以正常地用
git push
和
git pull
推送了!
如果在使用命令
git remote add
時報錯:
git remote add origin git@gitee。com:liaoxuefeng/learngit。gitfatal: remote origin already exists。
這說明本地庫已經關聯了一個名叫
origin
的遠端庫,此時,可以先用
git remote -v
檢視遠端庫資訊:
git remote -vorigin git@github。com:michaelliao/learngit。git (fetch)origin git@github。com:michaelliao/learngit。git (push)
可以看到,本地庫已經關聯了
origin
的遠端庫,並且,該遠端庫指向GitHub。
我們可以刪除已有的GitHub遠端庫:
git remote rm origin
再關聯Gitee的遠端庫(注意路徑中需要填寫正確的使用者名稱):
git remote add origin git@gitee。com:liaoxuefeng/learngit。git
此時,我們再檢視遠端庫資訊:
git remote -vorigin git@gitee。com:liaoxuefeng/learngit。git (fetch)origin git@gitee。com:liaoxuefeng/learngit。git (push)
現在可以看到,origin已經被關聯到Gitee的遠端庫了。透過
git push
命令就可以把本地庫推送到Gitee上。
有的小夥伴又要問了,一個本地庫能不能既關聯GitHub,又關聯Gitee呢?
答案是肯定的,因為git本身是分散式版本控制系統,可以同步到另外一個遠端庫,當然也可以同步到另外兩個遠端庫。
使用多個遠端庫時,我們要注意,git給遠端庫起的預設名稱是
origin
,如果有多個遠端庫,我們需要用不同的名稱來標識不同的遠端庫。
仍然以
learngit
本地庫為例,我們先刪除已關聯的名為
origin
的遠端庫:
git remote rm origin
然後,先關聯GitHub的遠端庫:
git remote add github git@github。com:michaelliao/learngit。git
注意,遠端庫的名稱叫
github
,不叫
origin
了。
接著,再關聯Gitee的遠端庫:
git remote add gitee git@gitee。com:liaoxuefeng/learngit。git
同樣注意,遠端庫的名稱叫
gitee
,不叫
origin
。
現在,我們用
git remote -v
檢視遠端庫資訊,可以看到兩個遠端庫:
git remote -vgitee git@gitee。com:liaoxuefeng/learngit。git (fetch)gitee git@gitee。com:liaoxuefeng/learngit。git (push)github git@github。com:michaelliao/learngit。git (fetch)github git@github。com:michaelliao/learngit。git (push)
如果要推送到GitHub,使用命令:
git push github master
如果要推送到Gitee,使用命令:
git push gitee master
這樣一來,我們的本地庫就可以同時與多個遠端庫互相同步:
使用多個遠端庫時,我們要注意,git給遠端庫起的預設名稱是origin,如果有多個遠端庫,我們需要用不同的名稱來標識不同的遠端庫。
仍然以learngit本地庫為例,我們先刪除已關聯的名為origin的遠端庫:
git remote rm origin 然後,先關聯GitHub的遠端庫:
git remote add github git@github。com:michaelliao/learngit。git 注意,遠端庫的名稱叫github,不叫origin了。
接著,再關聯碼雲的遠端庫:
git remote add gitee git@gitee。com:liaoxuefeng/learngit。git 同樣注意,遠端庫的名稱叫gitee,不叫origin。
現在,我們用git remote -v檢視遠端庫資訊,可以看到兩個遠端庫:
git remote -v gitee git@gitee。com:liaoxuefeng/learngit。git (fetch) gitee git@gitee。com:liaoxuefeng/learngit。git (push) github git@github。com:michaelliao/learngit。git (fetch) github git@github。com:michaelliao/learngit。git (push) 如果要推送到GitHub,使用命令:
git push github master 如果要推送到碼雲,使用命令:
git push gitee master 這樣一來,我們的本地庫就可以同時與多個遠端庫互相同步
20、忽略特殊檔案
忽略特殊檔案 閱讀: 508162 有些時候,你必須把某些檔案放到Git工作目錄中,但又不能提交它們,比如儲存了資料庫密碼的配置檔案啦,等等,每次git status都會顯示Untracked files 。。。,有強迫症的童鞋心裡肯定不爽。
好在Git考慮到了大家的感受,這個問題解決起來也很簡單,在Git工作區的根目錄下建立一個特殊的。gitignore檔案,然後把要忽略的檔名填進去,Git就會自動忽略這些檔案。
不需要從頭寫。gitignore檔案,GitHub已經為我們準備了各種配置檔案,只需要組合一下就可以使用了。所有配置檔案可以直接線上瀏覽:https://github。com/github/gitignore
忽略檔案的原則是:
忽略作業系統自動生成的檔案,比如縮圖等; 忽略編譯生成的中間檔案、可執行檔案等,也就是如果一個檔案是透過另一個檔案自動生成的,那自動生成的檔案就沒必要放進版本庫,比如Java編譯產生的。class檔案; 忽略你自己的帶有敏感資訊的配置檔案,比如存放口令的配置檔案。 舉個例子:
假設你在Windows下進行Python開發,Windows會自動在有圖片的目錄下生成隱藏的縮圖檔案,如果有自定義目錄,目錄下就會有Desktop。ini檔案,因此你需要忽略Windows自動生成的垃圾檔案:
Windows:
Thumbs。db ehthumbs。db Desktop。ini 然後,繼續忽略Python編譯產生的。pyc、。pyo、dist等檔案或目錄:
Python:
*。py[cod] *。so *。egg *。egg-info dist build 加上你自己定義的檔案,最終得到一個完整的。gitignore檔案,內容如下:
Windows:
Thumbs。db ehthumbs。db Desktop。ini
Python:
*。py[cod] *。so *。egg *。egg-info dist build
My configurations:
db。ini deploy_key_rsa 最後一步就是把。gitignore也提交到Git,就完成了!當然檢驗。gitignore的標準是git status命令是不是說working directory clean。
使用Windows的童鞋注意了,如果你在資源管理器裡新建一個。gitignore檔案,它會非常弱智地提示你必須輸入檔名,但是在文字編輯器裡“儲存”或者“另存為”就可以把檔案儲存為。gitignore了。
有些時候,你想新增一個檔案到Git,但發現新增不了,原因是這個檔案被。gitignore忽略了:
$ git add App。class The following paths are ignored by one of your 。gitignore files: App。class Use -f if you really want to add them。 如果你確實想新增該檔案,可以用-f強制新增到Git:
$ git add -f App。class 或者你發現,可能是。gitignore寫得有問題,需要找出來到底哪個規則寫錯了,可以用git check-ignore命令檢查:
$ git check-ignore -v App。class 。gitignore:3:*。class App。class Git會告訴我們,。gitignore的第3行規則忽略了該檔案,於是我們就可以知道應該修訂哪個規則。
小結 忽略某些檔案時,需要編寫。gitignore;
。gitignore檔案本身要放到版本庫裡,並且可以對。gitignore做版本管理!
21、配置別名 配置別名 閱讀: 254530 有沒有經常敲錯命令?比如git status?status這個單詞真心不好記。
如果敲git st就表示git status那就簡單多了,當然這種偷懶的辦法我們是極力贊成的。
我們只需要敲一行命令,告訴Git,以後st就表示status:
$ git config ——global alias。st status 好了,現在敲git st看看效果。
當然還有別的命令可以簡寫,很多人都用co表示checkout,ci表示commit,br表示branch:
git config ——global alias。ci commit $ git config ——global alias。br branch 以後提交就可以簡寫成:
$ git ci -m “bala bala bala。。。” ——global引數是全域性引數,也就是這些命令在這臺電腦的所有Git倉庫下都有用。
在撤銷修改一節中,我們知道,命令git reset HEAD file可以把暫存區的修改撤銷掉(unstage),重新放回工作區。既然是一個unstage操作,就可以配置一個unstage別名:
$ git config ——global alias。unstage ’reset HEAD‘ 當你敲入命令:
$ git unstage test。py 實際上Git執行的是:
$ git reset HEAD test。py 配置一個git last,讓其顯示最後一次提交資訊:
$ git config ——global alias。last ’log -1‘ 這樣,用git last就能顯示最近一次的提交:
$ git last commit adca45d317e6d8a4b23f9811c3d7b7f0f180bfe2 Merge: bd6ae48 291bea8 Author: Michael Liao askxuefeng@gmail。com Date: Thu Aug 22 22:49:22 2013 +0800
merge & fix hello。py
甚至還有人喪心病狂地把lg配置成了:
git config ——global alias。lg “log ——color ——graph ——pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset‘ ——abbrev-commit” 來看看git lg的效果:
git-lg
為什麼不早點告訴我?別激動,咱不是為了多記幾個英文單詞嘛!
配置檔案 配置Git的時候,加上——global是針對當前使用者起作用的,如果不加,那隻針對當前的倉庫起作用。
配置檔案放哪了?每個倉庫的Git配置檔案都放在。git/config檔案中:
$ cat 。git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true ignorecase = true precomposeunicode = true [remote “origin”] url = git@github。com:michaelliao/learngit。git fetch = +refs/heads/
:refs/remotes/origin/
[branch “master”] remote = origin merge = refs/heads/master [alias] last = log -1 別名就在[alias]後面,要刪除別名,直接把對應的行刪掉即可。
而當前使用者的Git配置檔案放在使用者主目錄下的一個隱藏檔案。gitconfig中:
$ cat 。gitconfig [alias] co = checkout ci = commit br = branch st = status [user] name = Your Name email = your@email。com 配置別名也可以直接修改這個檔案,如果改錯了,可以刪掉檔案重新透過命令配置。
小結 給Git配置好別名,就可以輸入命令時偷個懶。我們鼓勵偷懶。
22、搭建git伺服器 搭建Git伺服器 閱讀: 919546 在遠端倉庫一節中,我們講了遠端倉庫實際上和本地倉庫沒啥不同,純粹為了7x24小時開機並交換大家的修改。
GitHub就是一個免費託管開原始碼的遠端倉庫。但是對於某些視原始碼如生命的商業公司來說,既不想公開原始碼,又捨不得給GitHub交保護費,那就只能自己搭建一臺Git伺服器作為私有倉庫使用。
搭建Git伺服器需要準備一臺執行Linux的機器,強烈推薦用Ubuntu或Debian,這樣,通過幾條簡單的apt命令就可以完成安裝。
假設你已經有sudo許可權的使用者賬號,下面,正式開始安裝。
第一步,安裝git:
$ sudo apt-get install git 第二步,建立一個git使用者,用來執行git服務:
$ sudo adduser git 第三步,建立證書登入:
收集所有需要登入的使用者的公鑰,就是他們自己的id_rsa。pub檔案,把所有公鑰匯入到/home/git/。ssh/authorized_keys檔案裡,一行一個。
第四步,初始化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 第五步,禁用shell登入:
出於安全考慮,第二步建立的git使用者不允許登入shell,這可以透過編輯/etc/passwd檔案完成。找到類似下面的一行:
git❌1001:1001:,,,:/home/git:/bin/bash 改為:
git❌1001:1001:,,,:/home/git:/usr/bin/git-shell 這樣,git使用者可以正常透過ssh使用git,但無法登入shell,因為我們為git使用者指定的git-shell每次一登入就自動退出。
第六步,克隆遠端倉庫:
現在,可以透過git clone命令克隆遠端倉庫了,在各自的電腦上執行:
$ git clone git@server:/srv/sample。git Cloning into ’sample‘。。。 warning: You appear to have cloned an empty repository。 剩下的推送就簡單了。
管理公鑰 如果團隊很小,把每個人的公鑰收集起來放到伺服器的/home/git/。ssh/authorized_keys檔案裡就是可行的。如果團隊有幾百號人,就沒法這麼玩了,這時,可以用Gitosis來管理公鑰。
這裡我們不介紹怎麼玩Gitosis了,幾百號人的團隊基本都在500強了,相信找個高水平的Linux管理員問題不大。
管理許可權 有很多不但視原始碼如生命,而且視員工為竊賊的公司,會在版本控制系統裡設定一套完善的許可權控制,每個人是否有讀寫許可權會精確到每個分支甚至每個目錄下。因為Git是為Linux原始碼託管而開發的,所以Git也繼承了開源社群的精神,不支援許可權控制。不過,因為Git支援鉤子(hook),所以,可以在伺服器端編寫一系列指令碼來控制提交等操作,達到許可權控制的目的。Gitolite就是這個工具。
這裡我們也不介紹Gitolite了,不要把有限的生命浪費到許可權鬥爭中。
小結 搭建Git伺服器非常簡單,通常10分鐘即可完成;
要方便管理公鑰,用Gitosis;
要像SVN那樣變態地控制權限,用Gitolite。
[
reset
]
完整操作步驟
echo “# git” >> README。mdgit initgit add README。mdgit commit -m “first commit”git branch -M mastergit remote add origin https://github。com/prcool/git。git(倉庫地址)git push -u origin master
如果是gitee
請檢視第19章節
轉自Git教程 - 廖雪峰的官方網站 https://www。liaoxuefeng。com/wiki/896043488029600