gpt4 book ai didi

git - 如何将最后一次 git commit 编辑为补丁文件?

转载 作者:太空狗 更新时间:2023-10-29 13:21:22 26 4
gpt4 key购买 nike

有时通过编辑 patch file 来修改提交很有用而不是直接更改文件,将它们添加到工作集中,然后修改提交。

为了使这变得简单,在 git 中有一个命令会很有用,该命令以相同的方式打开 $EDITOR 作为补丁文件 中的最新提交立即发出 git commit --amend(不进行任何更改)允许在编辑器中编辑提交消息。

这在 git 中可行吗

  1. 作为单个命令
  2. 不会丢失提交消息?

最佳答案

我不确定是否可以在单个命令中实现,但差不多:

git reset -N HEAD~
git add --edit
git commit --reuse-message=ORIG_HEAD

一些解释:

  • git reset -N HEAD~ : 销毁最后一次提交但保留更改
  • git add --edit 允许您以patch 格式编辑您的更改
  • git commit --reuse-message=ORIG_HEAD:使用来自 ORIG_HEAD 的提交消息提交您的阶段性更改,ORIG_HEAD 是指向您在 git reset 之前所做的提交的指针。

注意:因为只有 git add --edit 需要交互,您甚至可以将命令链接在一行上并为其创建一个 bash 或 git 别名,如果期望:

git reset -N HEAD~ && git add --edit && git commit --reuse-message=ORIG_HEAD

注意 2 如果您编辑提交,执行此命令后,一些更改将保留在您的 git 存储库中。您必须选择将它们全部扔掉 (git checkout -- :/) 或提交它们或...

如果您不对这些更改执行任何操作;然后调用上述命令两次 将始终向您显示第一次提交后的更改:

git commit -am "very first commit"
git reset -N HEAD~
git add --edit # edit very first commit as patch
git commit --reuse-message=ORIG_HEAD
# you now have some unstaged changes lying around.
git reset HEAD~ # undo second commit
# the unstaged changes that are lying around now
# are a combination of second commit and the unstaged changes
# that were still lying around.
# That combination = content of very first commit
git add --edit # edit that combination
git commit --reuse-message=ORIG_HEAD

如果您想要一个可以继续应用的完整命令;您可以包括丢弃更改

:
git reset -N HEAD~ && git add --edit && git commit --reuse-message=ORIG_HEAD && git checkout -- :/

请注意,这很危险,因为您可能会丢弃更改...


完整的脚本

您可以将此脚本保存为 /usr/bin/git-edit-last-commit,然后您可以将其作为 git edit-last-commit 运行:

#!/bin/bash
set -e # exit on first error
if ! git diff-files --quiet
then
echo "Your git repository is not clean: you have unstaged changes."
exit 1
fi
if ! git diff-index --quiet --cached HEAD --
then
echo "Your git repository is not clean: you have staged changes."
exit 1
fi
git reset -N HEAD~
git add --edit
git commit --reuse-message=ORIG_HEAD
# supposing that this edit is really what you wanted, we can throw away leftovers
# if work was lost, in can be recovered using git reflog
git checkout -- :/

关于git - 如何将最后一次 git commit 编辑为补丁文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57374810/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com