由于价格便宜,我使用commit
来保存我的每日WIP快照。所以我的提交历史包含许多快照提交和几个密钥提交混合在一起。
在将我的工作推送到远程存储库之前,我可能希望通过将正在进行的快照提交合并到密钥提交之后来清理我的历史记录以仅包含密钥提交。关键提交的日期信息对我来说很重要,因为它让我回想起我何时以及我改变了什么。
在git rebase -i
中使用squash / fixup命令可能会有所帮助,但它们会融入PREVIOUS提交,而且它们的作者日期不是我想要的。
重新提交提交然后压缩经常导致不必要的冲突,这也是我想要避免的。
因此。满足我的愿望的最佳做法是什么?
[更新] 2016-07-03
受到torek的回答的启发,我提出了一个解决方案:像往常一样使用git rebase -i
,将我希望以前提交的目标提交设置为edit
,然后执行git reset HEAD~n
其中 n 是我想要融合的先前评论的数量。并通过以下方式提交融合的更改:
% git commit --amend --date "$(grep DATE .git/rebase-merge/author-script | cut -f2 -d '=')"
之后,按git rebase --continue
完成剩下的工作。
答案 0 :(得分:3)
这是一种方法:像往常一样使用rebase。将fixup-or-squash-commit的处置设置为edit
。当Git停止让您编辑修正时,请使用git reset --soft HEAD^; git commit --amend --reset-author-date
,但请注意,这会使用“立即”的日期。要获得更多控制,并从壁球/修正中获取日期,请从该提交中获取作者日期并使用--date
:您可能希望编写一个小的shell脚本来执行此操作。
(使用git log --pretty=format:%ad --no-walk
在git reset --soft HEAD^
步骤之前从当前提交中提取日期。您可能希望保存提交消息文本,甚至保存提交的整个ID: reset会在存储库中保留提交,它会受到正在进行的rebase和各种reflog的保护,因此您可以在之后以及之前从中提取您想要的任何内容。当然,作者和提交者及其日期,和消息,涵盖这里有用的一切。)
为了进一步压缩,你可以在交互式编辑中进行多次重组或多次南瓜,或者git reset --soft
比HEAD^
更晚。
(我从不打扰这个:具体的日期戳在这里似乎没用。)
答案 1 :(得分:0)
在
git rebase -i
中使用squash / fixup命令可能会有所帮助,但它们会融合到PREVIOUS提交中,而作者日期并不是我想要的。
实际上,git rebase -i
在Git 2.25(2020年第1季度)中获得了一些选择,这些选择被“ git rebase
”所熟知。
请参见commit d82dfa7的Junio C Hamano (gitster
)(2019年11月21日)。
请参见commit fe28ad8的commit 08187b4,commit 0185c68,commit cbd8db1,commit c068bcc,commit ba51d2f,Rohit Ashiwal (r1walz
)(2019年11月1日)。
(由Junio C Hamano -- gitster
--在commit 5d9324e中合并,2019年12月10日)
rebase
:添加--reset-author-date
签名人:Rohit Ashiwal
先前的提交将
--ignore-date
标志引入了交互式基础,但是在rebase -i
的上下文中,该名称实际上是非常模糊的,因为我们可以使用两个日期。
添加别名以传达确切的目的。
git rebase
manpage现在包括:
--ignore-date:: --reset-author-date::
默认情况下,原始提交的作者日期用作结果提交的作者日期。
此选项告诉Git改用当前时间戳,并暗示--force-rebase
。
并且:
rebase -i
:支持--committer-date-is-author-date
签名人:Rohit Ashiwal
rebase am
已经具有通过更改为作者日期来“隐瞒”提交者日期的标记。
让我们为交互式机器添加相同的内容。
--committer-date-is-author-date::
与其将重新创建的提交的创建时间记录为提交者日期,不如将作者日期重新用作提交者日期。
这意味着--force-rebase
。
你甚至有
rebase -i
:添加--ignore-whitespace标志签名人:Rohit Ashiwal
有两个可用于重新定基的后端,即
am
和interactive
。
自然地,应该在一个功能中实现某些功能,而在另一功能中不实现。一个这样的标志是
--ignore-whitespace
,它指示将仅具有空白更改的行视为不变的合并机制。
通过将交互式rebase转换为--ignore-whitespace
,将交互式rebase连接起来还可以理解-Xignore-space-change
标志。
文档:
-ignore-whitespace:
根据选择的后端,行为不同。
- '
am
'后端:应用补丁时,如有必要,忽略上下文行中空格的更改。- '
interactive
'后端:为了进行三向合并,将只有空白更改的行视为未更改。