git應(yīng)用場景全覆蓋

創(chuàng)建版本庫:

1.初始化一個Git倉庫,使用git init命令。

2.添加文件到Git倉庫,分兩步:
(1)使用命令git add <file>添加文件到暫存區(qū),注意,可反復(fù)多次使用,添加多個文件;
(2)使用命令git commit -m "message"完成本地版本庫的提交。

時光穿梭:

?要隨時掌握工作區(qū)的狀態(tài),使用git status命令。

?如果git status告訴你有文件被修改過,用git diff可以查看修改內(nèi)容。

版本回退:

1.HEAD指向的版本就是當(dāng)前版本,因此,Git允許我們在版本的歷史之間穿梭,使用命令:

git reset --hard commit_id或HEAD^或HEAD~Num

2.穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個版本。

3.要重返未來,用git reflog查看命令歷史,以便確定要回到未來的哪個版本。

工作區(qū)、暫存區(qū)和分支

1.利用git status命令可以查看當(dāng)前目錄(也就是工作區(qū))的狀態(tài)(哪些文件被修改,新添加,有無提交等信息)。

2.利用git add <file>命令可以將file由工作區(qū)添加到暫存區(qū)Stage。

3.利用git commit命令可以將所有暫存區(qū)的文件一次性添加到分支master(缺省分支名)中去。

管理修改:

每次修改,如果不用git add到暫存區(qū),那就不會加入到commit中。

場景1:當(dāng)你改亂了工作區(qū)某個文件的內(nèi)容,想直接丟棄工作區(qū)的修改時,用命令

git checkout --file。 

場景2:當(dāng)你不但改亂了工作區(qū)某個文件的內(nèi)容,還添加到了暫存區(qū)時,想丟棄修改,分兩步:
第一步:用命令git reset HEAD <file>,就回到了場景1;
第二步:按場景1操作。

場景3:已經(jīng)提交了不合適的修改到版本庫時,想要撤銷本次提交,git reset --hard HEAD^,不過前提是沒有推送到遠程庫。

刪除文件:

命令git rm用于刪除一個文件。
如果一個文件已經(jīng)被提交到版本庫,那么你永遠不用擔(dān)心誤刪,但是要小心,你只能恢復(fù)文件到最新版本,你會丟失最近一次提交后你修改的內(nèi)容。

遠程倉庫:

在連接遠程倉庫(自己公司創(chuàng)建的內(nèi)部git服務(wù)器,或是github)上提交自己電腦終端的ssh公鑰

ssh-keygen -t rsa -C "youremail@163.com"

一、先有本地庫,后有遠程庫的時候,如何關(guān)聯(lián)遠程庫:

1)要關(guān)聯(lián)一個遠程庫,在本地git庫中使用以下命令與遠程庫repo-name相關(guān)聯(lián);

git remote add origin git@server-name:path/repo-name.git

2)關(guān)聯(lián)后,使用以下命令第一次推送master分支的所有內(nèi)容;

git push -u origin master

3)此后,每次本地提交后,只要有必要就可以使用以下命令推送最新修改:

git push origin master

分布式版本系統(tǒng)的最大好處之一是在本地工作完全不需要考慮遠程庫的存在,也就是有沒有聯(lián)網(wǎng)都可以正常工作,而SVN在沒有聯(lián)網(wǎng)的時候是拒絕干活的!當(dāng)有網(wǎng)絡(luò)的時候,再把本地提交推送一下就完成了同步,真是太方便了!

二、先創(chuàng)建遠程庫,然后從遠程庫克隆

要克隆一個倉庫,首先必須知道倉庫的地址,然后使用git clone命令克隆。

ssh協(xié)議:
git clone git@github.com:username/reponame.git    
    
https協(xié)議:
git clone https://github.com/username/reponame.git

克隆完了之后,本地和遠端倉庫便自動關(guān)聯(lián)了。Git支持多種協(xié)議,包括https,但通過ssh支持的原生git協(xié)議速度最快。

創(chuàng)建與合并分支:

一般來說,
master是本地默認(rèn)的分支名,他指向當(dāng)前最新提交;
HEAD指向一個分支,而且是當(dāng)前的工作分支。
也即:HEAD --> master --> commit

所謂創(chuàng)建分支就是創(chuàng)建一個指向commit鏈的指針變量

所謂切換當(dāng)前分支就是對HEAD重新賦值,使之指向不同的分支指針變量.

查看分支:git branch
創(chuàng)建分支:git branch <name>
刪除分支:git branch -d <name>
切換分支:git checkout <name>
創(chuàng)建+切換分支:git checkout -b <name>
合并某分支到當(dāng)前分支:git merge <name>

此時,默認(rèn)為快速合并(fast forward),僅僅將master指針指向待合并的分支,不創(chuàng)建新的提交;當(dāng)使用快速合并出現(xiàn)沖突時,就要采用git merge --no-ff <name>此時,將會建立一個新的提交,并將master指向該新提交

