我刚刚意识到我遗漏了一个文件,我应该将其添加到像5提交的提交中。在提交消息中,我说该文件已包含在内,我不想做一个新提交的文本“哎呀忘了在提交#XXXXX中添加此文件”
编辑上一次提交的最佳方法是什么,以便我可以添加文件?
答案 0 :(得分:9)
提交您的修复程序,然后使用git rebase --interactive
重新排序您的提交并将两个提交压缩在一起。有关详细信息,请参阅the git book。
请注意,如果这些提交已经被推送过,那么这样做是个坏主意,因为您将更改存储库历史记录。
示例会话可能如下所示:
% git init
Initialized empty Git repository in /home/user/repo/.git/
% echo "A line" > a.txt
% echo "A line" > b.txt
% git add a.txt b.txt
% git commit -m "Initial commit"
[master (root-commit) c6329d0] Initial commit
2 files changed, 2 insertions(+), 0 deletions(-)
create mode 100644 a.txt
create mode 100644 b.txt
您的不完整提交:
% echo "Another line" >> a.txt
% git add a.txt
% git commit -m "Important changes"
[master 0d28cfa] Important changes
1 files changed, 1 insertions(+), 0 deletions(-)
其他一些提交:
% echo "Yet another line" >> b.txt
% git add b.txt
% git commit -m "Other changes"
[master 96a092d] Other changes
1 files changed, 1 insertions(+), 0 deletions(-)
请注意,你已经忘记了一些事情:
% echo "Important line forgotten previously" >> a.txt
% git add a.txt
% git commit -m "Oops"
[master 9dce889] Oops
1 files changed, 1 insertions(+), 0 deletions(-)
使用git rebase -i
修复历史记录:
% git rebase -i HEAD~3
您将被置于您选择的编辑器中,其内容类似于以下内容:
pick 0d28cfa Important changes
pick 96a092d Other changes
pick 9dce889 Oops
更改它以便将“oops”提交移到上面一行并将pick
更改为squash
(或仅s
)以将其与前面的提交相结合:
pick 0d28cfa Important changes
s 9dce889 Oops
pick 96a092d Other changes
然后保存文件并退出编辑。这将弹出另一个编辑器,您可以在其中编辑组合提交的提交消息。它看起来像这样:
# This is a combination of 2 commits.
# The first commit's message is:
Important changes
# This is the 2nd commit message:
Oops
根据您的需要进行更改,然后保存并退出。
最后,检查新提交确实是两个提交的组合:
% git log -p HEAD~2..HEAD~1
commit 7a4c496956eb269c551bbf027db8b0f2320b65e4
Author: User Name <user@host.tld>
Date: Fri Feb 3 22:57:31 2012 +0100
Important changes
diff --git a/a.txt b/a.txt
index 8d7158c..54df739 100644
--- a/a.txt
+++ b/a.txt
@@ -1 +1,3 @@
A line
+Another line
+Important line forgotten previously
答案 1 :(得分:1)
您可以使用git commit --fixup <hash>
进行特别标记的提交,该提交旨在与之前的哈希为<hash>
的提交合并。这是添加丢失文件或修复拼写错误等的理想选择。
一旦进行了fixup提交,就需要使用git rebase --interactive --autosquash <starting-point>
将fixup提交实际合并到<hash>
提交中。 rebase的<starting-point>
应该是<hash>
提交之前的历史记录中的某个点(为简单起见,您可以使用<hash>^
。)
历史重写的常见注意事项适用,如果您已经在其他用户已经撤出的某个地方发布了分支,那么如果您重新使用重写历史记录,通常会导致很多混淆和合并问题。在这些情况下,将更正作为新提交推送更简单。
注意:git config --global rebase.autosquash true
默认情况下会启用自动压缩,这意味着您不再需要将--autosquash
选项传递给rebase interactive命令。这是一个很好的默认设置。
在这里可以找到一个很好的自动轮廓:https://robots.thoughtbot.com/autosquashing-git-commits
答案 2 :(得分:1)
为了执行此操作,请执行git squash
。
// X is the number of commits you wish to edit
git rebase -i HEAD~X
一旦你压缩你的提交 - 选择e
或'r'进行编辑。
为最新提交选择以保留它。
另一个选择是使用filter-branch
以下是获取参数的方法,您可以更新它们并使用新值而不是旧值重新提交。
在此示例中,我更改了电子邮件,但同样适用于邮件。
git filter-branch --commit-filter '
if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];
then
GIT_COMMITTER_NAME="<New Name>";
GIT_AUTHOR_NAME="<New Name>";
GIT_COMMITTER_EMAIL="<New Email>";
GIT_AUTHOR_EMAIL="<New Email>";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD `