目录
3.2 git pull:Your local changes to the following files would be overwritten by xxx
一、Git 和 SVN 的区别
GIT | SVN | |
协同修改 | 允许多人并行修改统一文件 | 允许多人并行修改统一文件 |
数据备份 | 可以备份当前状态和每一个提交过的历史状态 | 可以备份当前状态和每一个提交过的历史状态 |
版本管理 | 采用文件系统快照的方式 | 采用增量式管理 |
权限控制 | 不仅能对团队内部做权限控制,还能对团队外开发者贡献的代码进行审核 | 只能对团队内部做权限控制 |
历史记录 | 查看修改人、时间、内容、日志等,并允许恢复 | 查看修改人、时间、内容、日志等,并允许恢复 |
分支管理 | 允许开发团队有多条生产线同时推进任务 | 允许开发团队有多条生产线同时推进任务 |
二、基本命令行操作
2.1 初始化仓库
### 初始化git
git init
### 克隆项目
# 克隆项目到当前目录
git clone [xxxx 项目链接]
例如: git clone http://git.xxx.com/web/xxx.git
# 克隆项目到当前目录,并指定文件夹名称
git clone [xxxx 项目链接] [xxxx 文件夹名称]
例如: git clone http://git.xxx.com/web/xxx.git dev_tom
# 克隆项目到指定文件夹
git clone [xxxx 项目链接] [xxxx 文件夹路径和名称]
git clone http://git.xxx.com/web/xxx.git f:/test
2.2 设置签名
- 项目级别/仓库级别: 仅在当前本地库范围内有效
- 系统用户级别:登录 windows 系统的用户范围
- 优先级: 就近原则,项目级别 > 系统用户级别
### 设置项目级别
git config user.name tom
git config user.email licyafighting@gmail.com
### 设置系统用户级别
git config --global user.name tom
git config --global user.email licyafighting@gmail.com
### 查看配置文件目录
cat .git/config
### 查看系统配置文件
# 进入家目录
cd ~
# 查看配置文件
cat .gitconfig
2.3 Git 版本使用
### 查看工作区和暂存区状态
git status
### 将工作区的新建/修改添加到缓存区
git add [xxxxx 文件名]
### 将暂存区的内容提交到本地库
git commit -m "描述信息" [xxxxx 文件名]
### 查看日志
git log
# 一行显示,hash名全部显示
git log --pretty=oneline
# 一行展示
git log --oneline
# 一行显示,并带指针
git reflog
### 版本前进和后退操作
# 基于索引
git reset --hard [xxxx hash值]
# 使用符号
git reset --hard HEAD^ # 后退一步
git reset --hard HEAD~3 # 后退三步
2.4 文件差异比较
### 文件修改比较
# 与暂存区进行比较
git diff [xxxxx 文件名]
# 与本地库进行比较
git diff HEAD [xxxxx 文件名]
# 与某个历史版本比较
git diff HEAD [xxxxx 版本hash值] [xxxxx 文件名]
2.5 分支操作
### 分支操作
# 查看本地分支
git branch -v
# 查看所有分支
git branch -a
白色为本地分支,红色为远端分支,绿色为当前使用的分支
# 创建分支
git branch [xxxxx 新分支名]
# 创建新分支并切换过去
git checkout -b [xxxxx 新分支名]
git switch -c [xxxxx 新分支名]
# 切换分支
git checkout [xxxxx 已有分支名]
git switch [xxxxx 已有分支名]
# 删除分支
git branch -d [xxxxx 已有分支名]
### 合并分支
# 先切换到要合并到的那个分支上
git checkout [xxxxx 分支名A]
# 合并分支
git merge [xxxxx 待合并的分支名B]
2.6 本地仓库和远端仓库
### 本地库与远端库操作
# 查看远端配置项
git remote -v
# 增加远端配置
git remote add [xxx 远端配置名] [xxx 远端地址]
如: git remote add origin https://github.com/xxxxx/xxx.git
# 推送
git push origin master
# 克隆
git clone [xxx 远端地址]
如: git clone https://github.com/xxxxx/xxx.git
# 获取远端分支的文件,但并不修改本地
git fetch origin master
# 对比分支
git diff [xxx 本地分支] [xxx 远端分支]
如: git diff master origin/master
红色为本地记录,绿色为远端修改
# 拉取分支
git pull [xxx 远程库地址别名] [xxx 远端分支]
如:git pull origin master
# 创建分支并拉取远端代码
git switch -c [xxxx 要创建的分支名] [xxx 要拉取的远端分支名]
git switch -c dev_tom origin/dev
推荐做法:
fetch分支 git fetch origin master
=> 对比分支 git diff master origin/master
=> 合并分支 git merge origin/master
2.7 冲突处理
2.7.1 什么是冲突?出现冲突的原因
冲突即不同的提交部分,不同的开发者修改了相同的位置,当其中一人成功提交到远端仓库时,另一人进行提交前的拉取后,就会出现冲突。
例如:有一份文件 aa.txt,小王修改了第四行:
而远端仓库中,已经有别人改了这一行了
此时若小王 pull 远端仓库代码到本地,则由于 git 无法决定使用哪一种修改,就会出现冲突
2.7.2 如何解决冲突
首先,查看冲突的文件列表
# 查看冲突的文件列表
git status
打开对应的文件,并解决冲突
修改完成后,提交
# 提交解决冲突和的代码,此时不需要写具体提交的文件
git commit -m "xxxxxxx 描述字段"
如: git commit -m "1. delete the aa.txt"
# 提交到远端仓库
git push origin [xxx 分支名称]
如: git push origin master
2.8 SSH 免密登录
每次提交代码的时候,都要重新输入账号密码,这让人感觉十分的繁琐。Github 支持通过配置 SSH 实现免密登录。
2.8.1 生成 SSH 秘钥
# 生成秘钥
ssh-keygen -t rsa -C [xxx 邮箱]
例如: ssh-keygen -t rsa -C tomtom@163.com
可以看到,在 ssh 目录下生成了几个文件
# 进入ssh目录
cd ~
cd ./ssh
ls
2.8.2 复制秘钥
复制生成的公钥,并配置到 Github 上去
# 查看公钥,并复制
cat id_rsa.pub
将秘钥配置到 Github 上去
2.8.3 本地配置
先复制项目的 SSH 地址
本地新建个远程地址别名
# 配置ssh的远程连接别名
git remote add [xxx 远程连接别名] [xxx 项目的ssh地址]
例如: git remote add ossh git@github.com:xxx/xxx.git
# 查看本地管理的别名
git remote -v
第一次推送会出现提醒,直接填yes,之后的推送就可以直接推上去啦
三、异常情况处理
3.1 无法 push 代码
3.1.1 现象
failed to push some ref to xxxxx
3.1.2 原因
由于当前本地版本不是远程仓库上的最新版本,故需要先拉取代码到本地进行合并后才能提交
3.1.3 解决方式
可以通过 pull 命令直接拉取远端代码,但可能导致冲突。
# 直接拉取远端分支代码
git pull [xxx 远端仓库标识] [xxx 远端仓库分支]
如:git pull origin master
但当不确定时,这种方式可能引起冲突,我们可以先通过 fetch 命令获取远端代码,并与本地代码进行对比,而后决定是否要合并代码到本地。
# 获取远端代码(不会影响本地代码)
git fetch origin [xxx 远端分支名称/不填则是获取所有]
如: git fetch origin master 获取远端代码
# 对比分支
git diff [xxx 本地分支名] [xxx 远端分支名]
如: git diff master origin/master
# 若可以合并,则合并远端代码
git merge [xxx 远端分支名]
如: git merge origin/master
3.2 git pull:Your local changes to the following files would be overwritten by xxx
3.2.1 现象
error: Your local changes to the following files would be overwritten by merge:
aa.txt
Please commit your changes or stash them before you merge.
3.2.2 原因
由于本地存在未提交的代码,拉取远端代码会将本地的修改给覆盖掉
3.2.3 解决方式
方式一:暂存代码,获取了修改后释放
# 暂存本地代码
git stash
# 拉取分支
git pull origin [xxx 远端分支]
如: git pull origin master
# 释放暂存
git stash pop
有本地代码未提交,又要拉取代码到本地分支
本地未提交的代码为:
暂存本地代码
暂存后发现没有未提交的内容了
拉取代码
释放存储区内容,若存储区内容与拉下来的代码存在冲突,别慌,处理冲突即可。如何处理冲突请看 2.7 冲突处理
方式二、放弃本次修改,回退到最近的本地代码版本后拉取
# 回退到最近的一个版本
git reset --hard
# 重新拉取代码
git pull origin master