Git

dev-env-resourcecode-management

# 一、Git基础

分布式版本控制系统。

# Git下载

Git 官网下载 (opens new window)

TortoiseGit 官网下载(Git小乌龟) (opens new window)

# Git本地仓库流程图

# Git工作流

Git工作流是代码管理的流程、方式,主要有以下四种方式。

# 1. 中央集中式工作流

与SVN工作流程一致。

Git有中央仓库(远程仓库origin)master、本地仓库(HEAD)、 .git隐藏目录。

# 2. 功能分支工作流

2

# 3. GitFlow工作流

通过为功能开发、发布准备、维护分配独立的分支,让发布迭代过程更流畅、严格、规范。包含master主分支、dev开发分支、feature功能分支、release预发布分支、hotfix热修复分支。

3

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

# 创建公钥

  1. 在本地创建ssh key,输入自己注册GitHub时候的邮箱地址
ssh-keygen -t rsa -C "your_email@youremail.com"
1

​ 后面的一些操作我们默认回车就可以,然后成功后会在User文件夹对应的用户下创建.ssh文件夹( C:\Users\用户名\.ssh)。

  1. 其中有一个id_rsa.pub文件,我们复制其中的key。

# Github配置SSH(账户)

  1. 之后返回github,进入 Account Settings(账户配置),左边选择SSH and GPG Keys选项;

  2. 创建SSH Key

    其中的title随便填,下面的key粘贴在你电脑上生成的key。

# 验证绑定

  1. 验证是否绑定本地成功,在git-bash中验证,输入指令:
ssh -T git@github.com
1

如果第一次执行该指令,则会提示是否continue继续;

如果我们输入yes就会看到成功信息:Hi 账户!You`ve successfully authenticated...

# 配置SSH(项目)

如果只是对于某一个项目需要免登录,则进入所需配置项目单独配置。

  1. 进入项目,选择settings——> Deploy keys ——> Add key

# 配置多个账户

若需要在同一台电脑,配置多个gitee/gitlab/github账户进行git管理,则需要按照以下操作进行配置使用SSH。

# 配置2个公钥和私钥

  1. 在本地创建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
1
2

​ 成功后会在User文件夹对应的用户目录下创建.ssh文件夹( C:\Users\用户名\.ssh),生成公钥至指定的文件中。

  1. 添加
ssh-agent bash
ssh-add ~/.ssh/id_rsa_key1
ssh-add ~/.ssh/id_rsa_key2
1
2
3

# Github配置SSH(账户)

复制id_rsa_xxx.pub文件中的内容,进入各自服务器配置Key。

  1. 之后返回github,进入 Account Settings(账户配置),左边选择SSH and GPG Keys选项;

  2. 创建SSH Key。

    其中的title随便填,下面的key粘贴在你电脑上生成的key。

# 配置config

添加config文件

cd ~/.ssh
touch config
vim confg
1
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
1
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
1

# 查看仓库配置

命令 描述
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
1
2

# 项目下配置账号

在具体项目配置账号,进入具体的项目bash执行:

git config user.name "username"
git config user.email "email@163.com"
1
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
1

# 三、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"
1
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
1
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 "你的邮箱"
1
2

git初始化

完成初始化

git init
1

克隆

git clone <项目地址>
1

# 上传代码至远程仓库

# 查看本地代码状态

git status
1
  1. 已暂存 (changes to be committed)

​ 所列的内容是在Index中的内容,commit之后进入Git Directory

​ new file //表示新建文件

​ modified //表示修改文件

​ deleted //表示删除文件

  1. 已修改 (changed but not updated)

    所列的内容是在Working Directory中的内容,add之后将进入Index。

    modified //表示修改文件

    deleted //表示删除文件

  2. 未跟踪 (untracked files)

    所列的内容是尚未被Git跟踪的内容,add之后进入Index

# 将文件添加至暂存区

git add命令主要用于把我们要提交的文件的信息添加到索引库中(在修改文件后,需要使用git add把文件加入暂存区,这样git commit时才能把已经修改的信息加入版本库,)。

当我们使用git commit时,git将依据索引库中的内容来进行文件的提交。

git add . 
1
  • 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>
1

之后进行检查, 让暂存区回退至更改之前状态

git checkout -- <file>
1

# 提交,添加至本地仓库

git commit -m "备注说明"
1
  • -m "" 这个命令表示添加备注

若需回滚

查看版本历史记录

git log
1

按q 退出历史记录查看。

退回至某一版本

git reset --hard [commit哈希值]
1

此时若需要删除某一个文件

git rm 文件名
1

此时暂存区是没有该文件了,再将本地仓库中的文件也清除,即再次提交。

git commit -m “”
1

# 推送push至远程仓库

推送到Git仓库。

git push -u origin master:master 
1

这里master为我自己的分支的名称,实际应用中,你要改成自己的分支的名称.(没有:master表示默认分支)

若没有分支,直接输入:

git push
1

若提交时,出现如下错误

44

可能因为远程仓库与本地仓库冲突,先合并,再提交。

代码合并

git pull --rebase origin master
1

再提交

git push -u origin master:master 
1

# 四、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
1

# 删除远程master分支

git push origin :master
1

提示我无法删除主分支,后来百度了一下,是因为远程git的默认分支设定成了master分支,所以无法删除.

解决:页面登录远程git修改默认分支。

修改完成后再执行删除分支命令,就成功啦

git push origin :master
1

# 新建本地master分支

然后再新建本地master分支(创建并切换至新分支)

git checkout -b master
1

# 推送至远程master

把本地master分支推送到远程

git push origin master:master
1

重新把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
1
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
    #其他配置
  }
  # 其他配置
}
1
2
3
4
5
6
7

重启nginx,重载配置使其生效。

# Git pull冲突解决

# 提交文件超过100M push失败

在不改变最大限制100M的情况下进行重新上传步骤如下:

1、将本次需要提交的文件拷贝至其他目录;

2、删除超出最大限制的文件;

3、查看版本历史记录

git log
1

4、退回至上一版本

git reset --hard [commit哈希值]
1

5、再将目录拷贝回去

6、重新提交

git pull;git add .;git commit -m 'again commit';git push;
1

# 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.
1
2
3
4
5
6

从提示可以看出,是由于两者不同步,因此需要先pull,进行合并然后在进行push, 因此先使用如下命令将远程文件同步下来。

git pull --rebase origin master
1

然后再执行推送。

git push -u origin master
1

# Git push 报错 pre-receive

推送代码到 GitLab 远程 master 分支上,然后提交失败了,提示如下:

 ! [remote rejected] master -> master (pre-receive hook declined)
1

原因

用户权限不足,无法 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文件的图片可以显示。而推送到远程仓库后,缺少一个本地资源和网络资源的映射。所以需要我们把资源上传到一个网络空间,然后引用那个网络空间的地址即可。

解决方案

  1. 在gitee或者github创建一个存放图片的远程仓库。

  2. 把自己需要的图片推送到远程仓库。

  3. 然后进入远程仓库,点击原始数据进行查看。

  4. 直接将显示的图片文件拖拽到typora编辑器中即可得到引用图片的地址。

    注:之所以在这里使用typora是因为手写引用地址容易出错。

  5. 地址样式如下:

    ![img](https://gitee.com/XXX/imge/raw/master/XXX.png)
    
    1

# 七、Git相关资料

  • 官方

Git 官网下载 (opens new window)

TortoiseGit 官网下载(Git小乌龟) (opens new window)