# 一、Git基础
分布式版本控制系统。
# Git下载
TortoiseGit 官网下载(Git小乌龟) (opens new window)
# Git本地仓库流程图
# Git工作流
Git工作流是代码管理的流程、方式,主要有以下四种方式。
# 1. 中央集中式工作流
与SVN工作流程一致。
Git有中央仓库(远程仓库origin)master、本地仓库(HEAD)、 .git隐藏目录。
# 2. 功能分支工作流
# 3. GitFlow工作流
通过为功能开发、发布准备、维护分配独立的分支,让发布迭代过程更流畅、严格、规范。包含master主分支、dev开发分支、feature功能分支、release预发布分支、hotfix热修复分支。
GitFlow解读
1、保证主干master不受污染,可运行;
2、开发以开发分支dev为基准,创建功能分支进行代码开发;
3、开发完毕提交合并请求Pull Request
,审核同意后合并代码至开发分支;
4、创建预发布分支进行测试,测试无误后合并至主干分支master;
5、基于master创建版本Tag;
6、运行版本出现BUG后,基于该Tag创建热修复分支hotfix_xxx。代码修复后,合并代码至开发分支,合并代码至主分支master,并重建版本Tag。
# 4. Forking工作流
# .gitignore文件
忽略规则
.gitignore文件对其所在的目录及所在目录的全部子目录均有效。
通过将.gitignore文件添加到仓库,其他开发者更新该文件到本地仓库,以共享同一套忽略规则。
新建.gitignore
在仓库目录下新建一个名为.gitignore的文件(因为是点开头,没有文件名,没办法直接在windows目录下直接创建,必须通过右键Git Bash,按照linux的方式来新建.gitignore文件)。
ignore文件的格式说明:
- 以'#'开始的行,被视为注释;
- 以斜杠“/”开头表示目录;
- 以星号“*”通配多个字符;
- 以问号“?”通配单个字符
- 以方括号“[]”包含单个字符的匹配列表;
- 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
# 二、Git配置
# 配置SSH key
# 创建公钥
- 在本地创建ssh key,输入自己注册GitHub时候的邮箱地址
ssh-keygen -t rsa -C "your_email@youremail.com"
后面的一些操作我们默认回车就可以,然后成功后会在User文件夹对应的用户下创建.ssh文件夹( C:\Users\用户名\.ssh)。
- 其中有一个
id_rsa.pub
文件,我们复制其中的key。
# Github配置SSH(账户)
之后返回github,进入
Account Settings
(账户配置),左边选择SSH and GPG Keys
选项;创建SSH Key
其中的title随便填,下面的key粘贴在你电脑上生成的key。
# 验证绑定
- 验证是否绑定本地成功,在git-bash中验证,输入指令:
ssh -T git@github.com
如果第一次执行该指令,则会提示是否continue继续;
如果我们输入yes就会看到成功信息:Hi 账户!You`ve successfully authenticated...
# 配置SSH(项目)
如果只是对于某一个项目需要免登录,则进入所需配置项目单独配置。
- 进入项目,选择settings——> Deploy keys ——> Add key
# 配置多个账户
若需要在同一台电脑,配置多个gitee/gitlab/github账户进行git管理,则需要按照以下操作进行配置使用SSH。
# 配置2个公钥和私钥
- 在本地创建ssh key,输入自己注册GitHub时候的邮箱地址
ssh-keygen -t rsa -C "xxx@163.com" -f ~/.ssh/id_rsa_key1
ssh-keygen -t rsa -C "xxx@qq.com" -f ~/.ssh/id_rsa_key1
2
成功后会在User文件夹对应的用户目录下创建.ssh文件夹( C:\Users\用户名\.ssh),生成公钥至指定的文件中。
- 添加
ssh-agent bash
ssh-add ~/.ssh/id_rsa_key1
ssh-add ~/.ssh/id_rsa_key2
2
3
# Github配置SSH(账户)
复制id_rsa_xxx.pub
文件中的内容,进入各自服务器配置Key。
之后返回github,进入
Account Settings
(账户配置),左边选择SSH and GPG Keys
选项;创建SSH Key。
其中的title随便填,下面的key粘贴在你电脑上生成的key。
# 配置config
添加config文件
cd ~/.ssh
touch config
vim confg
2
3
每个账号单独配置一个Host,每个Host要取一个别名,每个Host主要配置HostName和IdentityFile两个属性即可。
# 公钥1
Host user1
HostName gitee.com
User xxx@163.com
IdentityFile ~/.ssh/id_rsa_superC
# 公钥2
Host user2
HostName gitee.com
User xxx@qq.com
IdentityFile ~/.ssh/id_rsa_kim
2
3
4
5
6
7
8
9
10
11
参数说明:
Host 别名
HostName 这个是真实的域名地址
User 配置使用用户名(邮箱账户)
IdentityFile 这里是id_rsa的地址
PreferredAuthentications配置登录时用什么权限认证。可设为publickey,password publickey,keyboard-interactive等
Host的名字可以取为自己喜欢的名字,不过这个会影响git相关命令。
例如: Host user1
这样定义的话,那么获取项目链接的时候,git@后面紧跟的名字改为user1。
git clone git@user1:个人空间地址/项目名.git
# 查看仓库配置
命令 | 描述 |
---|---|
git config --local -l | 查看配置 |
git config --global -l | 查看用户配置 |
git config --system -l | 查看系统配置 |
# 解除原git的全局账号设置
如果之前已经在全局配置了账户,则通过下面命令进行解除全局配置。
解除原git的全局账号设置:
git config --global --unset user.name
git config --global --unset user.email
2
# 项目下配置账号
在具体项目配置账号,进入具体的项目bash执行:
git config user.name "username"
git config user.email "email@163.com"
2
# 下载代码
原有gitee地址:https://gitee.com/superc/project.git
调整后的下载地址:git@user1:namespace/namespace.git
- user1为config文件中的Host
- namespace为gitee命名空间名
- namespace为项目名
git clone git@user1:namespace/namespace.git
# 三、Git使用
# Git常见命令
命令 | 描述 |
---|---|
git clone | 下载代码 |
git pull --rebase origin master | 代码合并 |
git remote set-url origin git@github.com:CCC1004/XXX.git | 更换地址 |
git remote -v | 查看Git远程仓库地址 |
git log | 查看版本历史记录 |
git reset --hard [commit哈希值] | 退回至某一版本 |
git rm -r --cached . | 清除提交缓存 |
# Git 全局设置账户
由于GitHub每次执行commit操作时,都会记录username和email,如下设置为全局global 。
git config --global user.name "username"
git config --global user.email "email@163.com"
2
# 创建 git 仓库
mkdir test_project
cd test_project
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://gitee.com/xxx/test_project.git
git push -u origin master
2
3
4
5
6
7
8
# 克隆远程仓库至本地
新建一个目录
存放下载下来的项目,我在D盘新建了一个“git_repo”文件夹,用来存放下载下来的项目;
点击新建的文件夹,即进入“git_repo”,点击鼠标右键,选择"Git Bash Here";
进行基础配置
作为 git 的基础配置,作用是告诉 git 你是谁,你输入的信息将出现在你创建的提交中,使用下面两条命令:
git config user.name "你的名字或昵称"
git config user.email "你的邮箱"
2
git初始化
完成初始化
git init
克隆
git clone <项目地址>
# 上传代码至远程仓库
# 查看本地代码状态
git status
- 已暂存 (changes to be committed)
所列的内容是在Index中的内容,commit之后进入Git Directory
new file //表示新建文件
modified //表示修改文件
deleted //表示删除文件
已修改 (changed but not updated)
所列的内容是在Working Directory中的内容,add之后将进入Index。
modified //表示修改文件
deleted //表示删除文件
未跟踪 (untracked files)
所列的内容是尚未被Git跟踪的内容,add之后进入Index
# 将文件添加至暂存区
git add命令主要用于把我们要提交的文件的信息添加到索引库中(在修改文件后,需要使用git add把文件加入暂存区,这样git commit时才能把已经修改的信息加入版本库,)。
当我们使用git commit时,git将依据索引库中的内容来进行文件的提交。
git add .
git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
git add -u :他仅监控已经被add的文件(即tracked file),他会将被修改的文件提交到暂存区。
add -u 不会提交新文件(untracked file)。(git add --update的缩写)
git add -A :是上面两个功能的合集(git add --all的缩写)
若需回滚
让更改回退
git reset HEAD <file>…
之后进行检查, 让暂存区回退至更改之前状态
git checkout -- <file>
# 提交,添加至本地仓库
git commit -m "备注说明"
- -m "" 这个命令表示添加备注
若需回滚
查看版本历史记录
git log
按q 退出历史记录查看。
退回至某一版本
git reset --hard [commit哈希值]
此时若需要删除某一个文件
git rm 文件名
此时暂存区是没有该文件了,再将本地仓库中的文件也清除,即再次提交。
git commit -m “”
# 推送push至远程仓库
推送到Git仓库。
git push -u origin master:master
这里master为我自己的分支的名称,实际应用中,你要改成自己的分支的名称.(没有:master表示默认分支)
若没有分支,直接输入:
git push
若提交时,出现如下错误
可能因为远程仓库与本地仓库冲突,先合并,再提交。
代码合并
git pull --rebase origin master
再提交
git push -u origin master:master
# 四、Git分支管理
# 常用分支命令
命令 | 描述 |
---|---|
git branch | 查看本地所有分支 |
git branch -a | 查看本地以及远程仓库的所有分支 |
git branck -r | 查看远程服务器的分支 |
git branch 分支名 | 创建分支 |
git checkout 分支名 | 切换分支 |
git checkout -b 分支名 | 创建新分支的同时切换分支 |
git branch -d 分支名 | 删除分支 |
git branch --set-upstream-to=origin/dev dev | 本地分支和远程分支建立联系 |
git branch -vv | 查看本地分支和远程分支的关联关系 |
git push origin 分支名 | 将本地分支推送到远程服务器 |
git push origin --delete dev | 删除远程分支 |
# 合并分支-分支替换主干
# 删除本地master分支
在项目根目录,进入git bash界面。
删除本地master分支
git branch -D master
# 删除远程master分支
git push origin :master
提示我无法删除主分支,后来百度了一下,是因为远程git的默认分支设定成了master分支,所以无法删除.
解决:页面登录远程git修改默认分支。
修改完成后再执行删除分支命令,就成功啦
git push origin :master
# 新建本地master分支
然后再新建本地master分支(创建并切换至新分支)
git checkout -b master
# 推送至远程master
把本地master分支推送到远程
git push origin master:master
重新把master分支设为default分支和保护分支。
此时在git上master已是dev-0.0.1分支的代码,而且能看到dev-0.0.1分支的提交记录。
# 五、Git标签管理
# 常用标签命令
命令 | 描述 |
---|---|
git tag | 查看所有标签 |
git tag v1.0.1 | 创建标签 |
git tag -a 标签名 -m “提示信息” | 创建标签时,给标签添加描述辅助信息 |
git push origin v1.0.1 | 将该标签推送至远程仓库 |
git tag -d v1.0.1 | 删除指定标签 |
# 六、Git问题记录
# Authentication failed
Git报错信息:
fatal: Authentication failed for又不弹出用户名和密码的解决办法
解决方法:
Windows搜索凭据管理器
由于Windows自动记录了你的凭据,去Windows的凭据管理器中,找到对应的Git地址,删除该凭据即可。
# HTTP 413 curl 22
Git报错信息:
在使用gitlab进行http请求——git push操作时,提示如下错误信息:
error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413
send-pack: unexpected disconnect while reading sideband packet
Writing objects: 100% (52/52), 1.51 MiB | 4.13 MiB/s, done.
Total 52 (delta 1), reused 0 (delta 0), pack-reused 0
fatal: the remote end hung up unexpectedly
2
3
4
5
分析原因:
http的413错误码是请求体太大,那自然是服务器配置问题,这是Web服务器阻止大型上传文件。
由于我使用的是域名代理:服务端是用nginx反向代理的,所以解决方法是去改nginx配置(上传文件的大小限制client_max_body_size
默认1m
)。
解决方法:
找到nginx配置文件 nginx.conf;
在http 的 server 节点中添加client_max_body_size
。
http {
server {
client_max_body_size 100m
#其他配置
}
# 其他配置
}
2
3
4
5
6
7
重启nginx,重载配置使其生效。
# Git pull冲突解决
# 提交文件超过100M push失败
在不改变最大限制100M的情况下进行重新上传步骤如下:
1、将本次需要提交的文件拷贝至其他目录;
2、删除超出最大限制的文件;
3、查看版本历史记录
git log
4、退回至上一版本
git reset --hard [commit哈希值]
5、再将目录拷贝回去
6、重新提交
git pull;git add .;git commit -m 'again commit';git push;
# Git push失败
本地创建项目,然后在github上新建一个远程库,想要将其与我本地的库相关联,执行git init一系列操作后,进行git push操作,结果报错如下:
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'https://gitee.com/XXX/XXXXXX.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
2
3
4
5
6
从提示可以看出,是由于两者不同步,因此需要先pull,进行合并然后在进行push, 因此先使用如下命令将远程文件同步下来。
git pull --rebase origin master
然后再执行推送。
git push -u origin master
# Git push 报错 pre-receive
推送代码到 GitLab 远程 master
分支上,然后提交失败了,提示如下:
! [remote rejected] master -> master (pre-receive hook declined)
原因:
用户权限不足,无法 push 代码到 master
分支上。只要将用户角色设置成 Master、Owner 等含有 master
分支操作的权限即可。
解决:
将当前项目所属成员的角色权限调整为主程序员。
# Git pull 出现Shelf问题
问题前置:
写的代码没有提交到本地仓库(更别说远程仓库),又通过idea的拉取功能强制进行merge操作。
出现问题:
就会出现如下图现象,出现一个Shelf页签,自己的代码都在这个里面。
解决方案:
方案一:
idea底部-> git -> Shelf -> 右键->选择Unshelve。
出现如下界面
输入comment
内容,点击Unshelve Changes
按钮。
看情况是否需要替换,可以一个一个类查看,然后点击Overwrite
按钮。
若有冲突时合并下,出现如下提示,恭喜你未提交的代码找回来了,记得提交,避免丢失。
方案二:
idea底部-> git -> Shelf -> 右键->选择Unshelve(或者选中状态下点击左侧按钮)。
慢慢合并完所有的代码即可。
# Gitee的MD中图片无法显示问题
问题:
在我们使用github或者gitee(码云)的时候经常会在md文档中添加一些图片,本地显示没有问题,但是当我们推送本地仓库到远程仓库后图片不能正常显示。
原因分析
由于图片属于本地图片,在本地md文件的图片可以显示。而推送到远程仓库后,缺少一个本地资源和网络资源的映射。所以需要我们把资源上传到一个网络空间,然后引用那个网络空间的地址即可。
解决方案
在gitee或者github创建一个存放图片的远程仓库。
把自己需要的图片推送到远程仓库。
然后进入远程仓库,点击原始数据进行查看。
直接将显示的图片文件拖拽到typora编辑器中即可得到引用图片的地址。
注:之所以在这里使用typora是因为手写引用地址容易出错。
地址样式如下:
![img](https://gitee.com/XXX/imge/raw/master/XXX.png)
1
# Git Bash设置字体大小
1、任意地方打开Git Bash窗口
;
2、点击Git Bash
窗口标题栏位置,右键选择Options
;
3、选择Text
,点击Select...
;
4、选择合适的字体大小,先点击应用,再点击确定。
5、再点击Apply
,之后点击Save
。
# 七、Git相关资料
- 官方