git教程
介绍
什么是 Git ?
Git 是目前世界上最先进的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 与 SVN 区别点
- Git 是分布式的,SVN 不是。这是 Git 和其它非分布式的版本控制系统如 SVN,CVS 等最核心的区别。
- Git 把内容按元数据方式存储,而 SVN 是按文件。
- Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
- Git 没有一个全局的版本号,而 SVN 有。目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
- Git 的内容完整性要优于 SVN。Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
Git 工作区、暂存区和版本库
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
安装
安装指定系统的依赖包:
$ yum install curl-devel expat-devel gettext-devel \
openssl-devel zlib-devel
$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \
libz-dev libssl-dev
解压安装下载的源码包:
$ tar -zxf git-1.7.2.2.tar.gz
$ cd git-1.7.2.2
$ make prefix=/usr/local all
$ sudo make prefix=/usr/local install
使用终端指令安装
Debian/Ubuntu
$ apt-get install libcurl4-gnutls-dev libexpat1-dev gettext \ libz-dev libssl-dev$ apt-get install git$ git --versiongit version 1.8.1.2
CentOS/RedHat
$ yum install curl-devel expat-devel gettext-devel \ openssl-devel zlib-devel$ yum -y install git-core$ git --versiongit version 1.7.1
完成安装之后,就可以使用命令行的 git 工具(已经自带了 ssh 客户端)了,另外还有一个图形界面的 Git 项目管理工具。
在开始菜单里找到 Git -> Git Bash,会弹出 Git 命令窗口,你可以在该窗口进行 Git 操作。
Mac 自带 git 并且随着系统版本的更新,自带的 git 也会升级到最新,一般无需手动安装。
配置
Git 提供了一个叫做 git config
的工具,专门用来配置或读取相应的工作环境变量。这些环境变量,决定了 Git 在各个环节的具体工作方式和行为。这些变量可以存放在以下三个不同的地方:
/etc/gitconfig
文件:系统中对所有用户都普遍适用的配置。若使用git config
时用--system
选项,读写的就是这个文件。~/.gitconfig
文件:用户目录下的配置文件只适用于该用户。若使用git config
时用--global
选项,读写的就是这个文件。- 当前项目的 Git 目录中的配置文件(也就是工作目录中的
.git/config
文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以.git/config
里的配置会覆盖/etc/gitconfig
中的同名变量。
用户信息
$ git config --global user.name xaoxuu
$ git config --global user.email git@xaoxuu.com
- 如果用了
--global
选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。 - 如果要在某个特定的项目中使用其他名字或者电邮,只要去掉
--global
选项重新配置即可,新的设定保存在当前项目的.git/config
文件里。
查看配置信息
$ git config --list
http.postbuffer=2M
user.name=xaoxuu
user.email=git@xaoxuu.com
git-ssh
ssh-keygen -t rsa -C user@example.com
其中 user@example.com
对应的是你的 Git 邮箱。
ssh-agent 是一种控制用来保存公钥身份验证所使用的私钥的程序,其实 ssh-agent 就是一个密钥管理器,运行 ssh-agent 以后,使用 ssh-add 将私钥交给 ssh-agent 保管,其他程序需要身份验证的时候可以将验证申请交给 ssh-agent 来完成整个认证过程。
eval "$(ssh-agent -s)"
添加生成的 SSH key 到 ssh-agent:
ssh-add ~/.ssh/id_rsa
登陆 Github,添加 ssh:
把 id_rsa.pub 文件里的内容复制到这里:
Git使用
基本操作流程
- 在对代码进行了一些修改之后,使用:
git add --all
将本地所有新增文件和修改内容添加到暂存区。 - 使用:
git commit -m 备注
将代码提交到本地版本库。(备注内容没有空格的话不需要加引号) - 使用:
git pull origin
从服务器拉取代码,更新本地版本库。 - 使用:
git push origin
将本地版本库推送到服务器。
克隆与配置
克隆版本库
git clone https://github.com/xaoxuu/AXKit.git
# 或者
git clone https://github.com/xaoxuu/AXKit.git AXKit
配置版本库
要忽略某些文件的改动需要配置 .gitignore
文件:
# 这是macOS文件夹属性的隐藏文件,不需要同步到git
.DS_Store
# 某个文件夹不想要同步到git
/public
/node_modules
# 某个文件不想要同步到git
test.txt
# 通配符
._*
基本操作指令
创建与切换分支
git checkout -b 分支名
git checkout 分支名
git tag 标签名
git tag -a 标签名 -m 备注信息
git tag -s 标签名 -m 备注信息
查看分支和标签
git tag
git show 标签名
git branch 分支名
git branch -r 分支名
git branch -a 分支名
删除分支和标签
git branch -d 分支名或标签名
git fetch -p
git push origin :分支名或标签名
# 或者
git push origin --delete 分支名或标签名
推送分支和标签
git push origin 分支名或标签名
git push --all origin
git push --tags
重命名分支
重命名本地分支:
git branch -m 旧分支名 新分支名
重命名远程分支:
- 删除远程分支
- 重命名本地分支
- 推送本地分支
拉取、合并分支
拉取某个远程标签
git fetch origin tag 远程标签名
合并某本地分支到当前分支
git merge 分支名
合并某远程分支到当前分支
git pull origin 远程分支名
代码冲突
我一般使用 Tower 客户端操作,pull 之后有冲突的文件会列出来。建议使用一个比较好的编辑器如 Atom ,有冲突的部分会用两种颜色高亮。
未完待续
代码回退
如果冲突文件没有妥善解决就提交到版本库导致严重后果,这是需要查看某个历史时刻的代码,使用:
git log
# 查看提交记录
然后 copy 某个 commit id 进行回退,回退的类型有两种:
soft
这是默认的回退方式,版本库的 HEAD 回滚到某个 commit 但本地代码不变,处于未 commit 的状态。
git reset [commit id]
# 或者
git reset --soft [commit id]
hard
HEAD 和本地代码都回到某个 commit,后面的更改将会被丢弃。(如同时光穿梭)
git reset --hard [commit id]
版本迭代
查看本地所有标签
git tag
把当前 HEAD 打个标签(名为:1.0)
git tag 1.0
# 也可以添加备注信息,如同commit
git tag 1.0 -m 'message'
切换到某个标签(1.0)
git checkout 1.0
把标签 push 到远程
git push origin 1.0
git push --tags
删除标签(1.0)
# 删除本地tag
git tag -d 1.0
# 删除远程tag
# 方法一:将空白tag覆盖到远程tag
git push origin :1.0
# 方法二:执行删除命令
git push origin --delete 1.0
客户端操作
Stash
- save:将当前未 commit 的代码保存到 stash,并且回到上次 commit 的状态。
- apply:应用某个 stash 的代码。
Git-Flow
自动化管理功能,例如:
- 准备开发新版本的时候:点击 Start Release,客户端会自动新建一个 release 分支。
- 准备增加一个新特性的时候:点击 Start Feature,客户端会新建一个 feature 分支。
- 需要修复 bug 的时候:点击 Start Hotfix,客户端会新建一个 fix 分支。
- 当修复完 bug,点击 Finish Hotfix 的时候,客户端会自动把 fix 分支合并到创建它的分支,并且创建一个 tag。
- 当一个新特性开发完成,点击 Finish Feature 的时候,客户端会自动把 feature 分支合并到创建它的分支,并且创建一个 tag。
- 当一个新版本开发完成,点击 Finish Release 的时候,客户端会自动把 release 分支合并到创建它的分支,并且创建一个 tag。
GIT服务器搭建
安装 JDK
下载并安装 JDK:https://www.oracle.com/java/technologies/javase-downloads.html
安装并配置 Gitblit
- 下载 Gitblit:https://github.com/gitblit/gitblit
- 解压 Gitblit,进入目录
~/gitblit-1.8.0/data/defaults.properties
- 用编辑器打开
defaults.properties
git.repositoriesFolder = /Users/用户名/gitserver/gitRepository server.httpPort = 7070
启动服务
在终端中执行 gitblit.sh
脚本即可启动服务:
./gitblit.sh
建议设置开机自启动
通过 Mac 的自动化工具,将启动指令写成脚本,系统启动后自动运行脚本即可。
Windows 平台可以添加到启动计划任务中。
客户端访问
用服务器 IP + 端口号来访问。例如我的电脑的 IP 是 10.8.12.200
,那么在局域网内另外一台电脑访问 http://10.8.12.200:7070
就可以看到管理页面了:
网页操作和使用 GitHub、Coding 等平台相似,非常简单。
#使用Github
fork & pull request
- fork 操作相当于把别人的 git 仓库克隆到自己账号中。
- pull request 则可以将自己 fork 过来的仓库中的修改合并到原仓库中,实现团队协作。
静态页面持续集成
1. 生成 SSH Key
打开 terminal 输入下面的命令生成 id_rsa
和 id_rsa.pub
文件:
ssh-keygen -t rsa -C me@xxx.com
其中 me@xxx.com
就是 GitHub 账号的邮箱。
2. 填写 Deploy Keys 和 Secrets
打开源码仓库,在设置中找到「Secrets」
第 1/3 步:添加 DEPLOY_KEY
内容是 id_rsa
文件的全部内容。
第 2/3 步:添加 EMAIL
内容是 GitHub 邮箱。
第 3/3 步:添加 NAME
内容是 GitHub 账号名。
打开 deploy 目标仓库,在设置中找到「Deploy Keys」
第 1/1 步:添加 deploy_key.pub
内容是 id_rsa.pub
文件的全部内容。
3. 在 GitHub 上添加 Actions
在 GitHub 上添加 Actions 内容为:
name: auto deploy # workflow name
on:
[push] # 触发事件
jobs:
build: # job1 id
runs-on: ubuntu-latest # 运行环境为最新版 Ubuntu
name: A job to deploy blog.
steps:
- name: Checkout # step1 获取源码
uses: actions/checkout@v1 # 使用 actions/checkout@v1
with: # 条件
submodules: true # Checkout private submodules(themes or something else). 当有子模块时切换分支?
# Caching dependencies to speed up workflows. (GitHub will remove any cache entries that have not been accessed in over 7 days.) 缓存压缩 node_modules,不用每次下载,使用时解压,可以加快工作流的执行过程,超过 7 天没有使用将删除压缩包。
- name: Cache node modules # step2
uses: actions/cache@v1
id: cache
with:
path: node_modules
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- name: Install Dependencies # step3 name
if: steps.cache.outputs.cache-hit != 'true' # 如果变量 cache-hit 不等于 true
run: npm install # 安装 node modules 相关依赖
# Deploy hexo blog website.
- name: Deploy # step4
id: deploy
uses: sma11black/hexo-action@v1.0.0
with:
deploy_key: ${{ secrets.DEPLOY_KEY }}
user_name: ${{ secrets.NAME }}
user_email: ${{ secrets.EMAIL }}
4. 大功告成
您可以尝试修改一下源码库,看是否能够成功运行 Actions 。
GitHub API
https://docs.github.com/en/graphql
未完待续