How to modify a specified commit?

后端 未结 16 1311
清酒与你
清酒与你 2020-11-22 01:53

I usually submit a list of commits for review. If I have the following commits:

  1. HEAD
  2. Commit3
  3. Commit2
16条回答
  •  忘掉有多难
    2020-11-22 02:32

    Automated interactive rebase edit followed by commit revert ready for a do-over

    I found myself fixing a past commit frequently enough that I wrote a script for it.

    Here's the workflow:

    1. git commit-edit 
      

      This will drop you at the commit you want to edit.

    2. Fix and stage the commit as you wish it had been in the first place.

      (You may want to use git stash save to keep any files you're not committing)

    3. Redo the commit with --amend, eg:

      git commit --amend
      
    4. Complete the rebase:

      git rebase --continue
      

    For the above to work, put the below script into an executable file called git-commit-edit somewhere in your $PATH:

    #!/bin/bash
    
    set -euo pipefail
    
    script_name=${0##*/}
    
    warn () { printf '%s: %s\n' "$script_name" "$*" >&2; }
    die () { warn "$@"; exit 1; }
    
    [[ $# -ge 2 ]] && die "Expected single commit to edit. Defaults to HEAD~"
    
    # Default to editing the parent of the most recent commit
    # The most recent commit can be edited with `git commit --amend`
    commit=$(git rev-parse --short "${1:-HEAD~}")
    message=$(git log -1 --format='%h %s' "$commit")
    
    if [[ $OSTYPE =~ ^darwin ]]; then
      sed_inplace=(sed -Ei "")
    else
      sed_inplace=(sed -Ei)
    fi
    
    export GIT_SEQUENCE_EDITOR="${sed_inplace[*]} "' "s/^pick ('"$commit"' .*)/edit \\1/"'
    git rebase --quiet --interactive --autostash --autosquash "$commit"~
    git reset --quiet @~ "$(git rev-parse --show-toplevel)"  # Reset the cache of the toplevel directory to the previous commit
    git commit --quiet --amend --no-edit --allow-empty  #  Commit an empty commit so that that cache diffs are un-reversed
    
    echo
    echo "Editing commit: $message" >&2
    echo
    

提交回复
热议问题