前言
有些进了开发岗才逐渐习得的技巧,加快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 清理掉,让它恢复原状。
-
切换回错误的分支
git checkout feat/xx-modify -
移除错误的 Commit
由于这个 commit 只存在于本地仓库,并没有推送(push)到远程,最简单直接的方法就是使用git reset。# 将 HEAD 指针回退到上一个 commit,并丢弃这次提交的更改 git reset --hard HEAD~1HEAD~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)