前言
安装 Git官网 选择自己对应的系统安装,安装完成后在终端执行 git version
,输出 git
版本则安装成功,Mac
本身自带 git
,可以不用安装
1 2 mac@bogon ~ % git --version git version 2.37.1 (Apple Git-137.1)
Git 工作流程
workspace:工作区
staging area:暂存区/缓存去
local repository:本地仓库/版本库
remote repository:远程仓库
Coding 仓库创建 仓库创建有四种方式:
导入外部仓库
快速初始化仓库
1 快速初始化仓库会为您的仓库新建一个 README 文件。 同时您也可以选择为仓库增加一个 .gitignore 文件。
使用命令行创建仓库
本地桌面创建一个空的文件夹 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 2 git remote add origin https://e.coding.net/zj13718004742/ubr_ios/UBR_iOS.git git push -u origin master
关联远程仓库
查看所有远程仓库关联
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 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
注: 添加新的关联时,需要配置一次用户信息
配置用户信息
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.name
和 git 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
从远程仓库克隆代码
不指定分支(默认分支)
指定分支(所有远程分支都拉取下来 git branch -r 可查看)
指定分支(只克隆指定远程分支)
1 git clone -b 远程分支名 --single-branch 仓库地址
指定分支浅克隆(–depth)
如果单个分支下提交记录过多,我们只想克隆分支最新提交的代码,此时可以使用 --depth 1
实现浅克隆。
1 git clone -b 远程分支名 --depth 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 2 3 4 5 // 创建本地分支 git branch 分支名 // 创建新分支并立即切换到该分支 git checkout -b 分支名
创建 远程 分支
推送本地文件到远程,即创建远程分支
查看分支
查看 本地
的分支
输入如下的命令查看当前本地分支:
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 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 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 2 // 把远程分支代码拉到本地 git fetch origin 远程仓库分支名
第一次拉分支最好不要用 origin,而是直接仓库地址,后面跟 远程分支名
1 git fetch xxx(远程仓库地址) 远程分支名
需要现在本地创建相应的分支,然后再拉取代码
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 2 // 建立本地分支和远程分支的映射关系 git branch --set-upstream-to origin/分支名
撤销本地分支与远程分支的映射关系
1 2 // 撤销本地分支与远程分支的映射关系 git branch --unset-upstream
查看本地分支和远程分支的映射关系
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)
在回退之前需要 查看提交记录git log
,如下:
reset 三种回退方式
–hard 回退到 没修改代码前(删除修改的代码)
1 2 // 回退到指定版本 git reset --hard 版本id
git 本地提交但未提交到远程分支,回退到提交之前,可保留提交内容也可以不保留
注意:此 id
为 提交备注下面的 commit id,
由上图可知:
备注 测试本地回退
是在本地暂存区,commit id
是 3d4101ed50a8b671eef2821ee95f141a84db0035
而我们想回退到备注 1、密码/指纹/面容/手势登录已完成 2、账号密码登录返回的错误码处理已完成
,可看出已经提交到远程分支了,commit id
是 3b889fec7db806852c2306ac133685d5d38782db
,我们需要用到它去回退,如下:
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、账号密码登录返回的错误码处理已完成
git 代码已经提交到远程分支,退回到提交之前
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,需要上传到已存在的远程仓库
将本地 demo 已存在的git仓库删除
1 2 mac@bogon Demo-A % sudo rm -rf .git Password:
提示需要输入密码:输入你的电脑密码
初始化一个新的git
1 2 mac@bogon Demo-A % git init Initialized empty Git repository in /Users/mac/Demo-A/.git/
此时你本地git仓库是空的
1 mac@bogon Demo-A % git branch
关联你要建立连接的远程仓库地址
1 mac@bogon Demo-A % git remote add origin http://172.16.21.253/products_dgios/products_dgios.git
创建并切换新的分支
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
首次推送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 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:需要指定如何协调不同的分支。
解决办法
分析:这是由于你 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
分支代码
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
1 ➜ git:(test) git pull origin sdp_vpn_zj
1 ➜ git:(test) git merge sdp_vpn
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
3、git gc 先清一清垃圾再说,说不定就没问题了(笑~)
4、–no-thin,提交时去掉优化,直接提交
1 git push --no-thin origin xxx