前言:
hello,大家好,本文将从一次需求的实现,带领大家熟悉GIT常见操作命令
故事背景:
大学毕业生 阿平、阿仁 初到A公司,两人均被分配了个需求,去修改项目 README 文件, 在 README 文件底部添加两个链接,两个人说干就干
安装 GIT:
// 安装 brew (推荐先选择中科大源,后选择阿里巴巴源)
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
// 检查 brew
brew -v
// 安装git
brew install git
搭建环境
// 生成 git-study 文件夹
mkdir git-study
// 进入 git-study 文件夹
cd git-study
// 初始化 git
git init
// 生成 README.md 文件
touch README.md
// 修改 README.md 文件
echo 'master 分支内容' > README.md
// 将 README.md 文件添加到缓存区
git add .
// 代码提交到本地
git commit -m '项目初始化'
从mastr中切出 阿平、阿仁、test分支
// 切换到 自己的专属分支
git checkout -b feature/20220716-aPing
// 创建 阿仁的分支
git checkout -b feature/20220716-aRen
// 创建 test 分支
git checkout -b test
开始:
开发代码阶段
阿平切到自己的专属分支,激动的写下第一个链接
// 切换到 自己的专属分支
git checkout feature/20220716-aPing
echo 'https://xyq.163.com' > README.md
阿仁切到自己的专属分支,激动的写下第一个链接
// 切换到 自己的专属分支
git checkout feature/20220716-aRen
echo 'https://www.163.com' > README.md
不过,恰巧此时,阿平要去排查另一个项目的css样式问题,那赶紧把代码先暂存起来
git stash
新人培训终于结束了,阿平赶紧把之前的代码恢复了
git stash pop
阿平、阿仁想到既然要添加两个链接,那我赶紧先把当前的链接发到测试环境先测试一下
但是每次需要 git add 、git commit 两行代码才能提交代码到本地,我得简化一下我的日常操作
git commit -am 'feat: 阿平第一次提交'
git commit -am 'feat: 阿仁第一次提交'
合并代码阶段
那得赶快把代码合到测试环境啊!于是二人同时 切到test分支,执行merge操作
git checkout test
git merge feature/20220716-aPing
git merge feature/20220716-aRen
咔嚓,不好啦,代码冲突了!怎么办?
我不合了,我要去叫人!
// 撤销最后一次merge
git merge --abort
不行,今天非得合
// 查看冲突文件和冲突内容
git status
cat README.md
<<<<<<< HEAD (主分支 feature/20220716-aPing)
https://xyq.163.com
=======
https://www.163.com
>>>>>>> feature/20220716-aRen
建议用 vacode 解决 更直观
人工处理后,进行代码提交
git commit -am 'fix: 解决 阿仁代码合并至test冲突'
// 查看具体合并过程
git log --graph --pretty=oneline --abbrev-commit
* e83de18 (HEAD -> test) fix: 解决 阿仁代码合并至test冲突
|\
| * f0de9e5 (feature/20220716-aRen) feat: 阿仁第一次提交
* | 1ebf511 (feature/20220716-aPing) feat: 阿平第一次提交
|/
* 1162c03 (master) 项目初始化
解决冲突阶段
噩耗出现了!阿仁的代码有问题,我们要把 阿仁代码从 test 分支剥离出去
// 查看 test分支的 git 提交记录
git log --oneline
// '1162c03' === 'commit Id'
e83de18 (HEAD -> test) fix: 解决 阿仁代码合并至test冲突
f0de9e5 (feature/20220716-aRen) feat: 阿仁第一次提交
1ebf511 (feature/20220716-aPing) feat: 阿平第一次提交
1162c03 (master) 项目初始化
git checkout -b test-cherry
git checkout -b test-rebase
git checkout -b test-revert
基于 git reset 回退到指定的某一次提交的版本
git checkout test
// git reset --soft(保留所有已提交代码至缓存区) 'commit Id'
git reset --soft 1162c03
// 手动修改 README.md 文件,保留需要提交的代码
git commit -am 'feat: 阿平第一次提交'
// 查看当前 git 提交记录
git log --oneline
d06099a (HEAD -> test) feat: 阿平第一次提交
1162c03 (master) 项目初始化
基于 git cherry-pick 将指定分支已提交代码取出,放到缓存区
// 将 阿平代码 提取出来()
git checkout test-cherry
git log --oneline
af81915 (HEAD -> test-cherry, test-revert, test-rebase, test) fix: 解决 阿仁代码合并至test冲突
f0de9e5 (feature/20220716-aRen) feat: 阿仁第一次提交
1ebf511 (feature/20220716-aPing) feat: 阿平第一次提交
1162c03 (master) 项目初始化
git cherry-pick 1ebf511
// 解决 README.md 文件冲突,保留需要提交的代码
git commit -am 'feat: 只保留阿平的代码'
git log --oneline
8554332 (HEAD -> test-cherry) feat: 只保留阿平的代码
af81915 (test-revert, test-rebase, test) fix: 解决 阿仁代码合并至test冲突
f0de9e5 (feature/20220716-aRen) feat: 阿仁第一次提交
1ebf511 (feature/20220716-aPing) feat: 阿平第一次提交
1162c03 (master) 项目初始化
基于 git rebase 将当前分支所有提交 合并到指定分支上
// 将 阿平代码 提取出来()
git checkout test-rebase
git log --oneline
af81915 (HEAD -> test-cherry, test-revert, test-rebase, test) fix: 解决 阿仁代码合并至test冲突
f0de9e5 (feature/20220716-aRen) feat: 阿仁第一次提交
1ebf511 (feature/20220716-aPing) feat: 阿平第一次提交
1162c03 (master) 项目初始化
git rebase 1ebf511
// 解决 README.md 文件冲突,保留需要提交的代码
git rebase --continue
git log --oneline
1ebf511 (HEAD -> test-rebase, feature/20220716-aPing) feat: 阿平第一次提交
1162c03 (master) 项目初始化
基于 git revert 回滚某次操作
git checkout test-revert
git log --oneline
af81915 (HEAD -> test-cherry, test-revert, test-rebase, test) fix: 解决 阿仁代码合并至test冲突
f0de9e5 (feature/20220716-aRen) feat: 阿仁第一次提交
1ebf511 (feature/20220716-aPing) feat: 阿平第一次提交
1162c03 (master) 项目初始化
git revert f0de9e5
// 解决 README.md 文件冲突,保留需要提交的代码
git add .
git revert --continue
git log --oneline
403b0fb (HEAD -> test-revert) Revert "feat: 阿仁第一次提交"
af81915 (test) fix: 解决 阿仁代码合并至test冲突
f0de9e5 (feature/20220716-aRen) feat: 阿仁第一次提交
1ebf511 (test-rebase, feature/20220716-aPing) feat: 阿平第一次提交
1162c03 (master) 项目初始化
优化阶段
此时阿平想到需求中要求 url 前要添加文字,赶忙去修改
// 切回阿平分支,修改文件、提交
git checkout feature/20220716-aPing
echo '链接:https://xyq.163.com' > README.md
git commit -am 'feat: 阿平第二次提交'
// 切回test分支,合并阿平分支
git checkout test
git merge feature/20220716--aPing
查看提交记录
git log --oneline
aeda22d (HEAD -> test, feature/20220716-aPing) feat: 阿平第二次提交
1ebf511 feat: 阿平第一次提交
1162c03 (master) 项目初始化
虽然我提交了两次才做好,但是我不想给别人看啊,我怎么才能把这两次提交记录合并为一次呢?
git reset --hard 1162c03
// 切回阿平分支,修改文件、提交
git checkout feature/20220716-aPing
echo '链接:https://xyq.163.com' > README.md
git commit -am 'feat: 阿平第二次提交'
// 切回test分支,
git checkout test
git merge --squash feature/20220716-aPing
git commit -am 'feat: 阿平第一次提交'
查看提交记录
git log --oneline
431961d (HEAD -> test) feat: 阿平第一次提交
1162c03 (master) 项目初始化
这时就实现了,在test分支内只会显示一次提交记录
回顾 GIT 操作:
- 切换、创建、删除、查看分支
git checkout '分支名'
git checkout -b '分支名'
git branch -D '分支名'
git branch
- 分支中 代码暂存、提交
git add '文件名'
git add .
git commit -m '此次提交的内容'
git commit -am '此次提交的内容'
- 合并代码
git merge '分支名'
git merge -D '分支名'
- 临时存储下代码
git stash
git stash pop
git stash list
- 查看、合并提交记录
git log
git log --oneline
git merge squash '分支名'
- 代码出问题时的解决方案
// 回退到指定的某一次提交的版本
git reset --soft 'commit Id' // 保留代码
git reset --hard 'commit Id' // 不保留代码
// 将指定分支已提交提交取出,放到缓存区
git cherry-pick 'commit Id'
// 将当前分支所有提交 合并到指定分支上
git rebase '分支名'
git rebase --continue
// 回滚某次操作
git revert '分支名'
git revert --continue
总结
本文以一个 闭环 小故事讲解了GIT中常用的命令,跟着实例完整的敲下来,熟悉它,工作中遇到 git 相关问题时 心里有底,就是本文存在的意义!