OC学习22:Git使用

张建 lol

前言

  • Git 是一款免费、开源的 分布式版本控制系统

  • GitHub/Gitee(码云)/Gitlab(极狐)Git 做版本控制的项目托管平台

安装

Git官网 选择自己对应的系统安装,安装完成后在终端执行 git version,输出 git 版本则安装成功,Mac 本身自带 git,可以不用安装

1
2
mac@bogon ~ % git --version
git version 2.37.1 (Apple Git-137.1)

Git 工作流程

  1. workspace:工作区
  2. staging area:暂存区/缓存去
  3. local repository:本地仓库/版本库
  4. remote repository:远程仓库

Coding 仓库创建

仓库创建有四种方式:

  1. 导入外部仓库
1
仓库克隆地址
  1. 快速初始化仓库
1
快速初始化仓库会为您的仓库新建一个 README 文件。 同时您也可以选择为仓库增加一个 .gitignore 文件。
  1. 使用命令行创建仓库

本地桌面创建一个空的文件夹 UBR

1
2
3
4
5
6
git clone https://e.coding.net/zj13718004742/ubr_ios/UBR_iOS.git
cd UBR_iOS
echo "# UBR_iOS" >> README.md
git add README.md
git commit -m "first commit"
git push -u origin master
  1. 使用命令行推送已存在的仓库
1
2
git remote add origin https://e.coding.net/zj13718004742/ubr_ios/UBR_iOS.git
git push -u origin master

关联远程仓库

  1. 查看所有远程仓库关联
1
2
3
mac@bogon UBR_iOS % git remote -v
origin https://e.coding.net/eubrmb/UBR_iOS.git (fetch)
origin https://e.coding.net/eubrmb/UBR_iOS.git (push)

注:
1、git remote -v:显示所有远程仓库
2、下面的 origin 表示有远程仓库
3、https://e.coding.net/eubrmb/UBR_iOS.git:表示仓库地址
fetch 表示可 拉取
push 表示可 推送

  1. 添加远程仓库关联
  • 如果有旧的关联仓库,如 1,需要将关联的远程仓库 解除
1
2
// 解除关联
mac@bogon UBR_iOS % git remote rm origin

注:
1、git remote rm origin:解除所有关联
2、git remote remove origin 仓库地址:解除单个关联

  • 添加新的关联
1
2
// 添加关联
mac@bogon UBR_iOS % git remote add origin https://e.coding.net/zj13718004742/ubr_ios/UBR_iOS.git

注:
添加新的关联时,需要配置一次用户信息

配置用户信息

  • 使用 git config 命令来配置用户信息
1
2
mac@bogon ~ % git config --global user.name "BboyZJ"
mac@bogon ~ % git config --global user.email 13718004742@163.com

注:
–global:表示你的配置文件在你用户主目录下,以后默认使用这里配置的用户信息。
如果要在某个特定的仙姑中使用其他名字或电子邮件,只要去掉 --global 重新配置即可,新设定保存在当前项目的 .git/config 文件中

  • 检查是否成功

使用 git config user.namegit config user.email 或者使用 git config --list

1
2
3
4
mac@bogon ~ % git config user.name
BboyZJ
mac@bogon ~ % git config user.email
13718004742@163.com

初始化git

1
mac@bogon ~ % git init

从远程仓库克隆代码

  1. 不指定分支(默认分支)
1
git clone 仓库地址
  1. 指定分支(所有远程分支都拉取下来 git branch -r 可查看)
1
git clone -b 远程分支名 仓库地址
  1. 指定分支(只克隆指定远程分支)
1
git clone -b 远程分支名 --single-branch 仓库地址
  1. 指定分支浅克隆(–depth)

如果单个分支下提交记录过多,我们只想克隆分支最新提交的代码,此时可以使用 --depth 1 实现浅克隆。

1
git clone -b 远程分支名 --depth 1 远程仓库地址

此时,我们 git log 查看历史提交记录,发现只剩下最后一次提交记录,而无法看到历史提交记录

1
git log

再指定了 --depth 之后,无需指定 --single-branch ,因为 浅克隆 隐含了 --single-branch,如果想要在 –depth 基础上拉取其他分支代码,可以通过添加 --no-single-branch ,会拉取到全部远程分支对应的最近一次提交记录。

