下面我们先完成Git教程,然后再进行博客备份!【如果想直接无脑上手,建议直接看7.7

【网上学习推荐课程

1. 基本概念

先来理解下 Git 工作区、暂存区和版本库概念:

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

下面这个图展示了工作区、版本库中的暂存区版本库之间的关系:

  • 当执行 git reset HEAD 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
  • 当执行 git rm --cached 命令时,会直接从暂存区删除文件,工作区则不做出改变。
  • 当执行 git checkout . 或者 git checkout – 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区中的改动
  • 当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动

2. 基本操作

Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。

Git 常用的是以下 6 个命令:git clonegit pushgit addgit commitgit checkoutgit pull,总结如下。

命令 说明
git add 添加文件到仓库
git status 查看仓库当前的状态,显示有变更的文件。
git diff 比较文件的不同,即暂存区和工作区的差异。
git commit 提交暂存区到本地仓库。
git reset 回退版本
git rm 删除工作区文件
git mv 移动或重命名工作区文件

远程操作:

命令 说明
git remote 远程仓库操作
git fetch 从远程获取代码库
git pull 下载远程代码并合并
git push 上传远程代码并合并

git branchgit checkout经常在一起使用,所以在此将它们合在一起。

2.1 初始化仓库

一个简单的操作步骤:先初始化仓库,再添加文件到暂存区,再将暂存区的内容添加到仓库中。初始化后,会在目录下会出现一个名为.git的目录,所有 Git 需要的数据和资源都存放在这个目录中。

git init
git add .
git commit -m '记录(内容随意)'

commit后,意味着在本地生成了一个版本(以备上传)!(类似于Ctrl + S?)

创建仓库有以下两种方法:第一种是初始化仓库,第二种是拷贝(下载)一份远程仓库。

git init
git clone git@github.com:dhndzwxj/dhndzwxj.github.io.git [my_git_name]

设置提交代码时的用户信息:

git config --global user.name "dhndzwxj"
git config --global user.email dhndzwxj@ruc.edu.cn

2.2 配置

有三类配置文件

①项目配置文件:mac和Windows上均为项目/.git/config

git config --local user.name "dhndzwxj"
git config --local user.email dhndzwxj@ruc.edu.cn

②全局配置文件:mac上为~/.gitconfig;Windows上为C:\Users\Administrator\.gitconfig。gitea上为\gitea\data\home\.gitconfig

git config --global user.name "dhndzwxj"
git config --global user.email dhndzwxj@ruc.edu.cn

2.3 Github免密码登陆

2.3.1 URL中体现

例子:

代码:

git remote add origin https://[用户名]:[密码]@github.com/WuPeiqi/dbhot.git
git push origin master

2.3.2 SSH实现

生成公钥和私钥(默认放在~/.ssh/目录下[Windows的话,默认在C:\users\Administrator\.ssh\目录下],id_rsa.pub公钥,id_rsa私钥),代码:

ssh-keygen

拷贝公钥的内容,并配置到github中。

在git本地配置ssh地址

git remote add origin git@github.com:WuPeiqi/dbhot.git

2.3.3 git自动管理凭证

自行百度

3. 分支管理

使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。一般而言,我们的仓库默认是只有一个分支的。关于分支有以下操作:

3.1 查看分支

git branch
# 查看远程版本库分支列表
git branch -r
# 查看所有分支列表,包括本地和远程
git branch -a
# 可以查看本地分支对应的远程分支
git branch -vv

3.2 创建分支

git branch [分支名称]

3.3 切换分支

切换分支的过程中,如果之前的内容没有commit,很容易导致刚刚修改、新增内容被误删,切记!)如果分支存在则只切换分支,若不存在则创建并切换到该分支。

git checkout [分支名称]

3.4 分支合并(可能产生冲突)

注意:合并到哪个分支上,就切换到哪个分支上

git merge [合并的分支]

如果产生了冲突怎么办呢?

笨方法就是把冲突的文件手动修改一下。

快速的方法就是利用一下软件。安装beyond compare。下载地址点这里

然后在git中配置:【bc4是自己起的名字】

git config --local merge.tool bc4
git config --local mergetool.path 'usr/local/bin/bcomp'
git config --local mergetool.keepBackup false

