发布于 

git教程

介绍

什么是 Git ?

Git 是目前世界上最先进的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。

Git 与 SVN 区别点

  1. Git 是分布式的,SVN 不是。这是 Git 和其它非分布式的版本控制系统如 SVN,CVS 等最核心的区别。
  2. Git 把内容按元数据方式存储,而 SVN 是按文件。
  3. Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
  4. Git 没有一个全局的版本号,而 SVN 有。目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
  5. Git 的内容完整性要优于 SVN。Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
图片来源于 RUNOOB
图片来源于 RUNOOB

Git 工作区、暂存区和版本库

  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文叫stage, 或index。一般存放在 “.git目录下” 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

安装

安装指定系统的依赖包:

Centos/RedHat
$ yum install curl-devel expat-devel gettext-devel \ openssl-devel zlib-devel
Debian/Ubuntu
$ 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使用

基本操作流程

  1. 在对代码进行了一些修改之后,使用:git add --all 将本地所有新增文件和修改内容添加到暂存区。
  2. 使用:git commit -m 备注 将代码提交到本地版本库。(备注内容没有空格的话不需要加引号)
  3. 使用:git pull origin 从服务器拉取代码,更新本地版本库。
  4. 使用: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

# 通配符
._*

基本操作指令

创建与切换分支

创建并切换 branch
git checkout -b 分支名
仅仅切换 branch
git checkout 分支名
创建 tag
git tag 标签名
创建 tag 并备注
git tag -a 标签名 -m 备注信息
创建 PGP tag 并备注
git tag -s 标签名 -m 备注信息

查看分支和标签

查看本地 tag
git tag
查看某个本地 tag 详情
git show 标签名
查看本地 branch list
git branch 分支名
查看远程 branch list
git branch -r 分支名
查看所有 branch list
git branch -a 分支名

删除分支和标签

删除本地 branch / tag
git branch -d 分支名或标签名
删除所有未推送的本地 branch
git fetch -p
仅仅删除某个远程 branch / tag
git push origin :分支名或标签名 # 或者 git push origin --delete 分支名或标签名

推送分支和标签

推送某个 branch / tag
git push origin 分支名或标签名
推送所有 branch
git push --all origin
推送所有 tag
git push --tags

重命名分支

重命名本地分支:

git branch -m 旧分支名 新分支名

重命名远程分支:

  1. 删除远程分支
  2. 重命名本地分支
  3. 推送本地分支

拉取、合并分支

拉取某个远程标签

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 到远程

push指定的tag
git push origin 1.0
push所有未push的tag
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_rsaid_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 内容为:

.github/workflows/auto-deploy.yml
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

未完待续