1
git clone -b 远程分支名 --depth 1 --no-single-branch 远程仓库地址
  • 恢复全部历史提交记录

当我们使用了 –depth 1 克隆了当前分支代码,如果想要追溯历史提交记录,可以使用 git fetch --unshallow 命令重新拉取指定远程分支的全部记录

1
git fetch --unshallow 

创建分支

  1. 创建 本地 分支
1
2
3
4
5
// 创建本地分支
git branch 分支名

// 创建新分支并立即切换到该分支
git checkout -b 分支名
  1. 创建 远程 分支
1
git push origin 分支名

推送本地文件到远程,即创建远程分支

查看分支

  1. 查看 本地 的分支

输入如下的命令查看当前本地分支:

1
2
3
mac@bogon ~ % git branch
feature/sprint_17
* zj_feature

注:
1、git branch:表示查看当前本地分支
2、feature/sprint_17 和 zj_feature:表示当前本地分支有两个一个是 feature/sprint_17,一个是 zj_feature
3、* :* 表示你当前工作目录所处的分支

  1. 查看 远程 分支

输入如下的命令查看当前远程分支:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mac@bogon UBR_iOS % git branch -r
origin/HEAD -> origin/master
origin/Test/ubr_mpaas
origin/Test/ubr_uniapp
origin/feature/release_2.1
origin/feature/release_2.3.2
origin/feature/release_2.3.3
origin/feature/release_2.3.3_adtracking
origin/feature/sprint7
origin/feature/sprint8
origin/feature/sprint9
origin/feature/sprint_10
origin/feature/sprint_12
origin/feature/sprint_12_simulator
origin/feature/sprint_13
origin/feature/sprint_14
origin/feature/sprint_14_bugfix
origin/feature/sprint_14_mealVoucher
origin/feature/sprint_14_photo
origin/feature/sprint_14_richText
origin/feature/sprint_15
origin/feature/sprint_15_reservation
origin/feature/sprint_16
origin/feature/sprint_16_bugfix
:

注:
1、remotes/origin/HEAD -> origin/master:表示远程仓库默认 指向 仓库下master分支
2、remotes/origin/HEAD:表示 远程 仓库 默认
remote:是远程的意思
/:代表路径
origin:表示一个 别名git 会自动为你将此远程仓库命名为 origin
HEAD:就像一个指针,表示默认分支
3、->:表示指向的意思
4、origin/master:远程仓库路径下master分支

  1. 查看所有分支

输入如下命令查看所有分支:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
mac@bogon UBR_iOS % git branch -a
feature/sprint_17
* zj_feature
remotes/origin/HEAD -> origin/master
remotes/origin/Test/ubr_mpaas
remotes/origin/Test/ubr_uniapp
remotes/origin/feature/release_2.1
remotes/origin/feature/release_2.3.2
remotes/origin/feature/release_2.3.3
remotes/origin/feature/release_2.3.3_adtracking
remotes/origin/feature/sprint7
remotes/origin/feature/sprint8
remotes/origin/feature/sprint9
remotes/origin/feature/sprint_10
remotes/origin/feature/sprint_12
remotes/origin/feature/sprint_12_simulator
remotes/origin/feature/sprint_13
remotes/origin/feature/sprint_14
remotes/origin/feature/sprint_14_bugfix
remotes/origin/feature/sprint_14_mealVoucher
remotes/origin/feature/sprint_14_photo
remotes/origin/feature/sprint_14_richText
remotes/origin/feature/sprint_15
remotes/origin/feature/sprint_15_reservation
:

切换分支

1
2
// 切换分支
git checkout 分支名

删除分支

1
2
3
4
5
//  删除本地分支
git branch -d 分支名

// 删除远程分支
git push origin --delete 分支名

拉取远程分支代码

  1. 不用先在本地创建分支
1
2
// 把远程分支代码拉到本地
git fetch origin 远程仓库分支名

第一次拉分支最好不要用 origin,而是直接仓库地址,后面跟 远程分支名

1
git fetch xxx(远程仓库地址) 远程分支名
  1. 需要现在本地创建相应的分支,然后再拉取代码
1
2
3
4
5
// 在本地创建分支 dev 并切换到该分支
git checkout -b dev(本地分支名称) origin/dev(远程分支名称)

// 把某个分支的内容拉取到本地
git pull origin dev(远程分支名称)

合并本地不同分支代码