--local的意思是,这个配置只对当前的项目有效。

应用beyond compare解决冲突。

git mergetool

然后软件就会自动打开有冲突的文件,并把冲突的内容直观显示出来。只需要自行手动修改生成最终版本即可。如下图

3.5 删除分支

git branch -d [分支名称]

3.6 给分支重命名

git branch -m [分支名称] [分支新名称]

4. 远程仓库

目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员能够连接的服务器上。

要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,命令格式如下:

git remote add [仓库别名] [地址]
#例子
git remote add backup git@github.com:dhndzwxj/hexo-backup.git

这样会在本地生成一个隐藏文件夹.deploy_git

远程仓库可以重命名。

git remote rename [仓库别名] [仓库新的别名]

也可以移除仓库别名

git remote remove [仓库别名]

4.0 查看远程分支的更新状态

git remote show [仓库别名]
* remote backup
  Fetch URL: git@github.com:dhndzwxj/hexo-backup.git
  Push  URL: git@github.com:dhndzwxj/hexo-backup.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local ref configured for 'git push':
    master pushes to master (up to date)

Fetch URL和Push URL表示fetchpush的链接,master tracked表示本地和远程建立了连接。up to date表示本地和远程同步状态,local out of date表示本地落后于远程了。

4.1 推送代码

git push [仓库别名] [分支名]

4.2 下载代码

git clone [仓库地址] [本地地址]
#例子,意为在当前路径生成一个backup文件夹来存放仓库——本地地址可以省略
git clone git@github.com:dhndzwxj/hexo-backup.git backup

4.3 拉取代码

git pull [仓库别名] [分支名]
#等价于
git fetch [仓库别名] [分支名]
git merge  [仓库别名]/[分支名]

这个操作很危险!如果远程的是旧版本,会完全覆盖掉本地的全新版本,一般只在新设备上把原有的项目拉下来的时候才会用到。

4.4 回滚代码

如果新的版本出了无法解决的问题,需要回滚到过去的版本

git log
#找到对应的版本
git reset --hard [版本号]
#例子
git log
commit c7f6ee7052e5224a4755af14a04fad3f7acc135e
Author: dhndzwxj <dhndzwxj@ruc.edu.cn>
Date:   Wed Dec 7 16:11:28 2022 +0800

    221207-16

commit ec1987f2108ef7a1b9a0cee5bd890bed0935f54f
Author: dhndzwxj <dhndzwxj@ruc.edu.cn>
Date:   Wed Dec 7 15:12:33 2022 +0800

    221207-15
#回滚到22117-15这个版本,只需要
git reset --hard ec1987f2108ef7a1b9a0cee5bd890bed0935f54f

4.5 多设备备份不同步的问题

有时候可能忘记先从仓库拉代码(git pull),直接在不是新版本的文件上进行编辑,这样在git push代码的时候会遭遇reject 的情况,也就是版本冲突了。

建议的解决方法是,第一步先把此次修改的文件备份到一个新的文件夹中。第二步,把版本倒退。先看版本号

git log

然后倒退回没有争议的版本:【HEAD->master是本地的版本,backup/master是github仓库中的版本,此处的例子里二者是同步的,出问题的时候是不同步的。commit后面一大长串字母是版本号。按键盘上的Q键可退出此版本号界面。

git reset --hard [版本号]

第三步,按照备份到其他文件夹的文件,把老版本的对应文件进行修改。

4.6 保持代码提交整洁(变基)

git rebase -i [某一个版本号]

①这段代码的意思是,将代码中所写版本号到最新版本号进行合并。

git rebase -i HEAD~3

②这段代码的意思是,将最近提交的三个版本进行合并。

③第三种情况比较复杂,由于在多台设备进行开发,可能会生成分叉,在合并代码的时候有出现冲突的可能。如何避免生成分叉呢?

首先第一步,把代码从云端拿下来:

git fetch backup master

第二步,要把本地前一天的代码与在另一台设备新代码进行合并,此时不用git merge了,而是:

git rebase backup/master

4.7 记录图像展示

git log --graph --pretty=format:"%h %s"

4a git各种报错

