git相关的效率提升

发布于

前言

有些进了开发岗才逐渐习得的技巧,加快git工具使用,同时方便协作

小技巧

本地branch alias

因为要和其他同学进行协作,完成一个需求,我们二人的分支名类似,都是来自于同一个feat分支
同时我的部分特性依赖于他要开发的特性,因此需要经常拉分支
用bash创建一个简短的别名,同时IDE又能保持多个终端的常开.因此可以专门一个终端做git操作

s % myb='feat/xx-modify'
s % echo $myb
feat/xx-modify
s % echo $myb-AAA 
feat/xx-modify-AAA

如这里myb就是公用的需求分支名

cherry-pick

在开发后经常遇到这样的情况,一个特性/bug做完了,要提交,结果发现本地commit到了feat/xx-modify(上次合并后忘了切).但是我真正想提交到的分支是 feat/xx-modify-AAA
此时可以使用cherry-pick

前置工作

首先,留在当前错误的分支 (feat/xx-modify) 上,找到刚刚提交的那个 commit 的哈希值(Commit ID)。
可以使用git log,或直接在ide的git功能上复制commmit id

然后切换到真正想要提交的目标分支 feat/xx-modify-AAA。

Cherry-pick Commit

在 feat/xx-modify-AAA 分支上,使用 git cherry-pick 命令,将刚才记录的 commit 应用到当前分支。

git cherry-pick a1b2c3d

执行后,Git 会将 a1b2c3d 这个 commit 所包含的所有更改应用到 feat/xx-modify-AAA 分支,并自动生成一个新的 commit。现在,新功能代码已经成功地存在于正确的分支上了。

清理错误的分支

最后一步是回到原来的 feat/xx-modify 分支,将那个多余的 commit 清理掉,让它恢复原状。

  1. 切换回错误的分支

    git checkout feat/xx-modify
    
  2. 移除错误的 Commit
    由于这个 commit 只存在于本地仓库,并没有推送(push)到远程,最简单直接的方法就是使用 git reset。

    # 将 HEAD 指针回退到上一个 commit,并丢弃这次提交的更改
    git reset --hard HEAD~1
    
    • HEAD~1 表示当前 commit 的前一个 commit。
    • --hard 参数会彻底移除这次错误的提交,并且工作区的文件也会恢复到提交前的状态。请确保在执行前回退的 commit 是正确的,因为 --hard 会丢弃工作区的修改。

手动解决冲突

此场景需要用到提供git服务的网站,比如github.
我自己的分支已经本地push了,我要在这个网站上提MR,将我的分支更改同步到主分支.此时发生Conflict

推荐的工作流程

git fetch origin
git checkout -b feat/xx-modify-AAA origin/feat/xx-modify-AAA
git checkout dev
git merge --no-ff feat/xx-modify-AAA
# 解决冲突...
# 一个一个文件解决冲突git add
# git commit
git push origin HEAD:dev

其他

一些小概念助记

git revert 和 git reset

特性 git revert <commit_id> git reset --soft <commit_id>
目的 撤销某次提交引入的更改 移动分支指针到某次提交,撤销指针之后的所有提交
对历史 不修改历史,追加一个新提交。 修改历史,删除或移除指针之后的提交。
适用场景 已经推送到远程仓库的提交。多人协作分支。 未推送到远程仓库的本地提交。个人工作分支。
工作区/暂存区 默认会创建新提交,工作区/暂存区通常是干净的。 保留更改在暂存区(Staging Area),等待重新提交。
<commit_id> 含义 是你想要撤销的那一个提交的 ID。 是你想要保留的那一个提交的 ID。

评论区 (0)