1
2
3
4
// 切换到当前分支
mac@bogon ~ % git checkout current_feature
// 合并其他分支代码到当前分支
mac@bogon ~ % git merge other_feature

合并远程不同分支代码

1

映射关系

  1. 建立本地分支和远程分支的映射关系
1
2
// 建立本地分支和远程分支的映射关系
git branch --set-upstream-to origin/分支名
  1. 撤销本地分支与远程分支的映射关系
1
2
// 撤销本地分支与远程分支的映射关系
git branch --unset-upstream
  1. 查看本地分支和远程分支的映射关系
1
2
// 查看本地分支和远程分支的映射关系
git branch -vv

在当前本地分支上创建一个新的本地分支

  • 在当前本地分支上创建一个新的本地分支,会将当前一个本地分支的代码 复制一份 到新的一个本地分支上
1
mac@bogon ~ % git checkout -b zj_feature

上面的命令等价于

1
2
mac@bogon ~ % git branch zj_feature
mac@bogon ~ % git checkout zj_feature

注:
git branch zj_feature:表示创建一个新的本地分支,分支名叫 zj_feature
git checkout zj_feature:表示切换到本地分支 zj_feature

提交本地文件到暂缓区

1
2
3
4
5
6
7
8
// 将当前目录下所有文件提交到暂存区
git add .

// 添加单个文件到暂缓区
git add file ...

// 查看暂缓区和工作区的差异
git diff

本地分支强制提交到远程分支

1
git push origin master --force

查看记录

  • 查看当前仓库的状态
1
mac@bogon products_dgios % git status

  • 查看提交记录(查看当前分支的)
1
mac@bogon products_dgios % git log

  • 查看以前的提交日志(包含所有分支提交的记录)
1
mac@bogon products_dgios % git reflog

  • 查看指定文件的修改记录
1
mac@bogon products_dgios % git blame 文件名

版本回退

HEAD^ 代表最新的版本(代替id)
HEAD^2 代表上两个的版本(代替id)
HEAD^n 代表上n个版本(代替id)

  1. 在回退之前需要 查看提交记录git log,如下:

  1. reset 三种回退方式
  • –soft 回退到 commit 之前
1
git reset --soft HEAD^
  • –mixed 回退到 add 之前
1
git reset --mixed
  • –hard 回退到 没修改代码前(删除修改的代码)
1
2
// 回退到指定版本
git reset --hard 版本id
  1. git 本地提交但未提交到远程分支,回退到提交之前,可保留提交内容也可以不保留
  • 保留提交内容:git reset 提交的id

注意:此 id 为 提交备注下面的 commit id,

由上图可知:

备注 测试本地回退 是在本地暂存区,commit id3d4101ed50a8b671eef2821ee95f141a84db0035

而我们想回退到备注 1、密码/指纹/面容/手势登录已完成 2、账号密码登录返回的错误码处理已完成 ,可看出已经提交到远程分支了,commit id3b889fec7db806852c2306ac133685d5d38782db,我们需要用到它去回退,如下:

1
2
3
mac@bogon products_dgios % git reset 3b889fec7db806852c2306ac133685d5d38782db
Unstaged changes after reset:
M DigitalGuard.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate
  • 不保留提交内容:git reset --hard 提交id

注意:此 id提交备注 下面的 commit id,不是上面的 id

1
2
mac@bogon products_dgios % git reset --hard 3b889fec7db806852c2306ac133685d5d38782db
HEAD is now at 3b889fe 1、密码/指纹/面容/手势登录已完成 2、账号密码登录返回的错误码处理已完成
  1. git 代码已经提交到远程分支,退回到提交之前
  • git log 查看提交记录

  • 保留提交内容:执行 git reset 提交的 id,成功后会撤回 id 的提交

1
2
3
mac@bogon products_dgios % git reset 3b889fec7db806852c2306ac133685d5d38782db
Unstaged changes after reset:
M DigitalGuard.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate
  • 不保留提交内容:执行 git reset --hard 提交的 id,成功后会撤回 id 的提交
1
mac@bogon products_dgios % git reset --hard 3b889fec7db806852c2306ac133685d5d38782db

推送

// 推送到远程第一次加 -u
git push -u origin master
// 不是第一次推送
git push origin zj_feature

提交