4a.1git pull

在git中利用pull拉取远程仓库文件时报错:

error: The following untracked working tree files would be overwritten by merge:

解决方法:

git fetch backup
git clean -f
git reset --hard backup/master

其中backup是仓库名,master是分支名。

personal token

4b 生成个人令牌(personal token)

如果你想要将自己的仓库分享给其他人,但是为了代码的安全性,又将这个仓库设成了private,那么这个时候就需要用到个人令牌了。

From your GitHub account, go to Settings => Developer Settings => Personal Access Token => Generate New Token (Give your password) => Fillup the form => click Generate token => Copy the generated Token, it will be something like

ghp_sFhFsSHhTzMDreGRLjmks4Tzuzgthdvfsrta

  • 在Note为你创建的token添加描述。

  • 在Expiration选择token有效期时间,可以选择永不过期。

  • 为token赋予权限。如果从命令行操作仓库,至少选中repo

  • 最后选择Generate token

点击生成。生成之后先复制下来,后面会用到。

注意:离开这个页面,之后你将看不见这个token的明文了。(这一点真的太烦了!!!!!!!!!!!!!!!!!!!)

这时候从其他设备拉取代码,就需要使用https地址,而非ssh地址了。

git clone https://github.com/[用户名]/[仓库名].git [本地存放路径]

下面会提示你输入一些内容,有github的账户名,还要输入刚刚复制的长长的token:【复制token这一步要特别注意,因为不管是否输入内容,光标都不会移动,会给你一种输入失败的错误,所以一定只复制一次!

4c 同时将代码推送到github和gitee两个仓库

虽然github有各种各样的好,但有时候国外服务器会脑袋滑丝,和本地网络断联,因而同时把代码备份在国内外两个服务器是有必要的。做法也很简单

打开根目录下被隐藏的文件夹.git。该文件夹里面有个文件叫config。用记事本打开config,有一行代码是:

[remote "Name_of_Repo"]
	url = git@github.com:dhndzwxj/Name_of_Repo.git

类似的,在下面加上一句,就可以备份到gitee仓库了:

url = git@gitee.com:dhndzwxj/Name_of_Repo.git

注意,同时备份两个仓库,备份速度会慢一点哦。

gitea

4d Gitea本地镜像

4c.1 配置Gitea

首先找到gitea的github镜像:https://github.com/go-gitea/gitea。然后下载最新版本即可。

下载后得到的可执行文件gitea-1.20.4-windows-4.0-amd64.exe,需要单独放在一个文件夹里面。然后直接双击启动。启动过程中会生成一些内容:

服务窗口

从上图可以看出,访问端口为3000,只需要打开浏览器,输入网址localhost:3000即可访问,进入初始配置的界面。

开始配置:

  • 数据库类型:建议使用SQLite3,因为比较轻量。MySQL太重量级了
  • 把下面的一些路径改为相对路径,后面迁移的话比较方便
  • 本地IP:192.168.5.24
  • 端口改为80,比较方便,不用写:XXXX
  • 在Gitea本地文件夹中,创建data文件夹。

然后立即安装即可。安装完成后,重启服务窗口,在浏览器中输入192.168.5.24即可登陆。如下图:

在这里面就和github的操作是一样的。

4c.2 更改Gitea配置

只需要在根目录下进行配置。

修改文件\Gitea\custom\conf\app.ini。对应的内容如下:

[server]
SSH_DOMAIN       = localhost
DOMAIN           = localhost
HTTP_PORT        = 3000
ROOT_URL         = localhost:3000
DISABLE_SSH      = false
SSH_PORT         = 22
LFS_START_SERVER = true
LFS_CONTENT_PATH = D:/git/data/lfs
LFS_JWT_SECRET   = 6AAdyUrR10umOGI3D1yXQyCjcdxV8eMpsswSDhvu8rw
OFFLINE_MODE     = false



ROOT_URL 
如果想让别人访问你的gitea 要把防火墙打开

1.如果你是用 192.168.2.x:3000 ,直接改192.168.2.y:3000
2.如果你是用 localhost:3000,不用改

相应地,也要在项目目录中对\.git\config文件进行修改。

