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

ack*_*ack 55 git

我正在学习来自Perforce的Git.

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

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

可能与Git?

Abi*_*ern 62

看看-t <file>旗帜吧git commit

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

或者,您可以使用另一个可以更好地适合您的工作方式的工作流程:

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

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

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


fse*_*eto 9

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

我发现这确实有助于'早期和经常提交',而不会被琐碎的提交所压倒.


use*_*062 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'
Run Code Online (Sandbox Code Playgroud)

用法:

git prepare
EDITOR=nano git prepare # heeds standard EDITOR variable
git commitp
Run Code Online (Sandbox Code Playgroud)

这会保留您的提交消息.git/.template.

但实际上,您应该使用一个工作流,在该工作流中经常进行原子和小变更,并在必要时使用功能分支对这些更改进行分组.如果您合并git merge --no-ff $branch,您可以git log --first-parent稍后使用忽略分支.

  • 海事组织,这是一个很好的答案。最后一段不需要贬低它。 (4认同)

Shr*_*saR 5

我相信这个问题的动机是能够在编写任何代码之前编写描述(提交消息) (当然能够在编写代码时对其进行修改)。(之前使用过 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)。这将使之前的非空提交不再为空,并且您还可以编辑消息以更接近您实际所做的操作(如果您愿意)。

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

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

  • 不推送空提交(带有描述)的问题是,首先编写描述的原因之一是向其他人宣布你的意图。Perforce 变更列表描述的价值之一是其他人可以阅读您正在进行的工作的描述。因此,如果我看到鲍勃正在处理文件“foo.c”,我可以阅读他的描述以了解他打算做什么,如果它与我打算做的事情冲突,我可以打电话给鲍勃,我们可以弄清楚如何继续。 (2认同)