Jos*_*eek 5 git refactoring commit reflog
我正在做重构,每次我取得任何不错的进展时都会不断修改。它进展得非常顺利,我意识到能够向人们展示我如何处理如此巨大的重构(很多小步骤,只是轻推代码,每个点都有一个绿色测试套件)会很好。
提交都在我的reflog 中。有没有办法将每个修改后的提交转换为自己的真实提交(抱歉,不知道术语),以便用户可以看到每个步骤,而不仅仅是第 81 行和第 57 行的汇总步骤?我不需要提交或任何东西的独特消息,只需要它们在历史记录中被捕获。
这一切仍在我的本地仓库中。
重建引用日志可能并不像乍看起来那么困难。您可以将引用日志的提交重新生成到不同的分支中,也可以使用它git read-tree来生成newbranch包含部分引用日志的单个分支。
每个分支一次提交解决方案:
假设您希望每次提交都有不同的分支。首先,复制您的存储库。您将在此过程中更改您的引用日志,因此您不妨使用一次性版本。其次,检查您的引用日志并找到您想要开始的提交。它看起来像HEAD@{n}。假设是HEAD@{49}。然后,尝试这个脚本,将 替换为head -50,head -<n + 1>无论您的情况是什么:
#!/bin/sh
reflog=$(git reflog | head -50 | awk '{ print $1 }')
i=0
for ref in $reflog; do
git checkout -B "reflog_$i" $ref
i=$(expr $i + 1)
done
Run Code Online (Sandbox Code Playgroud)
这是获取引用日志的提交历史记录一次,然后对其进行迭代,并reflog_$i在此过程中生成分支。您可以根据需要挑选、合并或操作它们。如果这只是为了演示,您可以编写一个简短的脚本,git checkout在分支上执行,运行测试套件,并全程显示绿色。记住,reflog_1代表的是最新的历史;reflog_<n+1>最老的。
#!/bin/sh
for i in $(seq 50 1); do
git checkout "reflog_$i"
./test-suite.sh
done
Run Code Online (Sandbox Code Playgroud)
当你解释你的提交方法时,把它扔到投影仪上,它会是一个很好的背景。
如果您想组合所有分支,您可以运行此 ruby 脚本以按顺序应用它们(或使用您熟悉的任何语言创建等效的脚本)。让我重申一下,您应该备份您的目录,因为这具有相当大的破坏性。
#!/usr/bin/env ruby
n = 50
n.downto 0 do |i|
system "
git read-tree reflog_#{i}
git commit -m 'Refactoring #{n - i}'
git checkout -- .
git br -D refog_#{i}
"
end
Run Code Online (Sandbox Code Playgroud)
使用以下命令将所有提交放在同一分支上git read-tree
首先,复制您的存储库。然后使用如下所示的脚本。根据第一个解决方案中的讨论,将两者更改<n + 1>为您在引用日志中想要的任何深度,再加上一个。请注意 的附加管道sed。您必须使用它或类似的东西,以免引用日志按相反的时间顺序应用newbranch。肯定有一种方法可以在不同时使用awk和 的情况下做到这一点sed,但这可行:
#!/bin/sh
reflog=$(git reflog | head -<n + 1> | awk '{ print $1 }' | sed -n '1!G;h;$p')
git checkout -B newbranch HEAD@{<n + 1>}
for ref in $reflog; do
git read-tree "$ref"
git commit --no-verify -m "Adding commit $ref"
git checkout -- .
done
Run Code Online (Sandbox Code Playgroud)
最终结果将是,其中应包含和newbranch之间的所有提交(基于提交)。HEAD@{0}HEAD@{n}HEAD@{n+1}