[remote "origin"]
	url = http://192.168.2.x:3000/XXX/X.git

改为
	url = http://192.168.2.y:3000/XXX/X.git

4c.3 群晖Gitea更改配置

需要设置Gitea的HTTPS。

ssh dhndzwxj@192.168.3.150
sudo -i 
cd /var/packages/gitea/var
ls -a
vim conf.ini

修改此文件中的ROOT_URL

[server]
LFS_CONTENT_PATH = /volume1/git/lfs
SSH_DOMAIN = 192.168.3.150
DOMAIN = 192.168.3.150
ROOT_URL = http://192.168.3.50:8418/
LOCAL_ROOT_URL = http://localhost:8418/
HTTP_PORT = 8418

4c.4 nssm自动启动服务器

但是遗留一个问题,一旦服务窗口关闭,或者程序崩溃,服务就停止了。如何能让服务自动重启(并且不需要每次都手动打开服务窗口)呢?这就要借助一个nssm软件。

nssm安装地址:https://nssm.cc/download

windows10以上的系统,建议安装nssm 2.24-101-g897c7ad (2017-04-26)

建议将这个可执行的nssm.exe可执行文件放在电脑的C:\Windows目录下【毕竟这个软件也只有360k而已】,这样可以免去配置环境变量的麻烦。

然后以管理员身份打开命令提示符【终端】。输入

nssm install gitea[gitea可以自定义为其他名字]

然后在弹出的对话框中作如下配置:

其他的不用管,直接install service即可。

安装完成后,启动gitea服务,只需要在命令行输入以下代码即可:

nssm start gitea

注意,在任务管理器里面可以设置gitea的属性,将“启动类型”设置为“自动”,意味着开机即可自动启动该服务!

4c.5 从Github备份镜像

一种方法是迁移外部仓库

而且值得注意的是,目前只能用HTTP地址,不能用SSH地址。

5. gitignore——忽略的文件

博客项目目录下有一个隐藏文件gitignore。其作用在于让git不再管理当前目录下的某些文件

a.h							#不管理a.h这个文件
*.h							#不管理以.h结尾的文件
!a.h						#不管理除了a.h以外,以.h结尾的文件
files/					#会忽略fils文件夹下所有文件
!files/a.h  		#会忽略fils文件夹下a.h以外的所有文件
*.py[c|a|d]			#会忽略.pyc,.pya,.pyd为后缀的文件

更多可以参考https://github.com/github/gitignore

6. GitHub上如何进行PR(Pull Request)操作

为了叙述方便,特此声明:

此处小Q要与小J进行合作,小Q需要对小J在GitHub上的的Repository进行fork等一系列的操作。

6.1 小Q fork 小J的仓库

点击如下图的部分,然后在下一个页面点击Create fork

克隆小Q的仓库到其电脑本地。打开刚才fork的Repository,复制该Repository的SSH使用命令

git clone git@github.com:dhndzwxj/hexo-theme-butterfly.git themes/jerryc127

6.2 与小J的仓库建立新的链接

①查看当前链接情况

cd themes/jerryc127
git remote -v

②与小J的Github的仓库建立链接

git remote add upstream git@github.com:jerryc127/hexo-theme-butterfly.git

③再查看当前链接情况

git remote -v

6.3 修改

①新建工作分支

git checkout -b xinq-branch

新建并切换到新建的分支xinq-branch;使用命令

git branch

查看当前所在分支。

②修改内容即可

③提交

git add .
git commit -m '提交(随意内容)'
git push origin xinq-branch

这三连操作命令提交到小Q的GitHub上的仓库(一定注意,是小Q的)

6.4 发起PR(Pull Request)

①到小Q的GitHub的Repository上点击Pull Requests,再点击New pull requests按钮;如下图:

②进入Comparing changes界面。

③点击Create pull request按钮;填写相关信息,在点击Create pull request按钮即可。

④Merge:这是小J的任务了。

7. 应用:生成个人github主页

最开始,要先安装git。

git的下载网址

第一步,把别人的仓库克隆到自己电脑上

  • git clone:是克隆仓库的关键字
  • git@github.com:IvanYYi/IvanYYi.github.io.git:是别人仓库的仓库名
  • yeah:是即将生成的本地文件夹名,直接放在命令行所处的当前目录下。

