2019-07-02

Git

后盾人 www.houdunren.com 作者:向军大叔

安装

自诞生于 2005 年以来,Git 日臻成熟完善,在高度易用的同时,仍然保留着初期设定的目标。它的速度飞快,极其适合管理大项目 。

Git可以在windows、Mac、Linux全平台系统使用。登录 https://git-scm.com/downloads 下载你系统的Git软件并进行安装。

windows 用户我更建议安装 git for windows ,下载地址: https://gitforwindows.org/

包信 Git Base 、Git Gui

安装后通过以下命令查看,如果显示版本号那就是安装成功了

git --version

Gui

Gui指Git的图形界面管理软件,https://git-scm.com/downloads/guis 这个网址列出了多个可供基本上所有平台使用的Gui软件。如果要使用Gui而非命令行操作,我推荐 sourcetree 这也是我多年使用的软件,功能强大、跨平台、免费。

配置

配置文件为 ~/.gitconfig ,执行任何Git配置命令后文件将自动创建。

第一个要配置的是你个人的用户名称和电子邮件地址。这两条配置很重要,每次 Git 提交时都会引用这两条信息,说明是谁提交了更新,所以会随更新内容一起被永久纳入历史记录:

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. 查看状态 git status
  4. 提交单个文件 git add index.php
  5. 提交所有文件 git add -A
  6. 使用通配符提交 git add *.js
  7. 提交到仓库中 git commit -m '提示信息'
  8. 提交已经跟踪过的文件,不需要执行add git commit -a -m '提交信息'
  9. 删除版本库与项目目录中的文件 git rm index.php
  10. 只删除版本库中文件但保存项目目录中文件 git rm --cached index.php
  11. 修改最后一次提交 git commit --amend

清理

  1. 放弃没有提交的修改 git checkout .
  2. 删除没有add 的文件和目录 git clean -fd
  3. 显示将要删除的文件或目录 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的前几个字符 git log --oneline

Alias

通过创建命令别名可以减少命令输入量。

git config --global alias.c commit

可以在配置文件 ~/.gitconfig 中查看或直接编辑

下面是一个Git命令Alias配置

[alias]
    a = add .
    c = commit
    s = status
    l = log
    b = branch

现在可以使用 git a 实现 git add . 一样的效果了。

系统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 即可以实现 git status 一样的效果了。

window 系统需要使用 git for window 中的 Git Base 软件

.gitignore

.gitignore用于定义忽略提交的文件

  • 所有空行或者以注释符号 开头的行都会被 Git 忽略。
  • 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
  • 可以使用标准的 glob 模式匹配。

.idea
/vendor
.env
/node_modules
/public/storage
*.txt

Branch

分支用于为项目增加新功能或修复Bug时使用。

  1. 创建分支 git branch dev

  2. 查看分支 git branch

  3. 切换分支 git checkout dev

  4. 创建并切换分支 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. 删除远程分支 git push origin :dev

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

  10. 查看已经合并的分支(切换到master) git branch --merged

冲突

不同分修改同一个文件或不同开发者修改同一个分支文件都可能造成冲突,造成无法提交代码。

  1. 使用编辑器修改冲突的文件
  2. 添加暂存 git add . 表示已经解决冲突
  3. git commit 提交完成

储藏(Stashing)

当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作。问题是,你不想提交进行了一半的工作,否则以后你无法回到这个工作点。

"暂存" 可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

  1. 储藏工作 git stash
  2. 查看储藏列表 git stash list
  3. 应用最近的储藏 git stash apply
  4. 应用更早的储藏 git stash apply stash@{2}
  5. 删除储藏git stash drop stash@{0}
  6. 应用并删除储藏 git stash pop

Tag

Git 也可以对某一时间点上的版本打上标签 ,用于发布软件版本如 v1.0

  1. 添加标签 git tag v1.0
  2. 列出标签 git tag
  3. 推送标签 git push --tags
  4. 删除标签 git tag -d v1.0.1
  5. 删除远程标签 git push origin :v1.0.1

发布

对mster分支代码生成压缩包供使用者下载使用,--prefix 指定目录名

git archive master --prefix='hdcms/' --format=zip > hdcms.zip

远程仓库

下面是最热的Github进行讲解,使用码云、codeing 等国内仓库使用方式一致,就不在赘述了。

创建仓库

为了完成以下示例,你需要在GitHub 创建好仓库。

[图片上传失败...(image-e8f319-1562048373653)]

[图片上传失败...(image-c975df-1562048373653)]

SSH

