下面是對git的各種使用及命令的基礎(chǔ)使用渊季,來自廖雪峰老師的git教程朋蔫,這個(gè)收錄下,作為git的使用總結(jié)却汉。
github上面地址為:https://github.com/Zhangguoliu/learn-git/blob/master/learngit-note.md
++++++++++++++++++++++++++++++++++++++++++++++++++
Git學(xué)習(xí)筆記
目錄
創(chuàng)建版本庫||使用vi編輯器||把文件添加到版本庫||查看工作區(qū)當(dāng)前狀態(tài)
Git簡介
Git是分布式版本控制系統(tǒng)
集中式VS分布式:
集中式版本控制系統(tǒng)驯妄,版本庫集中存放在中央服務(wù)器,必須要聯(lián)網(wǎng)才能工作,沒有歷史版本庫合砂。
分布式版本控制系統(tǒng)青扔,沒有“中央服務(wù)器”,每個(gè)開發(fā)人員電腦上都有一個(gè)完整的版本庫翩伪。
分布式優(yōu)勢:安全性更高微猖,無需聯(lián)網(wǎng),若“中央服務(wù)器”故障幻工,任何一個(gè)其他開發(fā)者本地都有最新的帶歷史記錄的版本庫励两。
主要區(qū)別在于歷史版本庫的存放,集中式歷史版本只存在于中央服務(wù)器囊颅,而分布式中每個(gè)本地庫都有歷史記錄存放当悔。
安裝Git
Linux系統(tǒng)
Debian或Ubuntu Linux
sudo apt-get install git
老版本Debian或Ubuntu Linux
sudo apt-get install git-core
其他版本Linux,官網(wǎng)下載源碼解壓踢代,然后依次輸入
./config ——> make ——> sudo make install
Windows系統(tǒng)
官網(wǎng)下載盲憎,安裝完成后,“Git”->“Git Bash”即可打開
Git配置
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
注意--global參數(shù)表示你這臺機(jī)器上所有的Git倉庫都會使用這個(gè)配置胳挎。
Git命令
創(chuàng)建版本庫
選擇一個(gè)合適目錄
Windows系統(tǒng)請確保目錄名(包括父目錄)不包含中文
如$ cd ?d:
$ mkdir <repository-name>饼疙,創(chuàng)建庫名
$ cd <repository-name>,進(jìn)入庫內(nèi)
補(bǔ)充pwd顯示路徑慕爬,ls顯示當(dāng)前目錄窑眯,ls -ah顯示隱藏目錄
在當(dāng)前目錄初始化庫
$ git init
使用vi編輯器
$ vi <file-name>屏积,新建或修改文件
按i進(jìn)入編輯
編輯完成后按ESC,然后選擇以下某個(gè)命令輸入
命令效果
:w保存文件磅甩,不退出vi
:w <file-name>另存為file,不退出
:w!強(qiáng)制保存炊林,不退出
:wq保存文件,退出
:wq!強(qiáng)制保存卷要,退出
:q不保存渣聚,退出
:q!不保存,強(qiáng)制退出
:e!放棄所有修改僧叉,回到上次保存文件開始編輯
查看文件內(nèi)容
cat <file-name>
把文件添加到版本庫
$ git add <file-name>
$ git commit -m "description"
注意可以多次git add 奕枝,最后一次git commit
查看工作區(qū)當(dāng)前狀態(tài)
$ git status
時(shí)光穿梭(回退)
$ git reset --hard commit-id
確定版本回退commit-id
通過查看提交歷史
$ git log
按q退出查看
簡化顯示提交歷史
$ git log --pretty=oneline
HEAD,當(dāng)前版本
HEAD^瓶堕,上個(gè)版本
HEAD^^隘道,上上個(gè)版本
HEAD~100,往上100個(gè)版本
確定重返未來commit-id
通過查看命令歷史
$ git reflog
工作區(qū)與暫存區(qū)
工作區(qū)就是電腦中能看到的目錄捞烟,工作區(qū)有一個(gè)隱藏目錄.git薄声,這是Git的版本庫
管理修改
修改但未add
比較工作區(qū)與暫存區(qū)(即上次git add的內(nèi)容)的不同
比較所有修改文件的不同
$ git diff
比較指定修改文件的不同
$ git diff <file-name>
修改已a(bǔ)dd但未commit
比較暫存區(qū)與倉庫分支(上次git commit)的不同
$ git diff --staged
或
$ git diff --cached
撤銷修改
場景1——工作區(qū)已修改但未add到暫存區(qū)
$ git checkout -- <file-name>
其實(shí)就是用版本庫里的版本替換工作區(qū)的版本
場景2——工作區(qū)修改且已經(jīng)git add到暫存區(qū),分兩步
$ git reset HEAD <file-name>
回到場景1题画,再按場景1操作
場景3:已經(jīng)commit但沒有推送到遠(yuǎn)程庫——版本回退
刪除文件
假設(shè)文件原已commit默辨,目前情況是——已經(jīng)在目錄下手動(dòng)或$ rm <file-name>刪除文件
選擇一:確實(shí)要從版本庫中刪除該文件,分兩步
第一步
$ git rm <file-name>
或
git add <file-name>
第二步
$ git commit -m "description"
選擇二:刪錯(cuò)了苍息,要恢復(fù)
$ git checkout -- <file-name>
其實(shí)就是用版本庫里的版本替換工作區(qū)的版本
遠(yuǎn)程倉庫
創(chuàng)建SSH Key
$ ssh-keygen -t rsa -C "youremail@example.com"
補(bǔ)充在用戶主目錄下(cd)
$ ls -ah可見.ssh目錄
$ cd .ssh可見id_rsa(私鑰不能泄露)和id_rsa.pub(公鑰可公開)
關(guān)聯(lián)遠(yuǎn)程倉庫
$ git remote add origin git@github.com:username/repositoryname.git
或
$ git remote add origin https://github.com/username/repositoryname.git
遠(yuǎn)程庫默認(rèn)名字為origin
刪除已經(jīng)關(guān)聯(lián)的遠(yuǎn)程庫
git remote rm remote-name
若遠(yuǎn)程庫默認(rèn)名字為origin缩幸,則
git remote rm origin
推送到遠(yuǎn)程倉庫
第一次推送到GitHub
$ git push -u origin master
推送master分支
后續(xù)推送
$ git push origin master
不再使用參數(shù)-u
從遠(yuǎn)程庫克隆
$ git clone git@github.com:username/repositoryname.git
或
$ git clone https://github.com/username/repositoryname.git
分支管理
查看分支
$ git branch
創(chuàng)建分支
$ git branch <branch-name>
切換分支
$ git checkout <branch-name>
創(chuàng)建+切換分支
$ git checkout -b <branch-name>
合并某分支到當(dāng)前分支
$ git merge <branch-name>
普通模式合并分支
$ git merge --no-ff -m "description" <branch-name>
通常進(jìn)行分支合并時(shí),如果可以竞思,Git會使用Fast forward模式表谊,刪除分支后,分支歷史信息會丟失
--no-ff表示禁用Fast forward模式盖喷,能看出曾做過合并
刪除分支
$ git branch -d <branch-name>
強(qiáng)行刪除分支
$ git branch -D <branch-name>
查看分支合并圖
$ git log --graph
簡潔查看
$ git log --graph --pretty=oneline --abbrev-commit
Bug分支
假設(shè)場景——設(shè)A為游戲軟件
master 上面發(fā)布的是A的1.0版本
dev 上開發(fā)的是A的2.0版本
這時(shí)爆办,用戶反映 1.0版本存在漏洞,有人利用這個(gè)漏洞開外掛
需要從dev切換到master去填這個(gè)漏洞课梳,正常必須先提交dev目前的工作距辆,才能切換
而dev的工作還未完成,不想提交暮刃,所以先把dev的工作stash一下跨算。然后切換到master
在master建立分支issue101并切換
在issue101上修復(fù)漏洞
修復(fù)后,在master上合并并刪除issue101
切回dev椭懊,恢復(fù)原本工作诸蚕,繼續(xù)工作
保存工作現(xiàn)場
$ git stash
查看保存的工作現(xiàn)場
$ git stash list
恢復(fù)工作現(xiàn)場
$ git stash apply
刪除工作現(xiàn)場
$ git stash drop
恢復(fù)并刪除工作現(xiàn)場
git stash pop
Feature分支
每添加一個(gè)新功能,最好新建一個(gè)feature分支,在上面開發(fā)完成后背犯,合并坏瘩,最后,刪除該feature分支
多人協(xié)作
多人協(xié)作通常的工作模式
先試圖推送自己的修改git push
若推送失敗媳板,則遠(yuǎn)程分支比本地分支更新桑腮,git pull拉取遠(yuǎn)程分支試圖合并
若合并有沖突,則解決沖突蛉幸,并在本地提交(add和commit)
若沒有沖突或解決了沖突,再次推送git push
查看遠(yuǎn)程庫信息
$ git remote
詳細(xì)查看
git remote -v
本地推送分支
$ git push origin <branch-name>
在本地創(chuàng)建和遠(yuǎn)程分支對應(yīng)的分支
$ git checkout -b <branch-name> origin/<branch-name>
建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián)
$ git branch --set-upstream <branch-name> origin/<branch-name>
或
$ git branch --set-upstream-to=origin/<branch-name> <branch-name>
從遠(yuǎn)程抓取分支
$ git pull
Rebase“變基”
$ git rebase
把分叉的提交歷史“整理”成一條直線丛晦,看上去更直觀奕纫。缺點(diǎn)是本地的分叉提交已經(jīng)被修改過了。
只對尚未推送或尚未分享給別人的本地修改執(zhí)行變基操作清理歷史烫沙,從不對已推送至別處的提交執(zhí)行變基操作
標(biāo)簽管理
發(fā)布一個(gè)版本時(shí)匹层,我們通常先在版本庫中打一個(gè)標(biāo)簽(tag),這樣锌蓄,就唯一確定了打標(biāo)簽時(shí)刻的版本
將來無論什么時(shí)候升筏,取某個(gè)標(biāo)簽的版本,就是把那個(gè)打標(biāo)簽的時(shí)刻的歷史版本取出來瘸爽。所以您访,標(biāo)簽也是版本庫的一個(gè)快照
創(chuàng)建標(biāo)簽
$ git tag <tag-name>
在最新commit上打一個(gè)標(biāo)簽
$ git tag <tag-name> commit-id
在對應(yīng)的commit_id上打一個(gè)新標(biāo)簽
創(chuàng)建帶有說明的標(biāo)簽
$ git tag -a <tag-name> -m "description" commit-id
-a指定標(biāo)簽名,-m指定說明文字
查看所有標(biāo)簽
$ git tag
查看對應(yīng)標(biāo)簽的信息
$ git show <tag-name>
注意標(biāo)簽總是和某個(gè)commit掛鉤剪决。如果這個(gè)commit既出現(xiàn)在master分支灵汪,又出現(xiàn)在dev分支,那么在這兩個(gè)分支上都可以看到這個(gè)標(biāo)簽柑潦。
操作標(biāo)簽
推送某個(gè)標(biāo)簽到遠(yuǎn)程
$ git push origin <tag-name>
一次性推送全部尚未推送的標(biāo)簽到遠(yuǎn)程
git push origin --tags
刪除一個(gè)本地標(biāo)簽
$ git tag -d <tag-name>
刪除一個(gè)遠(yuǎn)程標(biāo)簽
先從本地刪除
$ git tag -d <tag-name>
再從遠(yuǎn)程刪除
$ git push origin :refs/tags/<tag-name>
使用GitHub
如何參與一個(gè)開源項(xiàng)目
Fork任意開源庫 ——> 從自己的賬戶下clone——> 修復(fù)bug或者新增一個(gè)功能 ——> 若希望官方庫接受你的修改享言,可以在GitHub上發(fā)起一個(gè)pull request
本地庫既關(guān)聯(lián)GitHub,又關(guān)聯(lián)碼云
如原來已經(jīng)關(guān)聯(lián)了默認(rèn)名origin的GitHub
先刪除已關(guān)聯(lián)的名為origin的遠(yuǎn)程庫:
$ git remote rm origin
然后渗鬼,先關(guān)聯(lián)GitHub的遠(yuǎn)程庫:
$ git remote add github git@github.com:username/repositoryname.git
注意览露,遠(yuǎn)程庫的名稱叫g(shù)ithub,不叫origin了
接著譬胎,再關(guān)聯(lián)碼云的遠(yuǎn)程庫:
$ git remote add gitee git@gitee.com:username/repositoryname.git
同樣注意差牛,遠(yuǎn)程庫的名稱叫g(shù)itee,不叫origin了
注意多個(gè)關(guān)聯(lián)后以上所以命令含的origin都換成相應(yīng)的github或gitee
如果要推送到GitHub银择,使用命令:
$ git push github master
如果要推送到碼云多糠,使用命令:
$ git push gitee master
自定義Git
顯示顏色
讓Git顯示顏色,會讓命令輸出看起來更醒目:
$ git config --global color.ui true
忽略特殊文件
配置別名
如
用git st就表示git status
$ git config --global alias.st status
配置一個(gè)git last浩考,讓其顯示最后一次提交信息:
$ git config --global alias.last 'log -1'
甚至還有人喪心病狂地把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的時(shí)候,加上--global是針對當(dāng)前用戶起作用的,如果不加搭伤,那只針對當(dāng)前的倉庫起作用
查看用戶的配置信息:
$ git config --global --list
要查看當(dāng)前倉庫的只怎,把global改成local就好
配置文件放哪了?每個(gè)倉庫的Git配置文件都放在.git/config文件中:$ cat .gitconfig
別名就在alias后面怜俐,要?jiǎng)h除別名身堡,直接把對應(yīng)的行刪掉即可
搭建Git服務(wù)器
GitHub就是一個(gè)免費(fèi)托管開源代碼的遠(yuǎn)程倉庫
但是對于某些視源代碼如生命的商業(yè)公司來說,既不想公開源代碼拍鲤,又舍不得給GitHub交保護(hù)費(fèi)贴谎,那就只能自己搭建一臺Git服務(wù)器作為私有倉庫使用