我如何编辑以前的git commit?

这个问题在这里已经有了答案:

  • 如何修改git中的指定提交? 10个答案

  • 提交你的修复,然后使用git rebase --interactive来重新排序你的提交并压缩两个提交。 有关详细信息,请参阅git书。

    请注意,如果这些提交已经被推到一些地方,那么这样做是个坏主意,因为您将更改存储库历史记录。

    示例会话可能如下所示:

    % 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
    

    你可以使用git commit --fixup <hash>来创建一个专门标记的提交,该提交旨在与之前提交的哈希是<hash>合并。 这是添加缺失文件或修改拼写错误等的理想选择。

    一旦你有git rebase --interactive --autosquash <starting-point>提交,你需要使用git rebase --interactive --autosquash <starting-point>来实际地将git rebase --interactive --autosquash <starting-point>提交合并到<hash>提交中。 rebase的<starting-point>应该是<hash>提交之前的历史记录中的某个点(为简单起见,您可以使用<hash>^ )。

    如果您已经将分支发布到其他用户从其他地方撤出的地方,通常会对历史重写提出警告,如果您重新推写历史记录,通常会导致很多混淆和合并问题。 在这些情况下,推动更正作为新的提交更简单。

    注意:默认情况下git config --global rebase.autosquash true会启用自动git config --global rebase.autosquash true ,这意味着您不需要--autosquash选项传递给rebase交互式命令。 这是一个很好的默认设置。

    可以在这里找到一个很好的autosquashing漫步:https://robots.thoughtbot.com/autosquashing-git-commits


    为了做一个它做一个git squash

    // X is the number of commits you wish to edit
    git rebase -i HEAD~X
    

    一旦你压缩你的提交 - 选择e或'r'进行编辑。

    为了保留它,请选择最新的提交。

    在这里输入图像描述


    另一种选择是使用过滤分支

    这里是你如何获得参数,你可以更新它们,并重新提交新的值而不是旧的值。

    在这个例子中,我更改了电子邮件,但同样适用于消息。

    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 `
    
    链接地址: http://www.djcxy.com/p/23425.html

    上一篇: How do I edit a previous git commit?

    下一篇: How do I edit the commit message of any commit in git?