Git 用得好,下班走得早

git stash

官方解释:当您想记录工作目录和索引的当前状态,但又想返回一个干净的工作目录时,请使用 git stash 。该命令将保存本地修改,并恢复工作目录以匹配头部提交。

比如某一天你正在自己的分支上开发你的新需求,突然被测试同学提了一个线上bug,必须马上修复。而此时你的功能开发到一半,于是你急忙的想切换到另一个分支上进行修改,然后你就会看到以下报错。

bash 复制代码
error: Your local changes to the following files would be overwritten by checkout:
        src/pages/xxxx/index.tsx
Please commit your changes or stash them before you switch branches.
Aborting

因为当前有文件更改了,需要提交 commit 保持工作区干净才能切换分支。由于情况紧急,你就急忙 commit 上去。commit 信息也就随便写了个"暂存代码",于是该分支提交记录就留了一条无用的记录。而有了stash 你只需要

js 复制代码
git stash
git checkout xxxx

// 相关命令
git stash // 保存当前未commit的代码

git stash save "备注的内容" // 保存当前未commit的代码并添加备注

git stash list // 列出stash的所有记录

git stash clear // 删除stash的所有记录

git stash apply // 应用最近一次的stash

git stash pop // 应用最近一次的stash,随后删除该记录

git stash drop // 删除最近的一次stash

// 当有多条 stash,可以指定操作stash,首先使用stash list 列出所有记录:
git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ...
stash@{2}: On ...
// 应用第二条记录
$ git stash apply stash@{1}

git reset

用于回退版本。可以指定退回某一次提交的版本。

接着上面的场景,你修改完了代码。准备提交却发现了一些问题需要回退一下提交,那么这个时候就需要用到git reset 这个命令了

git reset 分为三种:软 --soft, 中 --mixed,硬 --hard 对应三种回滚程度,程度越硬,回滚越狠。

js 复制代码
// --soft
// 写完代码后提交了,但发现 commit message 写错了
git reset --soft HEAD^ // 回退到上个版本 但是只回退了commit信息
// --soft 修改文件已 add,但尚未 commit
  
// --mixed(是默认设定 可以省略不写)
// 你 `git add` 太快了,把不该提交的文件加进去了
git reset HEAD^ // 修改文件会变成未add的状态

// --hard 硬核,彻底,会彻底返回到回退前的版本状态,了无痕迹
// 改坏了,干脆回滚
// 方法一
git reset --hard~3 // 回退三个版本
git reset --hard~n // 回退n个版本

// 方法二
git reset --hard HEAD^  // 表示回退一个版本
git reset --hard HEAD^^  // 表示回退2个版本   

// 方法三
git reset --hard xxxxxx // 回退到索引值

git reflog

此命令用来管理引用日志(reflog)。引用日志会记录在本地仓库里,分支的指针和其他引用在什么时候被更新过

继续上面的场景,你学会了 git reset 来回滚你的代码,但是你只是想修改一下 commit message 但一不小心用了最狠的 --hard, 你的代码全都消失不见了。此时 该怎么办呢,别担心如果 reset 被称为后悔药的话那么 reflog 就是后悔药中的后悔药,它记录了你所有的操作信息。

这时 log 信息如下

不小心回退到 C 之后会发现 A 、B的 commit 记录都没有了。最新的记录变成 C 了

那么这个时候就可以用 reflog了

就能找到我们所有的提交记录了,发现 c2c8086 就是我们最新提交的 commit ,我们reset到最新的那个commit后再次log,就发现记录都回来了

git log 和 git reflog 的区别

git log 命令可以显示所有提交过的版本信息

git reflog 可以查看所有分支的操作记录(包括已经被删除的 commit 记录和 reset 的操作)

git cherry-pick

某天你们的项目同时有两个迭代并行开发,但是两个迭代都有依赖同一个功能,那么你可能会再这个分支上完成这个功能,然后将这些代码再copy到另一个分支上。但是有了 cherry-pick 你就不需要再做重复的工作了。

通过 cherry-pick 命令,Git 可以将任何分支中的选定提交合并到当前的 Git HEAD 分支中。 在执行 git merge 或 git rebase 时,一个分支的所有提交都会被合并。而 cherry-pick 命令则允许你选择单个提交进行整合。

使用 merge 的情况: 在执行 merge 或 rebase 时,一个分支的所有提交都会被整合。

使用 cherry-pick 的情况: 允许你选择个别提交进行整合。只有 C2 被整合到主分支,而不是 C4。

如何使用

  • 拉取本地分支。使用 git fetch。
  • 回到要合并的分支。你可能会通过运行 git checkout dev。
  • 找到要拉入分支的提交。转到 git log,为每条提交获取唯一的提交哈希值。
  • "Cherry-pick" 您想要加入该分支的提交。运行以下命令:git cherry-pick {commit sha}。这将只把这个提交拉入当前分支。
  • (可选) 在某些情况下, 可能需要手动解决冲突.
  • 像往常一样推送这个分支: git push。

设置 Git 短命令

方式一

js 复制代码
git config --global alias.ps push

方式二

js 复制代码
// 打开全局配置文件
vim ~/.gitconfig 

//写入内容
[alias] 
        co = checkout
        ps = push
        pl = pull
    

使用

git pl 等同于 git pull

相关推荐
阳墨余2 小时前
Git 同时管理 Gitee 和 GitHub 的 SSH 配置实战
git·gitee·github
fengyehongWorld10 小时前
Git 认证凭据管理
git
暮云星影18 小时前
git版本发布
git·gitee·github·gitea
乌夷18 小时前
Git Flow 分支模型
git
独隅19 小时前
VS Code Git 工作树多分支并行开发实战评测
git
暮云星影1 天前
git仓库分支管理
git·gitee·github·gitea
互联网中的一颗神经元2 天前
ZZ — Git 速查表
大数据·git·elasticsearch
早安试言2 天前
git使用
git
燐妤2 天前
梦绘片场 ProjectDream故事总纲场景剧本篇:从项目到成片的 AI 漫剧工作台
人工智能·git·ai·项目开发
JackieDYH2 天前
Git 与 GitHub 新电脑配置指南(从零开始)
git·github·工具·使用教程