生成秘钥

使用ssh连接Github发送指令更加安全可靠,也可以免掉每次输入密码的困扰。

在命令行中输入以下代码(windows用户使用 Git Bash)

ssh-keygen -t rsa

一直按回车键直到结束。系统会在~/.ssh 目录中生成 id_rsaid_rsa.pub,即密钥id_rsa和公钥id_rsa.pub

向GitHub添加秘钥

[图片上传失败...(image-c1fb8c-1562048373653)]

点击 New SSH key 按钮,添加上面生成的 id_rsa.pub 公钥内容。

关联远程

  1. 创建本地库并完成初始提交

    echo "# hd-xj" >> README.md
    git init
    git add README.md
    git commit -m "first commit"
    
  2. 添加远程仓库

    git remote add origin git@github.com:houdunwang/hd-xj.git
    
  3. 查看远程库

     git remote -v
    
  4. 推送数据到远程仓库

    git push -u origin master
    
  5. 删除远程仓库关联

    git remote rm origin
    

通过 clone 克隆的仓库,本地与远程已经自动关联,上面几步都可以省略。

pull

拉取远程主机某个分支的更新,再与本地的指定分支合并。

  1. 拉取origin主机的ask分支与本地的master分支合并 git pull origin ask:ask
  2. 拉取origin主机的ask分支与当前分支合并 git pull origin ask
  3. 如果远程分支与当前本地分支同名直接执行 git pull

push

git push命令用于将本地分支的更新,推送到远程主机。它的格式与git pull命令相似。

  1. 将当前分支推送到origin主机的对应分支(如果当前分支只有一个追踪分支 ,可省略主机名)

    git push origin
    
  2. 使用-u选项指定一个默认主机 ,这样以后就可以不加任何参数直播使用git push

    $ git push -u origin master
    
  3. 删除远程ask分支 git push origin --delete ask

  4. 本地ask分支关联远程分支并推送 git push --set-upstream origin ask

提交多个库

我可以将代码提交到多个远程版本库中,比如后盾人的 课程代码 就提交到了Github与Gitee两个库中。

# 增加一个远程库
git remote add github git@github.com:houdunwang/coding.git

# 提交到远程库
git push github

也可以创建命令一次提交到两个库(注:参考上面的命令设置章节)

alias gp="git push & git push github"

自动部署

GitHub设置 WebHook

[图片上传失败...(image-9999af-1562048373653)]

PHP

项目中添加处理 webhook 的webhook.php文件内容如下,并提交到版本库。

<?php
// GitHub Webhook Secret.
// GitHub项目 Settings/Webhooks 中的 Secret
$secret = "houdunren";

// Path to your respostory on your server.
// e.g. "/var/www/respostory"
// 项目地址
$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);
?>

创建站点

下面示例我使用的是 宝塔 主机面板。 [图片上传失败...(image-d3e549-1562048373653)]

现在服务器上生成了站点目录 /www/wwwroot/xj.houdunren.com ,因为目录中存在 .user.ini 文件(定义站点可以访问的目录权限),造成不能 clone 代码,将目录随意改名。

**开启 shell_exec **

执行 git pull 指令需要使用 shell_exec 函数,删除shell_exec 禁用函数后重启PHP。

[图片上传失败...(image-2856f7-1562048373653)]

clone

登录服务器并使用 https 协议 clone 项目代码

ssh root@xj.houdunren.com -p 22
git clone https://github.com/houdunwang/xj.git xj.houdunren.com

修改权限

chown -R www .
chmod -R g+s .
sudo -u www git pull

现在向GitHub 推送代码后,服务器将自动执行代码拉取,自动部署功能设置完成了。

GitHub

接口

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,630评论 9 163
  • 声明:这篇文章来源于廖雪峰老师的官方网站,我仅仅是作为学习之用 Git简介 Git是什么? Git是目前世界上最先...
    横渡阅读 3,941评论 3 27
  • Add & Commit git init 初始化一个 Git 仓库(repository),即把当前所在目录变成...
    冬絮阅读 4,787评论 0 8
  • 远程仓库 到目前为止,我们已经掌握了如何在Git仓库里对一个文件进行时光穿梭,你再也不用担心文件备份或者丢失的问题...
    归云丶阅读 1,956评论 0 5
  • 为什么说幸运钢琴曲呢?那是因为这首曲子是我九岁的时候弹的第一首比赛曲目。那天比赛我弹完以后,就得了金奖。虽然比赛结...
    想起那个夏天阅读 2,875评论 7 6