【问题标题】:Split a single commit to multiple commits by filename without manually going through all files按文件名将单个提交拆分为多个提交,而无需手动浏览所有文件
【发布时间】:2017-12-08 09:17:31
【问题描述】:

我有一个对 1​​00 个文件进行更改的提交。我想将该提交拆分为 100 个提交,其中一个按文件名提交。

目前我做git rebase -i <startpoint> 然后用ereset HEAD^1 标记我要编辑的提交,然后是一系列git add && git commit -m <filename>。对于多个文件,这变得乏味。

最好在一行没有脚本的 bash 中。它还应该足够可读以供记忆。


更新:最终使用 ElpieKay 的解决方案与

git reset HEAD^ --soft
git diff --cached --name-only --relative | while read f; do git commit -m "$f" -- "$f"; done

【问题讨论】:

  • 给定文件名,提交一次的规则是什么?每个文件一次提交?
  • 是的,每个文件一次提交。
  • 提交信息怎么样?都是一样的吗?
  • 文件名作为提交信息。这个想法是这些中间提交将与git rebase -i 组合成更干净的逻辑实体。
  • 还有一个问题,这个提交是当前分支的最后一个吗?

标签: git git-rebase git-rewrite-history


【解决方案1】:

假设它是最后一次提交并且提交 id 是abc123

试试

git reset abc123 --hard
git reset abc123^ --soft
git diff --cached --name-only | while read f;do git commit -m "$f" -- "$f";done

如果出现任何问题,请运行git reset abc123 --hard 进行恢复。

【讨论】:

  • 我不在 git root 上,但我认为 git diff --cached --name-only --relative 解决了它。在 `--relative` 修改之后,它以一种可读的方式完成了我想要的。谢谢!
  • 我没有使用第一个git reset abc123 --hard。也许git reset HEAD^ --soft 会是更通用的解决方案?
  • @Jaakko 第一个git reset 是为了确保你在那个提交上是正确的。如果您已经进行了该提交,则没有必要。
猜你喜欢
  • 2017-04-03
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 2014-01-03
  • 2017-07-16
  • 1970-01-01
相关资源
最近更新 更多