// 提交所有代码到暂存区
git add .
// 提交到本地仓库
git commit -m “注释说明”
// 提交到 远程仓库
git push origin zj_feature

拉取代码

// 克隆
git clone git@github.com :BboyZJ/ZJWeakProxy.git

分支操作

  • 在分支下的操作

// 切换到 zj_feature
git checkout zj_feature
// 添加到暂缓区
git add files….
// 提交到本地仓库
git commit -m “commit msg”
// 提交到远程 zj_feature 分支
git push origin zj_feature

  • 更新到主分支

// 切换到主分支
git checkout master
// 拉取主分支内容
git pull origin master
git add files….
// 提交到本地仓库
git commit -m “commit msg”
// 提交到远程 master 分支
git push origin master

  • 合并分支

// 切换到 zj_feature
git checkout zj_feature
// 合并主分支到当前分支
git merge master
// 提交到远程分支 zj_feature
git push origin zj_feature

tag

// 切换到想打tag的分支
git checkout master
// 创建带有信息的tag
git tag -a release_v1.0 -m “release_v1.0”
// 创建不带有信息的tag
git tag release_v1.0
// 查看tag
git tag
// 推送全部tag
git push –tags
// 推送单个tag
git push origin release_v1.0

项目中实际应用:本地实现了一个demo,需要上传到已存在的远程仓库

  1. 将本地 demo 已存在的git仓库删除
1
2
mac@bogon Demo-A % sudo rm -rf .git
Password:

提示需要输入密码:输入你的电脑密码

  1. 初始化一个新的git
1
2
mac@bogon Demo-A % git init
Initialized empty Git repository in /Users/mac/Demo-A/.git/
  1. 此时你本地git仓库是空的
1
mac@bogon Demo-A % git branch
  1. 关联你要建立连接的远程仓库地址
1
mac@bogon Demo-A % git remote add origin http://172.16.21.253/products_dgios/products_dgios.git
  1. 创建并切换新的分支
1
2
3
4
5
6
7
mac@bogon Demo-A % git branch
* main
mac@bogon Demo-A % git branch feature_dfios_demo_box_dev
mac@bogon Demo-A % git checkut feature_dfios_demo_box_dev
mac@bogon Demo-A % git branch
* feature_dfios_demo_box_dev
mainn
  1. 首次推送demo到新分支
1
2
3
4
5
6
7
8
9
10
11
12
13
14
mac@bogon Demo-A % git add .
mac@bogon Demo-A % git commit -m "本地demo新分支"
On branch feature_dfios_demo_box_dev
nothing to commit, working tree clean
mac@bogon Demo-A % git push origin -u feature_dfios_demo_box_dev
Enumerating objects: 38, done.
Counting objects: 100% (38/38), done.
Delta compression using up to 4 threads
Compressing objects: 100% (33/33), done.
Writing objects: 100% (38/38), 24.84 KiB | 1.46 MiB/s, done.
Total 38 (delta 4), reused 0 (delta 0), pack-reused 0
To http://172.16.21.253/products_dgios/products_dgios.git
* [new branch] feature_dfios_demo_box_dev -> feature_dfios_demo_box_dev
branch 'feature_dfios_demo_box_dev' set up to track 'origin/feature_dfios_demo_box_dev'.

出现上面的结果:表示代码上传成功

项目中实际使用:pull 分支报错 fatal: Need to specify how to reconcile divergent branches…

  1. 报错消息
  • 示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
➜  git:(test) git pull origin sdp_vpn
* branch sdp_vpn -> FETCH_HEAD
hint: You have divergent branches and need to specify how to reconcile them.
hint: You can do so by running one of the following commands sometime before
hint: your next pull:
hint:
hint: git config pull.rebase false # merge (the default strategy)
hint: git config pull.rebase true # rebase
hint: git config pull.ff only # fast-forward only
hint:
hint: You can replace "git config" with "git config --global" to set a default
hint: preference for all repositories. You can also pass --rebase, --no-rebase,
hint: or --ff-only on the command line to override the configured default per
hint: invocation.
fatal: Need to specify how to reconcile divergent branches.

  • 翻译:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
