Git教程
下面我们先完成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 clone
、git push
、git add
、git commit
、git checkout
、git pull
,总结如下。
命令 | 说明 |
---|---|
git add | 添加文件到仓库 |
git status | 查看仓库当前的状态,显示有变更的文件。 |
git diff | 比较文件的不同,即暂存区和工作区的差异。 |
git commit | 提交暂存区到本地仓库。 |
git reset | 回退版本 |
git rm | 删除工作区文件 |
git mv | 移动或重命名工作区文件 |
远程操作:
命令 | 说明 |
---|---|
git remote | 远程仓库操作 |
git fetch | 从远程获取代码库 |
git pull | 下载远程代码并合并 |
git push | 上传远程代码并合并 |
git branch
和 git 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表示fetch
和push
的链接,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备份镜像
一种方法是迁移外部仓库
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
按钮;如下图:
③点击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的文件
就需要借助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
工作日一般几个小时就会帮你把账号解封,解封后就可以继续上传大文件啦~