玩转 Git(一) Git基本使用

目录

一、Git 和 SVN 的区别

二、基本命令行操作

2.1 初始化仓库

2.2 设置签名

2.3 Git 版本使用

2.4 文件差异比较

2.5 分支操作

2.6 本地仓库和远端仓库

2.7 冲突处理

2.8 SSH 免密登录

三、异常情况处理

3.1 无法 push 代码

3.2 git pull:Your local changes to the following files would be overwritten by xxx


一、Git 和 SVN 的区别

 GITSVN
协同修改允许多人并行修改统一文件允许多人并行修改统一文件
数据备份可以备份当前状态和每一个提交过的历史状态可以备份当前状态和每一个提交过的历史状态
版本管理采用文件系统快照的方式采用增量式管理
权限控制不仅能对团队内部做权限控制,还能对团队外开发者贡献的代码进行审核只能对团队内部做权限控制
历史记录查看修改人、时间、内容、日志等,并允许恢复查看修改人、时间、内容、日志等,并允许恢复
分支管理允许开发团队有多条生产线同时推进任务允许开发团队有多条生产线同时推进任务

 

二、基本命令行操作

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值