然后从终端进入我们刚刚克隆下来的文件夹当中

不过我们是没有办法直接把这个文件夹部署到自己的github上去的,因为没有权限

第二步,为本电脑添加密钥,这相当于给自己的电脑配了一把能打开github仓库的钥匙,否则没办法把电脑上的东西搞到github上去(安全性)

先在终端命令行里面输入以下内容:

git config --global user.name "dhndzwxj-yeah"     # 注意将引号部分换成自己的用户名
git config --global user.email dhndzwxj@yeah.net  # 注意后面应该是自己的邮箱

下一步生成密钥

ssh-keygen -t rsa -C "dhndzwxj@yeah.net"

接下来按一下空格(不按空格的话会生成密码,以后每次部署都要输入密码,麻烦),然后按y【如果你的电脑没有生成过密钥,可能不需要按y,注意】,接下来不想生成密码,就一路按空格键,流程如下:

接下来是把这个密钥添加到github里面去!

方法是:右上角头像——Settings——SSH and GPG keys——New SSH Key

右上角头像Settings

SSH and GPG keys

New SSH keys

最后进入的进面如下图:其中Title可以自己随便命名,最为关键的是把自己电脑的密钥复制到 Key 下面的大方框内,最后点击“Add SSH key”,就完成了!那么怎么找到刚刚生成的本机密钥呢?

对于Windows而言,本机密钥存储的位置一般为C:/Users/Administrator/.ssh/id_rsa.pub。可以在该路径下找到密钥,用“记事本”的方式打开该文件,并将文件内所有内容复制到上面的Key的大方框中。或者用命令行打开密钥【不知道可不可以,试一试】:

cat C:/Users/Administrator/.ssh/id_rsa.pub

效果如下:

添加效果如下:

接下来回到终端,cd到主页文件夹所在目录,然后输入如下代码,就能部署成功啦:

git init
git add .
git commit -m 'first commit' # 如果是一个空的仓库,第一次push前还要加这三句话
git push git@github.com:dhndzwxj-yeah/dhndzwxj-yeah.github.io.git master
  • git push 是关键字,

  • “git@github.com:dhndzwxj-yeah/dhndzwxj-yeah.github.io.git”是自己的仓库,获取这行代码的方法是:[记住,一定要选择下面的SSH标签,不要选HTTPS标签]

  • master是仓库的分支

下面两张图是教你如何得到仓库的地址:

如果你的是空白的仓库,那么:

这里可以看见自己的分支的名字:

最后的最后,我们发现,每次push都要写非常长的代码,因为自己仓库地址的名字太长了,有没有办法给它取一个容易记的名字呢?当然可以!操作如下:

git remote add my_repo git@github.com:dhndzwxj-yeah/dhndzwxj-yeah.github.io.git

git remote add是重命名的关键字,my_repo`是自己给仓库取得小名,后面长长的就是仓库地址!

这样的话,我们每次部署输入的代码就简化为:

git add .
git commit -m '这里随便写啥都行'
git push my_repo master

8. 上传超过100M的文件

参考文章轻松上传超过100M的文件至GitHub

就需要借助Git LFS。首先下载git-lfs(https://github.com/git-lfs/git-lfs),安装好后进入本地仓库目录,执行下面的命令。

git lfs track "file"

file是需要上传的大文件。执行完命令后会发现目录下生成了一个".gitattributes"文件,文件内记录了我们要上传文件的信息。只有先把".gitattributes"传上去,才可以上传大文件。

git add .gitattributes
git commit -m "submit file"
git push -u origin master

上传完毕后,开始上传大文件。

git add file
git commit -m "add file"
git push -u origin master

如果发现自己空间不足,可以删去一些大文件或者购买更多的空间。

如果在上传过程中出现如下报错:

batch response: Git LFS is disabled for this repository.

Uploading LFS objects: 0% (0/1), 0 B | 0 B/s, done

就说明你的账号被冻结了,需要在GitHub后台提交解封申请。https://support.github.com/contact

工作日一般几个小时就会帮你把账号解封,解封后就可以继续上传大文件啦~