【问题标题】:The best practice for melding into NEXT commit in git rebase -i?在 git rebase -i 中融入 NEXT 提交的最佳实践?
【发布时间】:2016-06-30 00:38:35
【问题描述】:

由于它便宜,我使用commit 来保存我的每日 WIP 快照。所以我的提交历史包含许多快照提交和几个混合在一起的关键提交。

在将我的工作推送到远程存储库之前,我可能想通过将正在进行的快照提交合并到直接后续的关键提交中来清理我的历史记录以仅包含关键提交。关键提交的日期信息对我很重要,因为它让我想起了我何时以及我所做的更改。

git rebase -i 中使用 squash/fixup 命令可能会有所帮助,但它们会融合到以前的提交中,并且它们的作者日期不是我想要的。

重新排序提交然后压缩通常会导致不必要的冲突,这也是我想要避免的。

所以。满足我的愿望的最佳做法是什么?

[更新] 2016-07-03
受托雷克回答的启发,我想出了一个解决方案:像往常一样使用git rebase -i,将我希望之前的提交融合到的目标提交设置为edit,然后执行git reset HEAD~n where n是我想要融合的先前 cmets 的数量。并提交合并的更改:

% git commit --amend --date "$(grep DATE .git/rebase-merge/author-script | cut -f2 -d '=')"

之后,通过git rebase --continue完成剩下的工作。

【问题讨论】:

  • 关于“每日 WIP 快照”这一短语:我(和许多其他人)建议您使用 Commit EarlyCommit Often。在富有成效的工作日,我经常会有至少一打或两次提交。
  • 是的,我同意该网站的说法。在我开始为团队开发工作之前,我也是这样做的。
  • 请将您的更新添加为实际答案,而不是编辑到问题中。

标签: git


【解决方案1】:

这是一种方法:像往常一样使用 rebase。将 fixup-or-squash-commit 的处置设置为 edit。当 Git 停止让您编辑修复时,请使用 git reset --soft HEAD^; git commit --amend --reset-author-date,但请注意,这使用“现在”的日期。要获得更多控制权,并从 squash/fixup 中获取日期,请从该提交中获取作者日期并使用 --date:您可能需要编写一个小 shell 脚本来执行此操作。

(使用git log --pretty=format:%ad --no-walk从当前提交中提取日期,在git reset --soft HEAD^步骤之前。您可能想要保存提交消息文本,甚至是提交的整个ID:软重置离开提交在存储库中, 它受到正在进行的 rebase 和各种 reflogs 的保护, 因此您可以在之后以及之前从中提取任何您想要的内容. 当然作者和提交者及其日期和消息,在这里涵盖所有有用的内容。)

要压缩得更远,您可以在交互式编辑中进行多次变基或多次压缩,或者比HEAD^ 更靠后的git reset --soft

(我从不为此烦恼:具体的日期戳在这里似乎没有用。)

【讨论】:

  • 感谢您的回答。发现在rebase交互过程中,作者数据信息保存在.git/rebase-merge/author-script中。
  • 请注意.git/rebase-merge 的存在和名称,更不用说其中的任何文件,是一个实现细节:它在旧版本的 Git 中不存在,并且在某些 rebase 操作中可能有不同的名称(特别是非交互式变基当前使用.git/rebase-apply)。当然,如果您一直在进行交互式变基,并且您的 Git 版本确实有该文件,那么您可能可以依赖其中的内容。不过,不要假设这一点会更安全。
【解决方案2】:

git rebase -i 中使用 squash/fixup 命令可能会有所帮助,但它们会融合到以前的提交中,并且它们的作者日期不是我想要的。

实际上,git rebase -i 应该在 Git 2.25(2020 年第一季度)中获得了一些选项,即“git rebase”所知道的选项。

但是...在 2.25 发布之前,commit 4d92452 已恢复。

见“Problems with ra/rebase-i-more-options - should we revert it?


原始答案,以说明以后可能会发生的情况:

commit d82dfa7(2019 年 11 月 21 日)Junio C Hamano (gitster)
请参阅commit fe28ad8commit 08187b4commit 0185c68commit cbd8db1commit c068bcccommit ba51d2f(2019 年 11 月 1 日)Rohit Ashiwal (r1walz)
(由Junio C Hamano -- gitster -- 合并在@9876543@3@3 ,2019 年 12 月 10 日)

rebase:加--reset-author-date

签字人:Rohit Ashiwal

之前的提交将--ignore-date 标志引入交互式rebase,但在rebase -i 的上下文中,名称实际上非常模糊,因为我们可以使用两个日期。
添加别名以传达确切的目的。

git rebase manpage 现在包括:

--ignore-date::
--reset-author-date::

默认情况下,原始提交的作者日期用作结果提交的作者日期。
此选项告诉 Git 使用当前时间戳,并暗示 --force-rebase

还有:

rebase -i:支持--committer-date-is-author-date

签字人:Rohit Ashiwal

rebase am 已经有了这个标志,可以通过将提交者日期更改为作者日期来“撒谎”。
让我们为交互式机器添加相同的内容。

Documentation:

--committer-date-is-author-date::

不要将创建重新定位的提交的时间记录为提交者日期,而是将作者日期重新用作提交者日期。
这意味着--force-rebase


你甚至有

rebase -i: 添加 --ignore-whitespace 标志

签字人:Rohit Ashiwal

有两个后端可用于变基,即aminteractive
自然地,应该有一些功能在一个中实现但在另一个中没有实现。

一个这样的标志是--ignore-whitespace,它表示合并机制将只有空白更​​改的行视为未更改。
通过将其转换为 -Xignore-space-change,连接交互式 rebase 以理解 --ignore-whitespace 标志。

文档:

-ignore-whitespace:

根据选择的后端而有所不同。

  • 'am'后端:应用补丁时,如有必要,忽略上下文行中的空白更改。
  • 'interactive' 后端:将只有空格更改的行视为未更改,以便进行三向合并。

【讨论】:

    猜你喜欢
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    相关资源
    最近更新 更多