解決沖突:

當(dāng)Git無法自動合并分支時,就必須首先解決沖突。解決沖突后,再提交,合并完成。 解決沖突就是把Git合并失敗的文件手動編輯為我們希望的內(nèi)容,再提交。

git status查看沖突的文件;
用以下命令可以看到分支合并圖:

gitlog --graph --pretty=oneline --abbrev -commit

分支管理策略:

在實際開發(fā)中,我們應(yīng)該按照幾個基本原則進行分支管理:

首先,master分支應(yīng)該是非常穩(wěn)定的,也就是僅用來發(fā)布新版本,平時不能在上面干活; 那在哪干活呢?

干活都在dev分支上,也就是說,dev分支是不穩(wěn)定的,到某個時候,比如1.0版本發(fā)布時,再把dev分支合并到master上,在master分支發(fā)布1.0版本;

你和你的小伙伴們每個人都在dev分支上干活,每個人都有自己的分支,時不時地往dev分支上合并就可以了。

合并分支時,加上--no-ff參數(shù)就可以用普通模式合并,合并后的歷史有分支,能看出來曾經(jīng)做過合并,而fast forward合并就看不出來曾經(jīng)做過合并。

Bug分支:

修復(fù)bug時,我們會通過創(chuàng)建新的bug分支進行修復(fù),然后合并,最后刪除;

當(dāng)手頭工作沒有完成時,先把工作現(xiàn)場git stash一下,然后去修復(fù)bug。

修復(fù)后,用git stash list 查看緩存的左右工作現(xiàn)場;

git stash pop恢復(fù)到最近的工作現(xiàn)場,并同時刪除緩存文件;
或用

git stash apply stash@{num}

恢復(fù)到指定的工作現(xiàn)場,但需利用git stash drop手動刪除緩存文件。

Feature分支:

開發(fā)一個新feature,最好新建一個分支;開發(fā)調(diào)試完畢后再合并到dev分支上去。

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

多人協(xié)作:

當(dāng)你從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應(yīng)起來了,并且,遠程倉庫的默認(rèn)名稱是origin。

?查看遠程庫信息,使用git remote -v;

?本地新建的分支如果不推送到遠程,對其他人就是不可見的;

?從本地推送分支,使用

git push origin branch-name

如果推送失敗,先用git pull抓取遠程的新提交;

?在本地創(chuàng)建和遠程分支對應(yīng)的分支,使用

git checkout -b branch-name origin/branch-name

本地和遠程分支的名稱最好一致;

?建立本地分支和遠程分支的關(guān)聯(lián),使用

git branch --set-upstream branch-name origin/branch-name;

?從遠程抓取分支,使用git pull,如果有沖突,要先處理沖突。

多人協(xié)作的工作模式通常是這樣:

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

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

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

4.沒有沖突或者解決掉沖突后,再用

git push origin <branch-name>

推送就能成功!

如果git pull提示no tracking information,則說明本地分支和遠程分支的鏈接關(guān)系沒有創(chuàng)建,用命令

git branch --set-upstream-to <branch-name> origin/<branch-name>

Rebase:

?rebase操作可以把本地未push的分叉提交歷史整理成直線;

?rebase的目的是使得我們在查看歷史提交的變化時更容易,因為分叉的提交需要三方對比。

標(biāo)簽的意義:

Git的標(biāo)簽雖然是版本庫的快照,但其實它就是指向某個commit的指針(跟分支很像,但是分支可以移動,標(biāo)簽不能移動)

所以,創(chuàng)建和刪除標(biāo)簽都是瞬間完成的。tag就是一個容易讓人記住的和某特定提交綁定的版本庫快照。

創(chuàng)建標(biāo)簽:

首先,切換到需要打標(biāo)簽的分支上:

查看所有分支列表: git branch

切換到需要打tag的分支:git checkout <branch_name>

打一個新標(biāo)簽:

git tag <name> [commit_id]

git tag -a <tag_name> -m "instruct strings" [commit_id]

其次,
利用命令git tag查看所有標(biāo)簽;
git show <tag_name>查看指定標(biāo)簽詳細(xì)信息

注意:標(biāo)簽總是和某個commit掛鉤。如果這個commit既出現(xiàn)在master分支,又出現(xiàn)在dev分支,那么在這兩個分支上都可以看到這個標(biāo)簽。

操作標(biāo)簽:

刪除本地標(biāo)簽:git tag -d <tag_name>

推送某個本地標(biāo)簽: git push origin <tag_name>

推送所有本地標(biāo)簽: git push origin --tags

刪除遠程標(biāo)簽:

1.先在本地刪除;
2.git push origin :refs/tags/<tag_name>

GitHub:

?在GitHub上,可以任意Fork開源倉庫;

?自己擁有Fork后的倉庫的讀寫權(quán)限;

