在'git commit'之前写git commit消息

时间:2010-09-19 00:01:24

标签: git

我正在学习来自Perforce的Git。

据我所知,您必须在提交时执行与提交相同的步骤。或者我错过了我之前可能会如何编写消息并让它在我准备好提交之前一直存在。

我非常喜欢perforce中的工作流程,您可以随时编辑更改列表说明,然后在准备好时进行检查。就个人而言,我喜欢多次打开描述并记录我的代码,或者我想到值得注意的事情。

Git可能吗?

11 个答案:

答案 0 :(得分:61)

使用-t <file>

查看git commit标记

这允许您指定要用作提交消息基础的文件。编辑器仍然被调用,但至少你可以使用你事先创建的提交消息。

另外,还有另一个可以与git一起使用的工作流程,可能更适合您的工作方式:

使用git,您可以在主线的单独分支上工作,并使用自己的消息进行大量小型提交。虽然这些提交中的每一个都可能无法解决您正在处理的问题,但它们确实提供了一种使用您在提交消息文件中更新的相同类型的消息来保存工作的中间状态的方法。 / p>

一旦准备好提交工作总和,就可以使用rebase命令和squash这些提交。然后,您将使用您用于较小提交的所有单个消息调用您的编辑器,然后您可以将这些消息一起编辑为单个消息。

这比听起来容易得多,而且恕我直言,这是一种更像git的方法。

答案 1 :(得分:8)

只要您没有push您对他人的承诺,您就可以git commit --amend。这将允许您修改提交以及提交消息。

我发现这确实有助于'早期和经常提交',而不会因为琐碎的提交而受到压倒。

答案 2 :(得分:6)

您可以使用这些别名:

git config --global alias.prepare '!${EDITOR:-vi} $(git rev-parse --git-dir)/.template'
git config --global alias.commitp '!git commit -F $(git rev-parse --git-dir)/.template'

用法:

git prepare
EDITOR=nano git prepare # heeds standard EDITOR variable
git commitp

这会使您的提交消息保持在.git/.template

但是,除此之外,您应该只使用一个工作流程,在该工作流程中经常进行原子和小变更,并在必要时使用功能分支对这些变更进行分组。如果您与git merge --no-ff $branch合并,则可以稍后使用git log --first-parent忽略分支。

答案 3 :(得分:3)

您可以使用git gui并在工作时将其保持打开状态。编写您即将要执行的错误修复的提交消息,然后执行实际的代码更改,暂存并提交它。

答案 4 :(得分:3)

我认为这个问题的动机是能够在编写任何代码之前编写描述(提交消息)(当然,当编写代码时能够修改它)。 (之前使用过Perforce和类似Perforce的系统,我知道有时候会有这样的想法,在你写下代码来做之前你写下你将要做的事情的描述。 )

除了在文件中编写邮件并使用-t <file>--template=<file>)或-F <file>--file=<file>)标记到git commit之外,另一种方法是以下内容:

  1. 使用git commit --allow-empty进行空提交。这将像任何git commit一样,打开一个编辑器,您可以在其中编写消息。写下来并完成提交。

  2. 更改代码。

  3. 使用git add然后git commit --amend添加要添加的文件(如果您不想使用{{git commit -a --amend选择特定文件,请添加git add 1}})。这将使早期的非空提交现在不再为空,您还可以编辑消息以更接近地匹配您实际执行的操作(如果您愿意)。

  4. (如果您正在与他人合作,请记住在执行此操作时不要git push:不要修改您已推送过的提交!)

    当然,保持您的提交尽可能小和原子的建议仍然适用,但这样可以让您在编写代码之前编写消息。 (git commit --amend方法已经在另一个答案中提出;我只是另外指出你可以使用git commit --allow-empty一路走。)

答案 5 :(得分:2)

将其写入文件;在工作时保持更新。实际提交时包括最终版本。

如果您正在使用git的图形前端,那么您必须指定哪些人可以专门帮助它。通常,您只需粘贴邮件即可。

从命令行使用git,它将使用临时文件打开您的编辑器,您可以将消息读入其中(例如:vim中的文件名)。

或者您可以使用shell将该文件读取为-m参数的值:

# bash example, may work elsewhere
git commit -m "$(<filename)"

答案 6 :(得分:0)

内置,不是我所知道的。如果您真的绝望,您可以在终端中将其写为COMMIT="Fix for bug #14453"COMMIT="$COMMIT and bug #4329"然后像git commit -m "$COMMIT"一样提交。

答案 7 :(得分:0)

--file <path>命令使用commit参数。

git commit --file <absolute or relative path to file>

并替换&lt; 文件的绝对或相对路径&gt;与文件的路径。

存储库目录上方目录中相对文件的示例:

git commit --file ../commit-message.txt

您可以在任何文本编辑器中处理提交消息并将其保持打开状态。只需保存文件,然后使用常量提交命令进行提交。它在不打开编辑器的情况下从文本文件(.txt)中获取消息。

答案 8 :(得分:0)

如果您打算每次都使用-t <file>答案,则可以设置:
git config commit.template <file>
这将在每次提交时隐式使用-t

答案 9 :(得分:0)

另一个简单的选择是编写一个没有更改的git commit并对其进行修改:

border

您可以创建一个别名:

$ git commit --allow-empty
# create message
$ git commit --allow-empty --amend
# edit message

这具有git commits的所有优点:

  • 如果出现错误,您将在reflog中获得“备份”。
  • 您可以像往常一样将文件添加到索引中,并将它们$ git config --global alias.draft 'commit --allow-empty' $ git draft # create message $ git draft --amend # edit message 添加到提交中。
  • 您可以将草稿消息推送到功能分支。

答案 10 :(得分:-1)

要添加到MatrixFrog的答案中,GitKraken GUI(https://support.gitkraken.com/working-with-commits/commits/)提供了类似的功能。它允许在实施实际更改之前/同时在GUI内起草提交消息。

此外,它允许设置一个模板来构造提交主体,例如:


更改:

foo

-

新测试: