2019-07-02

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"

常用

  1. 初始化新倉庫 git init
  2. 克隆舊倉庫 git clone https://github.com/houdunwang/arr.git
  3. 查看狀態(tài) git status
  4. 提交單個(gè)文件 git add index.php
  5. 提交所有文件 git add -A
  6. 使用通配符提交 git add *.js
  7. 提交到倉庫中 git commit -m '提示信息'
  8. 提交已經(jīng)跟蹤過的文件比然,不需要執(zhí)行add git commit -a -m '提交信息'
  9. 刪除版本庫與項(xiàng)目目錄中的文件 git rm index.php
  10. 只刪除版本庫中文件但保存項(xiàng)目目錄中文件 git rm --cached index.php
  11. 修改最后一次提交 git commit --amend

清理

  1. 放棄沒有提交的修改 git checkout .
  2. 刪除沒有add 的文件和目錄 git clean -fd
  3. 顯示將要?jiǎng)h除的文件或目錄 git clean -n

Log

  1. 查看日志 git log
  2. 查看最近2次提交日志并顯示文件差異 git log -p -2
  3. 顯示已修改的文件清單 git log --name-only
  4. 顯示新增、修改废恋、刪除的文件清單 git log --name-status
  5. 一行顯示并只顯示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í)使用硕淑。

  1. 創(chuàng)建分支 git branch dev

  2. 查看分支 git branch

  3. 切換分支 git checkout dev

  4. 創(chuàng)建并切換分支 git checkout -b feature/bbs

  5. 合并dev分支到master

    git checkout master
    git merge dev
    
  6. 刪除分支 git branch -d dev

  7. 刪除沒有合并的分支git branch -D dev

  8. 刪除遠(yuǎn)程分支 git push origin :dev

  9. 查看未合并的分支(切換到master) git branch --no-merged

  10. 查看已經(jīng)合并的分支(切換到master) git branch --merged

沖突

不同分修改同一個(gè)文件或不同開發(fā)者修改同一個(gè)分支文件都可能造成沖突,造成無法提交代碼嘉赎。

  1. 使用編輯器修改沖突的文件
  2. 添加暫存 git add . 表示已經(jīng)解決沖突
  3. 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)用路捧。

  1. 儲(chǔ)藏工作 git stash
  2. 查看儲(chǔ)藏列表 git stash list
  3. 應(yīng)用最近的儲(chǔ)藏 git stash apply
  4. 應(yīng)用更早的儲(chǔ)藏 git stash apply stash@{2}
  5. 刪除儲(chǔ)藏git stash drop stash@{0}
  6. 應(yīng)用并刪除儲(chǔ)藏 git stash pop

Tag

Git 也可以對(duì)某一時(shí)間點(diǎn)上的版本打上標(biāo)簽 ,用于發(fā)布軟件版本如 v1.0

  1. 添加標(biāo)簽 git tag v1.0
  2. 列出標(biāo)簽 git tag
  3. 推送標(biāo)簽 git push --tags
  4. 刪除標(biāo)簽 git tag -d v1.0.1
  5. 刪除遠(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_rsaid_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)程

  1. 創(chuàng)建本地庫并完成初始提交

    echo "# hd-xj" >> README.md
    git init
    git add README.md
    git commit -m "first commit"
    
  2. 添加遠(yuǎn)程倉庫

    git remote add origin git@github.com:houdunwang/hd-xj.git
    
  3. 查看遠(yuǎn)程庫

     git remote -v
    
  4. 推送數(shù)據(jù)到遠(yuǎn)程倉庫

    git push -u origin master
    
  5. 刪除遠(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è)分支的更新杀糯,再與本地的指定分支合并扫俺。

  1. 拉取origin主機(jī)的ask分支與本地的master分支合并 git pull origin ask:ask
  2. 拉取origin主機(jī)的ask分支與當(dāng)前分支合并 git pull origin ask
  3. 如果遠(yuǎn)程分支與當(dāng)前本地分支同名直接執(zhí)行 git pull

push

git push命令用于將本地分支的更新,推送到遠(yuǎn)程主機(jī)固翰。它的格式與git pull命令相似狼纬。

  1. 將當(dāng)前分支推送到origin主機(jī)的對(duì)應(yīng)分支(如果當(dāng)前分支只有一個(gè)追蹤分支 ,可省略主機(jī)名)

    git push origin
    
  2. 使用-u選項(xiàng)指定一個(gè)默認(rèn)主機(jī) ,這樣以后就可以不加任何參數(shù)直播使用git push骂际。

    $ git push -u origin master
    
  3. 刪除遠(yuǎn)程ask分支 git push origin --delete ask

  4. 本地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è)置完成了镜盯。

GitHub

接口

接口地址:https://api.github.com/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市猖败,隨后出現(xiàn)的幾起案子速缆,更是在濱河造成了極大的恐慌,老刑警劉巖恩闻,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艺糜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡幢尚,警方通過查閱死者的電腦和手機(jī)破停,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尉剩,“玉大人真慢,你說我怎么就攤上這事±砭ィ” “怎么了黑界?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)皂林。 經(jīng)常有香客問我朗鸠,道長(zhǎng),這世上最難降的妖魔是什么础倍? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任烛占,我火速辦了婚禮,結(jié)果婚禮上沟启,老公的妹妹穿的比我還像新娘忆家。我一直安慰自己,他們只是感情好德迹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布芽卿。 她就那樣靜靜地躺著,像睡著了一般浦辨。 火紅的嫁衣襯著肌膚如雪蹬竖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天流酬,我揣著相機(jī)與錄音币厕,去河邊找鬼。 笑死芽腾,一個(gè)胖子當(dāng)著我的面吹牛旦装,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摊滔,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼阴绢,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼店乐!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起呻袭,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤眨八,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后左电,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體廉侧,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年篓足,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了段誊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡栈拖,死狀恐怖连舍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涩哟,我是刑警寧澤索赏,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站染簇,受9級(jí)特大地震影響参滴,放射性物質(zhì)發(fā)生泄漏强岸。R本人自食惡果不足惜锻弓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝌箍。 院中可真熱鬧青灼,春花似錦、人聲如沸妓盲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悯衬。三九已至弹沽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筋粗,已是汗流浹背策橘。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娜亿,地道東北人丽已。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像买决,于是被迫代替她去往敵國和親沛婴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吼畏,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. 安裝 Github 查看是否安裝git: $ git config --global user.name "...
    Albert_Sun閱讀 13,661評(píng)論 9 163
  • 聲明:這篇文章來源于廖雪峰老師的官方網(wǎng)站,我僅僅是作為學(xué)習(xí)之用 Git簡(jiǎn)介 Git是什么嘁灯? Git是目前世界上最先...
    橫渡閱讀 3,955評(píng)論 3 27
  • Add & Commit git init 初始化一個(gè) Git 倉庫(repository)泻蚊,即把當(dāng)前所在目錄變成...
    冬絮閱讀 4,832評(píng)論 0 9
  • 遠(yuǎn)程倉庫 到目前為止,我們已經(jīng)掌握了如何在Git倉庫里對(duì)一個(gè)文件進(jìn)行時(shí)光穿梭丑婿,你再也不用擔(dān)心文件備份或者丟失的問題...
    歸云丶閱讀 1,961評(píng)論 0 5
  • 為什么說幸運(yùn)鋼琴曲呢藕夫?那是因?yàn)檫@首曲子是我九歲的時(shí)候彈的第一首比賽曲目。那天比賽我彈完以后枯冈,就得了金獎(jiǎng)毅贮。雖然比賽結(jié)...
    想起那個(gè)夏天閱讀 2,894評(píng)論 7 6