?可以推送pull request給官方倉庫來貢獻代碼

gitee:

登錄gitee.com注冊后,添加本地終端的rsa公鑰,而后建立遠程版本庫;

回到本地終端,如果已有版本庫要和遠程端的版本庫相關(guān)聯(lián),可以利用命令

git remote add <name> git@gitee.com:username/respotname.git

注意:如果你的項目同時在github和gitee上開發(fā),需要注意關(guān)聯(lián)時的遠程版本庫名字不能相同;github默認(rèn)為origin,gitee就不能再使用該名字了。

自定義Git:

除了配置user.name和user.email,實際上,Git還有很多可配置項。

比如,讓Git顯示顏色,會讓命令輸出看起來更醒目:

git config --global color.ui true

忽略特殊文件:在git的根目錄下的.gitignore文件中添加需要忽略的文件名即可。當(dāng)然git已經(jīng)幫我們預(yù)先設(shè)立了一些忽略規(guī)則

配置文件:配置Git的時候,加上--global是針對當(dāng)前用戶起作用的,如果不加,那只針對當(dāng)前的倉庫起作用。 每個倉庫的Git配置文件都放在.git/config文件中;當(dāng)前用戶的Git配置文件放在用戶主目錄下的一個隱藏文件.gitconfig中。

搭建git服務(wù)器:


搭建Git服務(wù)器需要準(zhǔn)備一臺運行Linux的機器,強烈推薦用Ubuntu或Debian,這樣,通過幾條簡單的apt命令就可以完成安裝。

第一步,安裝git:

$ sudo apt-get install git

第二步,創(chuàng)建一個git用戶,用來運行g(shù)it服務(wù):

$ sudo adduser git

第三步,創(chuàng)建證書登錄: 收集所有需要登錄的用戶的公鑰,就是他們自己的id_rsa.pub文件,把所有公鑰導(dǎo)入到/home/git/.ssh/authorized_keys文件里,一行一個。

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

$ sudo git init --bare sample.git

Git就會創(chuàng)建一個裸倉庫,裸倉庫沒有工作區(qū),因為服務(wù)器上的Git倉庫純粹是為了共享,所以不讓用戶直接登錄到服務(wù)器上去改工作區(qū),并且服務(wù)器上的Git倉庫通常都以.git結(jié)尾。

然后,把owner改為git:

$ sudo chown -R git:git sample.git

第五步,禁用shell登錄:

出于安全考慮,第二步創(chuàng)建的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,因為我們?yōu)間it用戶指定的git-shell每次一登錄就自動退出。

第六步,克隆遠程倉庫:
現(xiàn)在,可以通過git clone命令克隆遠程倉庫了,在各自的電腦上運行:

 $ git clone git@server:/srv/sample.git
                                            Cloning into 'sample'...
                                            warning: You appear to have cloned an empty repository.

管理公鑰:

如果團隊很小,把每個人的公鑰收集起來放到服務(wù)器的/home/git/.ssh/authorized_keys文件里就是可行的。

如果團隊有幾百號人,就沒法這么玩了,這時,可以用Gitosis來管理公鑰。 因為Git是為Linux源代碼托管而開發(fā)的,所以Git也繼承了開源社區(qū)的精神,不支持權(quán)限控制。

不過,因為Git支持鉤子(hook),所以,可以在服務(wù)器端編寫一系列腳本來控制提交等操作,達到權(quán)限控制的目的。

Gitolite就是這個工具。 這里我們也不介紹Gitolite了,不要把有限的生命浪費到權(quán)限斗爭中。

小結(jié)

  • 搭建Git服務(wù)器非常簡單,通常10分鐘即可完成;
  • 要方便管理公鑰,用Gitosis;
  • 要像SVN那樣變態(tài)地控制權(quán)限,用Gitolite。

===========我是華麗的分割線===========


更多知識:
點擊關(guān)注專題:嵌入式Linux&ARM

或瀏覽器打開:http://m.itdecent.cn/c/42d33cadb1c1

或掃描二維碼:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Git常用語法 [TOC] Git簡介 描述 ? Git(讀音為/g?t/。)是一個開源的分布式版本控制系統(tǒng),...
    君惜丶閱讀 3,963評論 0 13
  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,863評論 9 163
  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git,從https:/...
    落魂灬閱讀 12,850評論 4 54
  • 文/迎風(fēng)奔跑 01遠游求學(xué) 那一年,年少的我,離開生活十多年的城市到另外一個城市求學(xué),這是我第二次出遠門,帶著好奇...
    c迎風(fēng)奔跑閱讀 538評論 7 9
  • 在不起眼的墻角 這里存留著一抹黑 像是畫家用手中的畫筆 輕輕的描繪在人間的痕跡 在夜的懷抱中 她是一個寵兒 她用自...
    Josan喬閱讀 144評論 0 1

友情鏈接更多精彩內(nèi)容