从一次需求熟悉Git操作

184 阅读8分钟

前言:

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 解决 更直观

image.png

人工处理后,进行代码提交

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 操作:

  1. 切换、创建、删除、查看分支
git checkout '分支名'
git checkout -b '分支名'
git branch -D '分支名'
git branch
  1. 分支中 代码暂存、提交
git add '文件名'
git add .
git commit -m '此次提交的内容'
git commit -am '此次提交的内容'
  1. 合并代码
git merge '分支名'
git merge -D '分支名'
  1. 临时存储下代码
git stash
git stash pop
git stash list
  1. 查看、合并提交记录
git log
git log --oneline
git merge squash '分支名'
  1. 代码出问题时的解决方案
// 回退到指定的某一次提交的版本
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 相关问题时 心里有底,就是本文存在的意义!