➜git:(test) git pull origin sdp_vpn
提示:您有不同的分支,需要指定如何协调它们。
提示:您可以通过在之前某个时间运行以下命令之一来做到这一点
提示:你的下一招:
提示:
提示:git config pull.rebase false # 合并(默认策略)
提示:git config pull.rebase true # Rebase
提示:git config pull.ff only # 仅快进
提示:
提示:可以将“git config”替换为“git config——global”来设置默认值
提示:首选所有存储库。你也可以传递——rebase,——no-rebase,
提示:或命令行上的——ff-only,以覆盖配置的默认per
提示:调用。
fatal:需要指定如何协调不同的分支。

  1. 解决办法

分析:这是由于你 pull拉取 分支前,进行过 merge 合并更新分支操作,而其他人在你之前已经push过一个版本,导致版本不一致

第一种解决方法:比较简单

  • 执行 git config pull.rebase false

  • 默认将 pull 下来的代码与现有改动的代码进行合并

  • 但是可能会造成代码冲突,需要处理下这个问题,代码冲突如果2个人都改了同一个文件,需要联系之前push的同学,看看这块代码怎么保存

第二种解决方法:回退到合并之前的代码,在进行pull拉取最新代码

注意:这种解决方法仅适用于 2 个分支之间的合并(git merge)操作,比如你是将 sdp_vpn 开发分支合并到 sdp_vpn_zj 分支之前没 pull,那这时候 sdp_vpn_zj 分支需要回退到未合并前的版本。
sdp_vpn_zj 上合并上去的代码将会丢失,等你 sdp_vpn_zj 分支能成功 pull 后,需要重新合并(merge)开发分支 sdp_vpn 上的代码合并到 sdp_vpn_zj 上。所以记得保留 sdp_vpn 开发分支这个版本的代码再把 sdp_vpn_zj 回退到上一个版本,等 pull 成功,再重新在 sdp_vpn_zj 分支上合并 sdp_vpn 分支代码

  • 查看最近3次提交的历史版本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
➜  git:(test) git log -2			# 查看最近2次提交的历史版本
commit 6018c237278f5265e78314049d6642e493ebdb0d
Author: ZJ
Date: Wed Jan 19 09:57:50 2022 +0800

合并之后

commit 33df706e780d10af6435bda1fee85430604eebfd
Merge: 1d06cd1f 7589979d
Author: ZJ
Date: Tue Jan 18 16:11:21 2022 +0800

合并之前

  • 根据历史版本记录,选择commit地址,回退到自己合并之前的版本
1
➜  git:(test) git reset --hard 33df706e780d10af6435bda1fee85430604eebfd
  • 再进行pull更新分支
1
➜  git:(test) git pull origin sdp_vpn_zj
  • 最后再重新合并代码
1
➜  git:(test) git merge sdp_vpn
  • 记得养成一个良好git发布流程的习惯
1
2
3
4
5
6
7
8
# 分支合并发布流程:
git add . # 将所有新增、修改或删除的文件添加到暂存区
git commit -m "版本发布" # 将暂存区的文件发版
git status # 查看是否还有文件没有发布上去
git checkout sdp_vpn_zj # 切换到要合并的分支
git pull # 在 sdp_vpn_zj 分支上拉取最新代码,避免冲突
git merge sdp_vpn # 在 sdp_vpn_zj 分支上合并 sdp_vpn 分支上的代码
git push # 上传 sdp_vpn_zj 分支代码

【面试题】

  • 提交 单个/多个 文件夹/文件

git add 可以提交 单个/多个 文件夹/文件,后面加上 文件夹/文件路径 即可

1
2
3
4
mac@bogon SRSF % git branch zj_feature
mac@bogon SRSF % git add /Users/mac/Desktop/SRSF/SRSF/Classes/UI\(用户界面\)/Me\(我的\)/Collect\(收藏\)
mac@bogon SRSF % git commit -m "提交收藏文件夹"
mac@bogon SRSF % git push origin zj_feature

提交代码到Coding遇到的问题

处理:
1、查看自己是否有推送权限,没有先找所有者开通权限(不然白忙活)
2、是否已经进行git pull操作,没有先pull

1
git pull

3、git gc 先清一清垃圾再说,说不定就没问题了(笑~)

1
git gc

4、–no-thin,提交时去掉优化,直接提交

1
git push --no-thin origin xxx
  • Post title:OC学习22:Git使用
  • Post author:张建
  • Create time:2023-03-19 08:21:04
  • Post link:https://redefine.ohevan.com/2023/03/19/OC/OC学习22:Git使用/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.