Git
后盾人 www.houdunren.com 作者:向軍大叔
安裝
自誕生于 2005 年以來拂盯,Git 日臻成熟完善实束,在高度易用的同時(shí),仍然保留著初期設(shè)定的目標(biāo)歉备。它的速度飛快傅是,極其適合管理大項(xiàng)目 。
Git可以在windows、Mac喧笔、Linux全平臺(tái)系統(tǒng)使用帽驯。登錄 https://git-scm.com/downloads 下載你系統(tǒng)的Git軟件并進(jìn)行安裝。
windows 用戶我更建議安裝 git for windows 书闸,下載地址: https://gitforwindows.org/
包信 Git Base 尼变、Git Gui
安裝后通過以下命令查看,如果顯示版本號(hào)那就是安裝成功了
git --version
Gui
Gui指Git的圖形界面管理軟件浆劲,https://git-scm.com/downloads/guis 這個(gè)網(wǎng)址列出了多個(gè)可供基本上所有平臺(tái)使用的Gui軟件嫌术。如果要使用Gui而非命令行操作,我推薦 sourcetree
這也是我多年使用的軟件牌借,功能強(qiáng)大度气、跨平臺(tái)、免費(fèi)膨报。
配置
配置文件為 ~/.gitconfig
磷籍,執(zhí)行任何Git配置命令后文件將自動(dòng)創(chuàng)建。
第一個(gè)要配置的是你個(gè)人的用戶名稱和電子郵件地址现柠。這兩條配置很重要院领,每次 Git 提交時(shí)都會(huì)引用這兩條信息,說明是誰提交了更新够吩,所以會(huì)隨更新內(nèi)容一起被永久納入歷史記錄:
git config --global user.email "2300071698@qq.com"
git config --global user.name "2300071698@qq.com"
常用
- 初始化新倉庫
git init
- 克隆舊倉庫
git clone https://github.com/houdunwang/arr.git
- 查看狀態(tài)
git status
- 提交單個(gè)文件
git add index.php
- 提交所有文件
git add -A
- 使用通配符提交
git add *.js
- 提交到倉庫中
git commit -m '提示信息'
- 提交已經(jīng)跟蹤過的文件比然,不需要執(zhí)行add
git commit -a -m '提交信息'
- 刪除版本庫與項(xiàng)目目錄中的文件
git rm index.php
- 只刪除版本庫中文件但保存項(xiàng)目目錄中文件
git rm --cached index.php
- 修改最后一次提交
git commit --amend
清理
- 放棄沒有提交的修改
git checkout .
- 刪除沒有add 的文件和目錄
git clean -fd
- 顯示將要?jiǎng)h除的文件或目錄
git clean -n
Log
- 查看日志
git log
- 查看最近2次提交日志并顯示文件差異
git log -p -2
- 顯示已修改的文件清單
git log --name-only
- 顯示新增、修改废恋、刪除的文件清單
git log --name-status
- 一行顯示并只顯示SHA-1的前幾個(gè)字符
git log --oneline
Alias
通過創(chuàng)建命令別名可以減少命令輸入量谈秫。
git config --global alias.c commit
可以在配置文件 ~/.gitconfig 中查看或直接編輯
下面是一個(gè)Git命令A(yù)lias配置
[alias]
a = add .
c = commit
s = status
l = log
b = branch
現(xiàn)在可以使用 git a
實(shí)現(xiàn) git add .
一樣的效果了。
系統(tǒng)Alias
在 ~/.bash_profile
文件中定義
alias gs="git status"
alias gc="git commit -m "
alias gl="git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit "
alias gb="git branch"
alias ga="git add ."
alias go="git checkout"
命令行直接使用 gs
即可以實(shí)現(xiàn) git status
一樣的效果了鱼鼓。
window 系統(tǒng)需要使用 git for window 中的
Git Base
軟件
.gitignore
.gitignore用于定義忽略提交的文件
- 所有空行或者以注釋符號(hào)
#
開頭的行都會(huì)被 Git 忽略拟烫。 - 匹配模式最后跟反斜杠(
/
)說明要忽略的是目錄。 - 可以使用標(biāo)準(zhǔn)的 glob 模式匹配迄本。
.idea
/vendor
.env
/node_modules
/public/storage
*.txt
Branch
分支用于為項(xiàng)目增加新功能或修復(fù)Bug時(shí)使用硕淑。
創(chuàng)建分支
git branch dev
查看分支
git branch
切換分支
git checkout dev
創(chuàng)建并切換分支
git checkout -b feature/bbs
-
合并dev分支到master
git checkout master git merge dev
刪除分支
git branch -d dev
刪除沒有合并的分支
git branch -D dev
刪除遠(yuǎn)程分支
git push origin :dev
查看未合并的分支(切換到master)
git branch --no-merged
查看已經(jīng)合并的分支(切換到master)
git branch --merged
沖突
不同分修改同一個(gè)文件或不同開發(fā)者修改同一個(gè)分支文件都可能造成沖突,造成無法提交代碼嘉赎。
- 使用編輯器修改沖突的文件
- 添加暫存
git add .
表示已經(jīng)解決沖突 - git commit 提交完成
儲(chǔ)藏(Stashing)
當(dāng)你正在進(jìn)行項(xiàng)目中某一部分的工作置媳,里面的東西處于一個(gè)比較雜亂的狀態(tài),而你想轉(zhuǎn)到其他分支上進(jìn)行一些工作公条。問題是拇囊,你不想提交進(jìn)行了一半的工作,否則以后你無法回到這個(gè)工作點(diǎn)靶橱。
"暫存" 可以獲取你工作目錄的中間狀態(tài)——也就是你修改過的被追蹤的文件和暫存的變更——并將它保存到一個(gè)未完結(jié)變更的堆棧中寥袭,隨時(shí)可以重新應(yīng)用路捧。
- 儲(chǔ)藏工作
git stash
- 查看儲(chǔ)藏列表
git stash list
- 應(yīng)用最近的儲(chǔ)藏
git stash apply
- 應(yīng)用更早的儲(chǔ)藏
git stash apply stash@{2}
- 刪除儲(chǔ)藏
git stash drop stash@{0}
- 應(yīng)用并刪除儲(chǔ)藏
git stash pop
Tag
Git 也可以對(duì)某一時(shí)間點(diǎn)上的版本打上標(biāo)簽 ,用于發(fā)布軟件版本如 v1.0
- 添加標(biāo)簽
git tag v1.0
- 列出標(biāo)簽
git tag
- 推送標(biāo)簽
git push --tags
- 刪除標(biāo)簽
git tag -d v1.0.1
- 刪除遠(yuǎn)程標(biāo)簽
git push origin :v1.0.1
發(fā)布
對(duì)mster分支代碼生成壓縮包供使用者下載使用传黄,--prefix
指定目錄名
git archive master --prefix='hdcms/' --format=zip > hdcms.zip
遠(yuǎn)程倉庫
下面是最熱的Github
進(jìn)行講解杰扫,使用碼云、codeing
等國內(nèi)倉庫使用方式一致膘掰,就不在贅述了章姓。
創(chuàng)建倉庫
為了完成以下示例,你需要在GitHub
創(chuàng)建好倉庫识埋。
[圖片上傳失敗...(image-e8f319-1562048373653)]
[圖片上傳失敗...(image-c975df-1562048373653)]
SSH
生成秘鑰
使用ssh連接Github發(fā)送指令更加安全可靠凡伊,也可以免掉每次輸入密碼的困擾。
在命令行中輸入以下代碼(windows用戶使用 Git Bash)
ssh-keygen -t rsa
一直按回車鍵直到結(jié)束惭聂。系統(tǒng)會(huì)在~/.ssh
目錄中生成 id_rsa
和id_rsa.pub
窗声,即密鑰id_rsa
和公鑰id_rsa.pub
相恃。
向GitHub添加秘鑰
[圖片上傳失敗...(image-c1fb8c-1562048373653)]
點(diǎn)擊 New SSH key
按鈕辜纲,添加上面生成的 id_rsa.pub
公鑰內(nèi)容。
關(guān)聯(lián)遠(yuǎn)程
-
創(chuàng)建本地庫并完成初始提交
echo "# hd-xj" >> README.md git init git add README.md git commit -m "first commit"
-
添加遠(yuǎn)程倉庫
git remote add origin git@github.com:houdunwang/hd-xj.git
-
查看遠(yuǎn)程庫
git remote -v
-
推送數(shù)據(jù)到遠(yuǎn)程倉庫
git push -u origin master
-
刪除遠(yuǎn)程倉庫關(guān)聯(lián)
git remote rm origin
通過 clone 克隆的倉庫拦耐,本地與遠(yuǎn)程已經(jīng)自動(dòng)關(guān)聯(lián)耕腾,上面幾步都可以省略。
pull
拉取遠(yuǎn)程主機(jī)某個(gè)分支的更新杀糯,再與本地的指定分支合并扫俺。
- 拉取origin主機(jī)的ask分支與本地的master分支合并
git pull origin ask:ask
- 拉取origin主機(jī)的ask分支與當(dāng)前分支合并
git pull origin ask
- 如果遠(yuǎn)程分支與當(dāng)前本地分支同名直接執(zhí)行
git pull
push
git push
命令用于將本地分支的更新,推送到遠(yuǎn)程主機(jī)固翰。它的格式與git pull
命令相似狼纬。
-
將當(dāng)前分支推送到
origin
主機(jī)的對(duì)應(yīng)分支(如果當(dāng)前分支只有一個(gè)追蹤分支 ,可省略主機(jī)名)git push origin
-
使用
-u
選項(xiàng)指定一個(gè)默認(rèn)主機(jī) ,這樣以后就可以不加任何參數(shù)直播使用git push
骂际。$ git push -u origin master
刪除遠(yuǎn)程
ask
分支git push origin --delete ask
本地ask分支關(guān)聯(lián)遠(yuǎn)程分支并推送
git push --set-upstream origin ask
提交多個(gè)庫
我可以將代碼提交到多個(gè)遠(yuǎn)程版本庫中疗琉,比如后盾人的 課程代碼 就提交到了Github與Gitee兩個(gè)庫中。
# 增加一個(gè)遠(yuǎn)程庫
git remote add github git@github.com:houdunwang/coding.git
# 提交到遠(yuǎn)程庫
git push github
也可以創(chuàng)建命令一次提交到兩個(gè)庫(注:參考上面的命令設(shè)置章節(jié))
alias gp="git push & git push github"
自動(dòng)部署
GitHub設(shè)置 WebHook
[圖片上傳失敗...(image-9999af-1562048373653)]
PHP
項(xiàng)目中添加處理 webhook 的webhook.php文件內(nèi)容如下歉铝,并提交到版本庫盈简。
<?php
// GitHub Webhook Secret.
// GitHub項(xiàng)目 Settings/Webhooks 中的 Secret
$secret = "houdunren";
// Path to your respostory on your server.
// e.g. "/var/www/respostory"
// 項(xiàng)目地址
$path = "/www/wwwroot/xj.houdunren.com";
// Headers deliveried from GitHub
$signature = $_SERVER['HTTP_X_HUB_SIGNATURE'];
if ($signature) {
$hash = "sha1=".hash_hmac('sha1', file_get_contents("php://input"), $secret);
if (strcmp($signature, $hash) == 0) {
echo shell_exec("cd {$path} && /usr/bin/git reset --hard origin/master && /usr/bin/git clean -f && /usr/bin/git pull 2>&1");
exit();
}
}
http_response_code(404);
?>
創(chuàng)建站點(diǎn)
下面示例我使用的是 寶塔
主機(jī)面板。 [圖片上傳失敗...(image-d3e549-1562048373653)]
現(xiàn)在服務(wù)器上生成了站點(diǎn)目錄 /www/wwwroot/xj.houdunren.com
太示,因?yàn)槟夸浿写嬖?.user.ini
文件(定義站點(diǎn)可以訪問的目錄權(quán)限)柠贤,造成不能 clone
代碼,將目錄隨意改名类缤。
**開啟 shell_exec
**
執(zhí)行 git pull
指令需要使用 shell_exec
函數(shù)臼勉,刪除shell_exec 禁用函數(shù)后重啟PHP。
[圖片上傳失敗...(image-2856f7-1562048373653)]
clone
登錄服務(wù)器并使用 https 協(xié)議 clone 項(xiàng)目代碼
ssh root@xj.houdunren.com -p 22
git clone https://github.com/houdunwang/xj.git xj.houdunren.com
修改權(quán)限
chown -R www .
chmod -R g+s .
sudo -u www git pull
現(xiàn)在向GitHub 推送代碼后餐弱,服務(wù)器將自動(dòng)執(zhí)行代碼拉取宴霸,自動(dòng)部署功能設(shè)置完成了镜盯。