git rebase/cherry-pick: 合并最近的 message

想将项目中的多条提交 message 合并成1条
更新于: 2024-08-26 21:06:39

现状

可能在未提前之前就需要合并,可以使用: git log --oneline -20 查看最近的 log

也可以用这个命令: git log --pretty=oneline 

参考: https://ma.ttias.be/pretty-git-log-in-one-line/

步骤

  1. 打开终端或命令提示符,并导航到你的Git仓库所在的目录。
  2. 确保你在要进行rebase的分支上。如果不是,请切换到该分支。
  3. 运行以下命令来开始rebase过程,将<short-hash>替换为你最近提交的短哈希:
  4. 在文本编辑器中,你将看到一个以"pick"开头的列表,每一行代表一个提交。
    1. 将第一个提交保留为"pick",而将其余的提交的"pick"替换为"squash"(或简写为"s")。
    2. 这将把它们合并到第一个提交中。
git rebase -i <short-hash>~

实战

  1. 切换到 feature/aric 自己的分支
确认分支
利用 git rebase 列出最近
保留最近的
出现这个是表示成功了
# 找到目标的 hash<7dc9fa40803a17ca1e442bda18497066d5b3ed4e>
git rebase -i 7dc9fa40803a17ca1e442bda18497066d5b3ed4e~
# 强制提交
git push -f origin

square 报错

error: cannot 'squash' without a previous commit

vim

一般会查找2-n行记录,来做一些替换工作。

# 查找替换
:5,12s/foo/bar/g

cherry-pick

场景: 我的项目有2个重要的分支:

项目主分支: master

特别分支(为某个需求特别定制): daqiao

 

问题来了:

我在 master 上做了n多个修改,同样的修改,我需要在 daqiao 上再来一次。

# 由上面的 git rebase 可以得到这个hash
git checkout daqiao
git cherry-pick 4e1ec89cddf66a2edd001962f053b2eee391bcad

# 各种处理 conflict,然后 force 方式提交,当然,最好建立自己的 feature 分支比较稳妥

补充

常用的几种情况

# 查找替换,基本是第2行之后都改成s(square),第一个用 pick
:5,12s/foo/bar/g
# 在后面的message 弹框里,去掉不需要的message,用最新的 message
用法代码
rebase 最近2条
git reabse -i HEAD~2
rebase 当前直到某个hash
git rebase -i 5c2ee9840942dd936bdc10382fdf973e2a42de8d~
rebase 当前直到某个hash的前一条
git rebase -i 5c2ee9840942dd936bdc10382fdf973e2a42de8d