一垦巴、Git整體理解
Git代碼管理是分布式管理方式系統(tǒng),優(yōu)點在于其極高的安全性和非常強(qiáng)大的分支管理妖异。
工作區(qū)(working directory): 就是本地的代碼區(qū),電腦能看到的目錄,就是工作區(qū).
暫存區(qū)(Index):工作區(qū)下有一個隱藏的'.git'文件,其主要作用是存儲Git自動創(chuàng)建的第一個master分支,還有指向master分支的HEAD指針.還有一個最重要的stage的暫存區(qū).需要提交的文件修改通通放到暫存區(qū),然后一次性提交到暫存區(qū)的所有修改.
本地倉: 本地的個人倉庫.管理著個人的代碼的版本信息.
遠(yuǎn)程倉: 線上的倉庫.管理著推送到服務(wù)器的代碼版本.
過程一啊胶、有工作區(qū)<->暫存區(qū)
- 工作區(qū)->暫存區(qū):
用git add . 添加所有的修改或者git add <文件名>添加單個指定的文件修改到暫存區(qū)中. - 暫存區(qū)->工作區(qū):
(1)git rm --cached "文件路徑" 不刪除物理文件,緊將git的緩存刪除.
(2)git rm --f "文件路徑" 不僅將該文件從緩存中 刪除,還將物理文件刪除(不會放到垃圾桶).
例如: git rm -rf .DS_Store
(3)git reset <版本號> 利用版本庫清空暫存區(qū).原理:將當(dāng)前分支重設(shè)(reset)到指定的<commit>或者HEAD(默認(rèn),如果不指定commit,默認(rèn)是HEAD,即最新的一次提交)
--hard
git reset --hard <commit號>重設(shè)(reset)index和working directory肃拜,自從<commit>以來在working directory中的任何改變都被丟棄,并把HEAD指向<commit>
--soft
git reset --soft <commit號>index和working directory中的內(nèi)容不作任何改變真朗,僅僅把HEAD指向<commit>此疹。這個模式的效果是,執(zhí)行完畢后遮婶,自從<commit>以來的所有改變都會顯示在git status的"Changes to be committed"中
過程二蝗碎、由暫存區(qū)<->本地倉庫
- 暫存區(qū)->本地倉庫
用git commit -m'本次commit的描述' - 本地倉庫->暫存區(qū)
(1) git reset <版本號> 利用版本庫清空暫存區(qū).原理:將當(dāng)前分支重設(shè)(reset)到指定的<commit>或者HEAD(默認(rèn),如果不指定commit,默認(rèn)是HEAD,即最新的一次提交)
(2) --hard
git reset --hard <commit號>重設(shè)(reset)index和working directory,自從<commit>以來在working directory中的任何改變都被丟棄旗扑,并把HEAD指向<commit>
(3) --soft
git reset --soft <commit號>index和working directory中的內(nèi)容不作任何改變蹦骑,僅僅把HEAD指向<commit>。這個模式的效果是臀防,執(zhí)行完畢后眠菇,自從<commit>以來的所有改變都會顯示在git status的"Changes to be committed"中.退回到該次commit提交,但是該版本之后所有的修改都沒有了,如果想要恢復(fù),就要試圖從還未關(guān)閉的終端中找到你想要的退回的版本號,或者用git reflog查找你想要的commit版本號.繼續(xù)用git reset --soft <commit號>回退
過程三、由本地倉->遠(yuǎn)程倉庫
用git push
說明:三種git add的區(qū)別
-git add .
提交新文件(new)和被修改(modified)的文件清钥,不包括被刪除(deleted)的文件
-
git add -u
提交被修改(modified)和被刪除(deleted)的文件琼锋,不包括新文件(new) -
git add -A
提交所有變化
1放闺、在本地創(chuàng)建一個Git管理的項目
- 從線上拉項目到本地
用git clone "項目的地址路徑"
克隆一個Git管理的項目到本地 - 本地項目上傳線上
git init
git remote add origin "地址url"
2祟昭、Git上的常用查看操作
(1)查看文本內(nèi)容
cat<文件名>
(2)查看git的狀態(tài)
git status
會告訴你在當(dāng)前的分支上git的情況(有沒有修改,修改的文件是什么等)
3怖侦、查看更詳細(xì)的文件修改
git diff
查看所有文件的不同
git diff <文件名>
查看指定文件的不同
diff是difference的縮寫篡悟,只能查看還未add(還沒加入到暫存區(qū))的修改
4、查看所有的commit信息
git log
git log --pretty=oneline
更簡潔的查看log信息(只有commit號和描述信息)
5匾寝、查看所有的git操作過的命令搬葬,可以找到刪除了的commit號
git reflog
6、查看分支合并圖
git log --graph
四艳悔、沖突處理
需要把
<<<<<<HEAD
=======
>>>>>>
中間的刪掉
五急凰、Git分支操作
1、分支基本操作
- 分支的創(chuàng)建和切換
git branch "分支名"
創(chuàng)建一個分支git checkout "分支名"
切換到該分支
創(chuàng)建并切換到該分支git checkout -b "分支名"
- 列出所有的分支
git branch
列出本地分支 用*標(biāo)記當(dāng)前的分支
git branch -a
列出遠(yuǎn)程分支 - 合并分支
git merge "分支名"
合并指定分支到當(dāng)前分支
git rebase "分支名"
合并指定分支到當(dāng)前分支
兩者的區(qū)別在于會不會保留分支操作的記錄,前者記錄,后者不記錄.建議用merge - 刪除分支
刪除本地分支:git branch -d "分支名"
強(qiáng)制刪除本地分支:git branch -D "分支名"
刪除遠(yuǎn)程分支:git push origin :<分支名>
(輕易不要動安履辍)
如果提示the branch XXX is not fully merged
(XXX分支有沒合并到當(dāng)前分支的內(nèi)容) - 本地新建了一個分支要推送到線上抡锈,需要設(shè)置關(guān)聯(lián)或者追蹤
第一次push:git push origin 本地分支名:遠(yuǎn)程分支名
- 遠(yuǎn)程端生成了一個新的分支疾忍,拉取到本地
先關(guān)聯(lián)遠(yuǎn)程端分支到本地:git branch --set-upstream-to=origin/<線上分支名> <本地分支名>
然后git pull
六、bug的分支
用issue作為分支的開頭標(biāo)記床三,當(dāng)有一個bug出現(xiàn)需要改的時候一罩,先拉取一個issue分支,修改并合并到開發(fā)分支上撇簿,然后刪除issue分支聂渊。
七、feature分支
- 開發(fā)新的功能的時候四瘫,最好拉取一個新的分支汉嗽,以feature開頭。
- 丟掉一個沒有合并過的分支找蜜,即刪除分支
git branch -D <分支名>
強(qiáng)制刪除該分支內(nèi)容
八诊胞、暫存的使用
1、git stash
暫存
2锹杈、 git stash list
查看所有的暫存
3撵孤、git stash apply
從暫存開始執(zhí)行,但是stash內(nèi)容不會刪除
4竭望、 git stash drop
刪除暫存
5邪码、git stash pop
回復(fù)暫存的同時刪除暫存
6、git stash apply stash@{0}
恢復(fù)指定的暫存
九咬清、遠(yuǎn)程倉的操作
- 查看遠(yuǎn)程倉的信息
git remote
git remote -v
顯示更詳細(xì)的信息 - 將分支推送到遠(yuǎn)程倉
git push origin 本地分支名:遠(yuǎn)程分支名
十闭专、標(biāo)簽的使用
標(biāo)簽智能在master分支上使用,盡量寫清楚所有的修改旧烧,為了萬一的版本回退做好描述工作影钉。
1、git tag <name>
新建一個標(biāo)簽
2掘剪、git tag -a <name> -m'指定的標(biāo)簽信息'
3平委、git show <tag名字>
查看詳細(xì)的tag信息
4、git tag
查看所有的tag名字
5夺谁、git tag -d <標(biāo)簽名字>
刪除一個標(biāo)簽
6廉赔、git push origin < 標(biāo)簽名>
推送標(biāo)簽到遠(yuǎn)程
7、git push origin --tags
一次性推送所有未推送的標(biāo)簽
8匾鸥、刪除遠(yuǎn)程倉上的tag
- 先刪除本地的標(biāo)簽:
git tag -d <tag名字>
- 刪除遠(yuǎn)程端的標(biāo)簽:
git push origin :tag名字
十一蜡塌、Git配置全局信息
1、配置作者名稱
git config --global user.name "Your Name"
2勿负、配置個人郵箱
git config --global user.email "email@example.com"
3馏艾、配置git的顏色(文件名會標(biāo)記上顏色)
git config --global color.ui true
十二、Linux的一些簡單操作和一些符號的解釋
1、目錄/文件的操作
-mkdir "目錄名"
在當(dāng)前路徑下創(chuàng)建一個文件夾
mvdir "目錄1" "目錄2"
移動或者重命名一個目錄 (如果目錄2不存在,就直接修改目錄1的名稱為目錄2)rmdir
"目錄名" 刪除一個目錄touch
創(chuàng)建一個文件vim "文件名 編輯文件,如果文件不存在,就創(chuàng)建并進(jìn)入編輯.
刪除一個文件
sudo rm -rf <文件名>
在上帝權(quán)限下刪除,可以刪除一個該用戶沒有權(quán)限的文件(包括系統(tǒng)文件),不建議使用
rm <文件名>
能刪除當(dāng)前用戶權(quán)限下的文件
2琅摩、轉(zhuǎn)換目錄cd + "路徑"
進(jìn)入該文件目錄下(也可以將文件直接拖進(jìn)來)cd ..
回到上級目錄
-cd . 當(dāng)前目錄
cd / 回到根目錄
cd test.rtf
不可用. 不能cd到文件里.只能cd到目錄.
報錯信息: -bash: cd: test.rtf: Not a directory
3厚者、拷貝/移動/刪除
cp "需要拷貝的文件路徑" "目標(biāo)地址路徑"
拷貝文件 例如: cp /Users/goulela/Desktop/test.rtf /Users/goulela/Desktop/文件夾2
mv "需要移動的文件路徑" "目標(biāo)地址路徑"
移動文件 例如: mv 文件夾2 /Users/goulela/Desktop/創(chuàng)建文件夾/文件夾
4、顯示操作
-file "文件名"
顯示文件的類型wc "文件名"
統(tǒng)計文件的字符數(shù),詞數(shù),行數(shù)pwd
查看當(dāng)前所在的目錄ls
顯示當(dāng)前路徑下有什么文件ls + "目錄名"
顯示特定的路徑下有什么文件ls -w
顯示中文ls -l
詳細(xì)信息ls -a
顯示所有文件,包括隱藏文件
5迫吐、時間操作
-
data
顯示系統(tǒng)的當(dāng)前日期和時間 -
cal
顯示日歷
6库菲、網(wǎng)絡(luò)與通信 -
ping "url"
給一個遠(yuǎn)程主機(jī)發(fā)送 回應(yīng)請求 - 終止ping打印
control + c
-
who
列出當(dāng)前登錄的所有用戶 -
whoami
顯示當(dāng)前正進(jìn)行操作的用戶名
十三、符號解釋
1志膀、-r
就是向下遞歸熙宇,不管有多少級目錄,一并刪除
2溉浙、-f
就是直接強(qiáng)行刪除烫止,不作任何提示的意思
3、-rf
向下遞歸強(qiáng)制刪除
十四戳稽、顯示安裝詳細(xì)信息
在安裝命令后面添加--verbose,可以查看打印詳細(xì)信息
十五馆蠕、git config
配置git的相關(guān)參數(shù)
git一共有3個配置文件:
1、倉庫級的配置文件:在倉庫的.git/.gitconfig
,該配置文件只對所在的倉庫有效惊奇。
2互躬、全局配置文件:Mac系統(tǒng)在~/.gitconfig
,Windows系統(tǒng)在C:\Users\<用戶名>\.gitconfig
颂郎。
3吼渡、系統(tǒng)級的配置文件:在Git的安裝目錄下(Mac系統(tǒng)下安裝目錄在/usr/local/git
)的etc
文件夾下的gitconfig
。
# 查看配置信息
# --local:倉庫級乓序,--global:全局級寺酪,--system:系統(tǒng)級
$ git config <--local | --global | --system> -l
# 查看當(dāng)前生效的配置信息
$ git config -l
# 編輯配置文件
# --local:倉庫級,--global:全局級替劈,--system:系統(tǒng)級
$ git config <--local | --global | --system> -e
# 添加配置項
# --local:倉庫級寄雀,--global:全局級,--system:系統(tǒng)級
$ git config <--local | --global | --system> --add <name> <value>
# 獲取配置項
$ git config <--local | --global | --system> --get <name>
# 刪除配置項
$ git config <--local | --global | --system> --unset <name>
# 配置提交記錄中的用戶信息
$ git config --global user.name <用戶名>
$ git config --global user.email <郵箱地址>
# 更改Git緩存區(qū)的大小
# 如果提交的內(nèi)容較大陨献,默認(rèn)緩存較小盒犹,提交會失敗
# 緩存大小單位:B,例如:524288000(500MB)
$ git config --global http.postBuffer <緩存大小>
# 調(diào)用 git status/git diff 命令時以高亮或彩色方式顯示改動狀態(tài)
$ git config --global color.ui true
# 配置可以緩存密碼湿故,默認(rèn)緩存時間15分鐘
$ git config --global credential.helper cache
# 配置密碼的緩存時間
# 緩存時間單位:秒
$ git config --global credential.helper 'cache --timeout=<緩存時間>'
# 配置長期存儲密碼
$ git config --global credential.helper store
十六阿趁、Git clone
從遠(yuǎn)程倉庫克隆一個版本庫到本地膜蛔。
# 默認(rèn)在當(dāng)前目錄下創(chuàng)建和版本庫名相同的文件夾并下載版本到該文件夾下
$ git clone <遠(yuǎn)程倉庫的網(wǎng)址>
# 指定本地倉庫的目錄
$ git clone <遠(yuǎn)程倉庫的網(wǎng)址> <本地目錄>
# -b 指定要克隆的分支坛猪,默認(rèn)是master分支
$ git clone <遠(yuǎn)程倉庫的網(wǎng)址> -b <分支名稱> <本地目錄>
十七、Git init
初始化項目所在目錄皂股,初始化后會在當(dāng)前目錄下出現(xiàn)一個名為.git的目錄墅茉。
# 初始化本地倉庫,在當(dāng)前目錄下生成 .git 文件夾
$ git init
十八、git status
查看本地倉庫的狀態(tài)
# 查看本地倉庫的狀態(tài)
$ git status
# 以簡短模式查看本地倉庫的狀態(tài)
# 會顯示兩列就斤,第一列是文件的狀態(tài)悍募,第二列是對應(yīng)的文件
# 文件狀態(tài):A 新增,M 修改洋机,D 刪除坠宴,?? 未添加到Git中
$ git status -s
十九、git remote
操作遠(yuǎn)程庫
# 列出已經(jīng)存在的遠(yuǎn)程倉庫
$ git remote
# 列出遠(yuǎn)程倉庫的詳細(xì)信息绷旗,在別名后面列出URL地址
$ git remote -v
$ git remote --verbose
# 添加遠(yuǎn)程倉庫
$ git remote add <遠(yuǎn)程倉庫的別名> <遠(yuǎn)程倉庫的URL地址>
# 修改遠(yuǎn)程倉庫的別名
$ git remote rename <原遠(yuǎn)程倉庫的別名> <新的別名>
# 刪除指定名稱的遠(yuǎn)程倉庫
$ git remote remove <遠(yuǎn)程倉庫的別名>
# 修改遠(yuǎn)程倉庫的 URL 地址
$ git remote set-url <遠(yuǎn)程倉庫的別名> <新的遠(yuǎn)程倉庫URL地址>
二十喜鼓、git branch
操作git的分支命令
# 列出本地的所有分支,當(dāng)前所在分支以 "*" 標(biāo)出
$ git branch
# 列出本地的所有分支并顯示最后一次提交衔肢,當(dāng)前所在分支以 "*" 標(biāo)出
$ git branch -v
# 創(chuàng)建新分支庄岖,新的分支基于上一次提交建立
$ git branch <分支名>
# 修改分支名稱
# 如果不指定原分支名稱則為當(dāng)前所在分支
$ git branch -m [<原分支名稱>] <新的分支名稱>
# 強(qiáng)制修改分支名稱
$ git branch -M [<原分支名稱>] <新的分支名稱>
# 刪除指定的本地分支
$ git branch -d <分支名稱>
# 強(qiáng)制刪除指定的本地分支
$ git branch -D <分支名稱>
二十一、git checkout
檢出命令角骤,用于創(chuàng)建隅忿,切換分支等
# 切換到已存在的指定分支
$ git checkout <分支名稱>
# 創(chuàng)建并切換到指定的分支,保留所有的提交記錄
# 等同于 "git branch" 和 "git checkout" 兩個命令合并
$ git checkout -b <分支名稱>
# 創(chuàng)建并切換到指定的分支邦尊,刪除所有的提交記錄
$ git checkout --orphan <分支名稱>
# 替換掉本地的改動背桐,新增的文件和已經(jīng)添加到暫存區(qū)的內(nèi)容不受影響
$ git checkout <文件路徑>
二十二、git cherry-pick
把已經(jīng)提交的記錄合并到當(dāng)前分支蝉揍。
# 把已經(jīng)提交的記錄合并到當(dāng)前分支
$ git cherry-pick <commit ID>
二十三牢撼、git add
把要提交的文件的信息添加到暫存區(qū)中。當(dāng)使用git commit時疑苫,將依據(jù)暫存區(qū)中的內(nèi)容類進(jìn)行文件的提交熏版。
# 把指定的文件添加到暫存區(qū)中
$ git add <文件路徑>
# 添加所有修改、已刪除的文件到暫存區(qū)中
$ git add -u [<文件路徑>]
$ git add --update [<文件路徑>]
# 添加所有修改捍掺、已刪除撼短、新增的文件到暫存區(qū)中,省略 <文件路徑> 即為當(dāng)前目錄
$ git add -A [<文件路徑>]
$ git add --all [<文件路徑>]
# 查看所有修改挺勿、已刪除但沒有提交的文件曲横,進(jìn)入一個子命令系統(tǒng)
$ git add -i [<文件路徑>]
$ git add --interactive [<文件路徑>]
二十四、git commit
將暫存區(qū)中的文件提交到本地倉庫中不瓶。
# 把暫存區(qū)中的文件提交到本地倉庫禾嫉,調(diào)用文本編輯器輸入該次提交的描述信息
$ git commit
# 把暫存區(qū)中的文件提交到本地倉庫中并添加描述信息
$ git commit -m "<提交的描述信息>"
# 把所有修改、已刪除的文件提交到本地倉庫中
# 不包括未被版本庫跟蹤的文件蚊丐,等同于先調(diào)用了 "git add -u"
$ git commit -a -m "<提交的描述信息>"
# 修改上次提交的描述信息
$ git commit --amend
二十五熙参、git fetch
從遠(yuǎn)程倉庫獲取最新的版本到本地的tmp分支上。
# 將遠(yuǎn)程倉庫所有分支的最新版本全部取回到本地
$ git fetch <遠(yuǎn)程倉庫的別名>
# 將遠(yuǎn)程倉庫指定分支的最新版本取回到本地
$ git fetch <遠(yuǎn)程主機(jī)名> <分支名>
二十六麦备、git merge
合并分支
# 把指定的分支合并到當(dāng)前所在的分支下
$ git merge <分支名稱>
二十七孽椰、git diff
比較版本之間的差異
# 比較當(dāng)前文件和暫存區(qū)中文件的差異昭娩,顯示沒有暫存起來的更改
$ git diff
# 比較暫存區(qū)中的文件和上次提交時的差異
$ git diff --cached
$ git diff --staged
# 比較當(dāng)前文件和上次提交時的差異
$ git diff HEAD
# 查看從指定的版本之后改動的內(nèi)容
$ git diff <commit ID>
# 比較兩個分支之間的差異
$ git diff <分支名稱> <分支名稱>
# 查看兩個分支分開后各自的改動內(nèi)容
$ git diff <分支名稱>...<分支名稱>
二十八、git pull
從遠(yuǎn)程倉庫獲取最新版本合并到本地黍匾。
首先會執(zhí)行g(shù)it fetch,然后執(zhí)行 git merge,把獲取的分支的HEAD合并到當(dāng)前分支栏渺。
# 從遠(yuǎn)程倉庫獲取最新版本。
$ git pull
二十九锐涯、git push
把本地倉庫的提交推送到遠(yuǎn)程倉庫
# 把本地倉庫的分支推送到遠(yuǎn)程倉庫的指定分支
$ git push <遠(yuǎn)程倉庫的別名> <本地分支名>:<遠(yuǎn)程分支名>
# 刪除指定的遠(yuǎn)程倉庫的分支
$ git push <遠(yuǎn)程倉庫的別名> :<遠(yuǎn)程分支名>
$ git push <遠(yuǎn)程倉庫的別名> --delete <遠(yuǎn)程分支名>
三十磕诊、git log
把本地倉庫的提交推送到遠(yuǎn)程倉庫
# 把本地倉庫的分支推送到遠(yuǎn)程倉庫的指定分支
$ git push <遠(yuǎn)程倉庫的別名> <本地分支名>:<遠(yuǎn)程分支名>
# 刪除指定的遠(yuǎn)程倉庫的分支
$ git push <遠(yuǎn)程倉庫的別名> :<遠(yuǎn)程分支名>
$ git push <遠(yuǎn)程倉庫的別名> --delete <遠(yuǎn)程分支名>
三十一、git reset
還原提交記錄
# 重置暫存區(qū)纹腌,但文件不受影響
# 相當(dāng)于將用 "git add" 命令更新到暫存區(qū)的內(nèi)容撤出暫存區(qū)秀仲,可以指定文件
# 沒有指定 commit ID 則默認(rèn)為當(dāng)前 HEAD
$ git reset [<文件路徑>]
$ git reset --mixed [<文件路徑>]
# 將 HEAD 的指向改變,撤銷到指定的提交記錄壶笼,文件未修改
$ git reset <commit ID>
$ git reset --mixed <commit ID>
# 將 HEAD 的指向改變神僵,撤銷到指定的提交記錄,文件未修改
# 相當(dāng)于調(diào)用 "git reset --mixed" 命令后又做了一次 "git add"
$ git reset --soft <commit ID>
# 將 HEAD 的指向改變覆劈,撤銷到指定的提交記錄保礼,文件也修改了
$ git reset --hard <commit ID>
三十二、git revert
生成一個新的提交來撤銷某次提交责语,此次提交之前的所有提交都會被保留炮障。
# 生成一個新的提交來撤銷某次提交
$ git revert <commit ID>
三十三、刪除掉本地不存在的遠(yuǎn)程分支
多人合作開發(fā)時坤候,如果遠(yuǎn)程的分支被其他開發(fā)刪除掉胁赢,在本地執(zhí)行 git branch --all 依然會顯示該遠(yuǎn)程分支,可使用下列的命令進(jìn)行刪除:
# 使用 pull 命令白筹,添加 -p 參數(shù)
$ git pull -p
# 等同于下面的命令
$ git fetch -p
$ git fetch --prune origin