Git 操作简单总结:廖雪峰教程
?廖雪峰Git教程:Git教程 - 廖雪峰的官方網(wǎng)站
命令總結(jié):
git add a.txt:添加工作區(qū)內(nèi)容到暫存區(qū) git commit -m "first commit":將暫存區(qū)內(nèi)容提交到版本庫(kù)rm a.txt:刪除工作區(qū)的a.txt git rm a.txt:刪除暫存區(qū)的a.txt git commit -m "remove a.txt":刪除版本庫(kù)中的a.txt?
1.設(shè)置、查詢user name, email
-
設(shè)置user name,email
git config --global user.name "user name"
git config --global user.email "email" -
查詢user name,email
git config --global user.name
git config --global user.email
2. 創(chuàng)建版本庫(kù)
首先,選擇一個(gè)合適的地方,創(chuàng)建一個(gè)空目錄;第二步,通過(guò)git init命令把這個(gè)目錄變成Git可以管理的倉(cāng)庫(kù),瞬間Git就把倉(cāng)庫(kù)建好了。
(1)初始化一個(gè)Git倉(cāng)庫(kù),使用git init命令。
(2)添加文件到Git倉(cāng)庫(kù),分兩步:
3. 修改與版本回退
3.1 修改文件
提交修改和提交新文件是一樣的兩步。
-
要隨時(shí)掌握工作區(qū)的狀態(tài),使用git status命令。
-
如果git status告訴你有文件被修改過(guò),用git diff可以查看修改內(nèi)容。
3.2 版本回退
命令:git reset --hard commit_id
?回退到上一個(gè)版本:首先,Git必須知道當(dāng)前版本是哪個(gè)版本,在Git中,用HEAD表示當(dāng)前版本,上一個(gè)版本就是HEAD^,上上一個(gè)版本就是HEAD^^,當(dāng)然往上100個(gè)版本寫(xiě)100個(gè)^比較容易數(shù)不過(guò)來(lái),所以寫(xiě)成HEAD~100。
$ git reset --hard HEAD^ HEAD is now at e475afc add distributed$ git reset --hard 1094a HEAD is now at 83b0afe append GPL(1)HEAD指向的版本就是當(dāng)前版本,因此,Git允許我們?cè)诎姹镜臍v史之間穿梭,使用命令git reset --hard commit_id。
(2)穿梭前,用git log可以查看提交歷史,以便確定要回退到哪個(gè)版本。
git log命令用于查看歷史記錄,命令顯示從最近到最遠(yuǎn)的提交日志,如果嫌輸出信息太多,看得眼花繚亂的,可以試試加上--pretty=oneline參數(shù)
- git log?
- git log?--pretty=oneline?
(3)要重返未來(lái),用git reflog查看命令歷史,以便確定要回到未來(lái)的哪個(gè)版本。
git refloge475afc HEAD@{1}: reset: moving to HEAD^ 1094adb (HEAD -> master) HEAD@{2}: commit: append GPL e475afc HEAD@{3}: commit: add distributed eaadf4e HEAD@{4}: commit (initial): wrote a readme file3.3 撤銷修改
場(chǎng)景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容,想直接丟棄工作區(qū)的修改時(shí),用命令git checkout -- file,如:
git checkout -- readme.txtgit checkout -- file命令中的--很重要,沒(méi)有--,就變成了“切換到另一個(gè)分支”的命令。
場(chǎng)景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容,還添加到了暫存區(qū)時(shí),想丟棄修改,分兩步,第一步用命令git reset HEAD <file>,就回到了場(chǎng)景1,第二步按場(chǎng)景1操作。
git reset HEAD readme.txt git checkout -- readme.txtgit reset命令既可以回退版本,也可以把暫存區(qū)的修改回退到工作區(qū)。當(dāng)我們用HEAD時(shí),表示最新的版本。
場(chǎng)景3:已經(jīng)提交了不合適的修改到版本庫(kù)時(shí),想要撤銷本次提交,參考版本回退一節(jié),不過(guò)前提是沒(méi)有推送到遠(yuǎn)程庫(kù)。
3.4 刪除文件
一般情況下,你通常直接在文件管理器中把沒(méi)用的文件刪了,或者用rm命令刪了:
$ rm test.txt這個(gè)時(shí)候,Git知道你刪除了文件,因此,工作區(qū)和版本庫(kù)就不一致了,git status命令會(huì)立刻告訴你哪些文件被刪除了。
現(xiàn)在你有兩個(gè)選擇:
(1)一是確實(shí)要從版本庫(kù)中刪除該文件,那就用命令git rm刪掉,并且git commit:
$ git rm test.txt rm 'test.txt'$ git commit -m "remove test.txt" [master d46f35e] remove test.txt1 file changed, 1 deletion(-)delete mode 100644 test.txt現(xiàn)在,文件就從版本庫(kù)中被刪除了。
(2)二是刪錯(cuò)了,因?yàn)榘姹編?kù)里還有,所以可以很輕松地把誤刪的文件恢復(fù)到最新版本
$ git checkout -- test.txtgit checkout其實(shí)是用版本庫(kù)里的版本替換工作區(qū)的版本,無(wú)論工作區(qū)是修改還是刪除,都可以“一鍵還原”。
?注意:從來(lái)沒(méi)有被添加到版本庫(kù)就被刪除的文件,是無(wú)法恢復(fù)的!
4.遠(yuǎn)程倉(cāng)庫(kù)
注冊(cè)GitHub賬號(hào),由于本地Git倉(cāng)庫(kù)和GitHub倉(cāng)庫(kù)之間的傳輸是通過(guò)SSH加密的,所以,需要一點(diǎn)設(shè)置:
(1)第1步:創(chuàng)建SSH Key。在你電腦用戶主目錄下(C:\Users\10***\.ssh),看看有沒(méi)有.ssh目錄,如果有,再看看這個(gè)目錄下有沒(méi)有id_rsa和id_rsa.pub這兩個(gè)文件,如果已經(jīng)有了,可直接跳到下一步。如果沒(méi)有,打開(kāi)Shell(Windows下打開(kāi)Git Bash),創(chuàng)建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"需要把郵件地址換成自己的郵件地址,然后一路回車,使用默認(rèn)值即可,由于這個(gè)Key也不是用于軍事目的,所以也無(wú)需設(shè)置密碼。
如果一切順利的話,可以在用戶主目錄里找到.ssh目錄,里面有id_rsa和id_rsa.pub兩個(gè)文件,這兩個(gè)就是SSH Key的秘鑰對(duì),id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
(2)第2步:登陸GitHub,打開(kāi)“Account settings”,“SSH Keys”頁(yè)面:
????????然后,點(diǎn)“Add SSH Key”,填上任意Title,在Key文本框里粘貼id_rsa.pub文件的內(nèi)容,點(diǎn)“Add Key”,你就應(yīng)該看到已經(jīng)添加的Key。
????????為什么GitHub需要SSH Key呢?因?yàn)镚itHub需要識(shí)別出你推送的提交確實(shí)是你推送的,而不是別人冒充的,而Git支持SSH協(xié)議,所以,GitHub只要知道了你的公鑰,就可以確認(rèn)只有你自己才能推送。
????????GitHub允許添加多個(gè)Key。假定你有若干電腦,你一會(huì)兒在公司提交,一會(huì)兒在家里提交,只要把每臺(tái)電腦的Key都添加到GitHub,就可以在每臺(tái)電腦上往GitHub推送了。
4.1 添加遠(yuǎn)程庫(kù)
先有本地庫(kù),后有遠(yuǎn)程庫(kù)的時(shí)候,如何關(guān)聯(lián)遠(yuǎn)程庫(kù)?
(1)要關(guān)聯(lián)一個(gè)遠(yuǎn)程庫(kù),使用命令:
方式1:git協(xié)議 $ git remote add origin git@github.com:your-github-name/repo-name.git方式2:http協(xié)議 $git remote add origin https://github.com/your-github-name/repo-name.git你也許還注意到,GitHub給出的地址不止一個(gè),還可以用https://github.com/michaelliao/gitskills.git這樣的地址。實(shí)際上,Git支持多種協(xié)議,默認(rèn)的git://使用ssh,但也可以使用https等其他協(xié)議。
使用https除了速度慢以外,還有個(gè)最大的麻煩是每次推送都必須輸入口令,但是在某些只開(kāi)放http端口的公司內(nèi)部就無(wú)法使用ssh協(xié)議而只能用https。
(2)關(guān)聯(lián)后,第一次推送master分支的所有內(nèi)容,使用命令:
git push -u origin master(3)此后,每次本地提交后,只要有必要,就可以使用命令推送最新修改:
git push origin master????????分布式版本系統(tǒng)的最大好處之一是在本地工作完全不需要考慮遠(yuǎn)程庫(kù)的存在,也就是有沒(méi)有聯(lián)網(wǎng)都可以正常工作,而SVN在沒(méi)有聯(lián)網(wǎng)的時(shí)候是拒絕干活的!當(dāng)有網(wǎng)絡(luò)的時(shí)候,再把本地提交推送一下就完成了同步,真是太方便了!
4.2?從遠(yuǎn)程庫(kù)克隆
假設(shè)我們從零開(kāi)發(fā),那么最好的方式是先創(chuàng)建遠(yuǎn)程庫(kù),然后,從遠(yuǎn)程庫(kù)克隆。
(1)首先,登陸GitHub,創(chuàng)建一個(gè)新的倉(cāng)庫(kù),名字叫g(shù)itskills。勾選Initialize this repository with a README,這樣GitHub會(huì)自動(dòng)為我們創(chuàng)建一個(gè)README.md文件。創(chuàng)建完畢后,可以看到README.md文件。
(2)現(xiàn)在,遠(yuǎn)程庫(kù)已經(jīng)準(zhǔn)備好了,下一步是用命令git clone克隆一個(gè)本地庫(kù):
$ git clone git@github.com:michaelliao/gitskills.git注意把Git庫(kù)的地址換成你自己的,然后進(jìn)入gitskills目錄看看,已經(jīng)有README.md文件了:
$ cd gitskills $ ls README.md4.3 刪除遠(yuǎn)程倉(cāng)庫(kù)?
- 用git remote -v查看遠(yuǎn)程庫(kù)信息
可以看到,本地庫(kù)已經(jīng)關(guān)聯(lián)了origin的遠(yuǎn)程庫(kù),并且,該遠(yuǎn)程庫(kù)指向GitHub
- 刪除已有的GitHub遠(yuǎn)程庫(kù)
小結(jié)
- 要克隆一個(gè)倉(cāng)庫(kù),首先必須知道倉(cāng)庫(kù)的地址,然后使用git clone命令克隆。
- Git支持多種協(xié)議,包括https,但通過(guò)ssh支持的原生git協(xié)議速度最快。
5.分支管理
5.1 創(chuàng)建與合并分支
Git鼓勵(lì)大量使用分支:
- 查看分支:git branch
- 創(chuàng)建分支:git branch <name>
- 切換分支:git checkout <name>?或者?git switch <name>
- 創(chuàng)建+切換分支:git checkout -b <name>?或者?git switch -c <name>
- 合并某分支到當(dāng)前分支:git merge <name>??“快進(jìn)模式”:Fast-forward
- 刪除分支:git branch -d <name>? ? ? ? ? ??git branch -D <name>?強(qiáng)行刪除
? ???
5.2?解決沖突
當(dāng)master分支和feature1分支各自都分別有新的提交,即變成了下圖這樣,這種情況下,Git無(wú)法執(zhí)行“快速合并”,只能試圖把各自的修改合并起來(lái),但這種合并就可能會(huì)有沖突。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
此時(shí),直接查看readme.txt的內(nèi)容:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
當(dāng)Git無(wú)法自動(dòng)合并分支時(shí),就必須首先解決沖突。解決沖突后,再提交,合并完成。解決沖突就是把Git合并失敗的文件手動(dòng)編輯為我們希望的內(nèi)容,再提交。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
用git log --graph命令可以看到分支合并圖:
$ git log --graph $ git log --graph --pretty=oneline --abbrev-commit? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ??? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
5.3?分支管理策略
- 快進(jìn)模式合并:通常,合并分支時(shí),如果可能,Git會(huì)用Fast forward模式,但這種模式下,刪除分支后,會(huì)丟掉分支信息,看不出來(lái)曾經(jīng)做過(guò)合并。
- 普通模式合并:如果要強(qiáng)制禁用Fast forward模式,Git就會(huì)在merge時(shí)生成一個(gè)新的commit,這樣,從分支歷史上就可以看出分支信息。
?可以看到,不使用Fast forward模式,merge后就像這樣:
分支策略
在實(shí)際開(kāi)發(fā)中,我們應(yīng)該按照幾個(gè)基本原則進(jìn)行分支管理:
- 首先,master分支應(yīng)該是非常穩(wěn)定的,也就是僅用來(lái)發(fā)布新版本,平時(shí)不能在上面干活;
- 那在哪干活呢?干活都在dev分支上,也就是說(shuō),dev分支是不穩(wěn)定的,到某個(gè)時(shí)候,比如1.0版本發(fā)布時(shí),再把dev分支合并到master上,在master分支發(fā)布1.0版本;
- 你和你的小伙伴們每個(gè)人都在dev分支上干活,每個(gè)人都有自己的分支,時(shí)不時(shí)地往dev分支上合并就可以了。
所以,團(tuán)隊(duì)合作的分支看起來(lái)就像這樣:
5.4 Bug分支
修復(fù)bug時(shí),我們會(huì)通過(guò)創(chuàng)建新的bug分支進(jìn)行修復(fù),然后合并,最后刪除;
當(dāng)手頭工作沒(méi)有完成時(shí),先把工作現(xiàn)場(chǎng)git stash一下,然后去修復(fù)bug,修復(fù)后,再git stash pop,回到工作現(xiàn)場(chǎng);
在master分支上修復(fù)的bug,想要合并到當(dāng)前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“復(fù)制”到當(dāng)前分支,避免重復(fù)勞動(dòng)。
5.5?Feature分支
添加一個(gè)新功能時(shí),你肯定不希望因?yàn)橐恍?shí)驗(yàn)性質(zhì)的代碼,把主分支搞亂了,所以,每添加一個(gè)新功能,最好新建一個(gè)feature分支,在上面開(kāi)發(fā),完成后,合并,最后,刪除該feature分支。
- 開(kāi)發(fā)一個(gè)新feature,最好新建一個(gè)分支;
- 如果要丟棄一個(gè)沒(méi)有被合并過(guò)的分支,可以通過(guò):git branch -D <name>?強(qiáng)行刪除。
5.6 多人協(xié)作
(1)查看遠(yuǎn)程庫(kù)的信息
當(dāng)你從遠(yuǎn)程倉(cāng)庫(kù)克隆時(shí),實(shí)際上Git自動(dòng)把本地的master分支和遠(yuǎn)程的master分支對(duì)應(yīng)起來(lái)了,并且,遠(yuǎn)程倉(cāng)庫(kù)的默認(rèn)名稱是origin。
要查看遠(yuǎn)程庫(kù)的信息,用git remote:
$ git remote origin用git remote -v顯示更詳細(xì)的信息: $ git remote -v origin git@github.com:michaelliao/learngit.git (fetch) origin git@github.com:michaelliao/learngit.git (push)(2)推送分支
推送分支,就是把該分支上的所有本地提交推送到遠(yuǎn)程庫(kù)。推送時(shí),要指定本地分支,這樣,Git就會(huì)把該分支推送到遠(yuǎn)程庫(kù)對(duì)應(yīng)的遠(yuǎn)程分支上,如果要推送其他分支,比如dev,就改成:
$ git push origin dev并不是一定要把本地分支往遠(yuǎn)程推送,那么,哪些分支需要推送,哪些不需要呢?
-
master分支:是主分支,因此要時(shí)刻與遠(yuǎn)程同步;
-
dev分支:是開(kāi)發(fā)分支,團(tuán)隊(duì)所有成員都需要在上面工作,所以也需要與遠(yuǎn)程同步;
-
bug分支:只用于在本地修復(fù)bug,就沒(méi)必要推到遠(yuǎn)程了,除非老板要看看你每周到底修復(fù)了幾個(gè)bug;
-
feature分支:是否推到遠(yuǎn)程,取決于你是否和你的小伙伴合作在上面開(kāi)發(fā)。
(3)抓取分支
多人協(xié)作的工作模式通常是這樣:
首先,可以試圖用git push origin <branch-name>推送自己的修改;
如果推送失敗,則因?yàn)檫h(yuǎn)程分支比你的本地更新,需要先用git pull試圖合并;
如果合并有沖突,則解決沖突,并在本地提交;
沒(méi)有沖突或者解決掉沖突后,再用git push origin <branch-name>推送就能成功!
如果git pull提示no tracking information,則說(shuō)明本地分支和遠(yuǎn)程分支的鏈接關(guān)系沒(méi)有創(chuàng)建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
這就是多人協(xié)作的工作模式,一旦熟悉了,就非常簡(jiǎn)單。
小結(jié)
-
查看遠(yuǎn)程庫(kù)信息,使用git remote -v;
-
本地新建的分支如果不推送到遠(yuǎn)程,對(duì)其他人就是不可見(jiàn)的;
-
從本地推送分支,使用git push origin branch-name,如果推送失敗,先用git pull抓取遠(yuǎn)程的新提交;
-
在本地創(chuàng)建和遠(yuǎn)程分支對(duì)應(yīng)的分支,使用git checkout -b branch-name origin/branch-name,本地和遠(yuǎn)程分支的名稱最好一致;
-
建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián),使用git branch --set-upstream branch-name origin/branch-name;
-
從遠(yuǎn)程抓取分支,使用git pull,如果有沖突,要先處理沖突。
總結(jié)
以上是生活随笔為你收集整理的Git 操作简单总结:廖雪峰教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Python:glob模块
- 下一篇: python解析并读取PDF文件:函数总