This is useful for, e.g., rewriting a branch that has ancestor branches along the way. Signed-off-by: Greg Price <price@xxxxxxx> --- Documentation/git-rebase.txt | 4 ++++ git-rebase--interactive.sh | 12 ++++++++++++ git-rebase.sh | 11 +++++++++++ 3 files changed, 27 insertions(+), 0 deletions(-) diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index 9a075bc..74fda58 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -455,6 +455,10 @@ message for the folded commit is the concatenation of the commit messages of the first commit and of those with the "squash" command, but omits the commit messages of commits with the "fixup" command. +If you want to update a ref to point to a rewritten commit, add a +command "ref <refname>" after the "pick", "edit", or other command +that produces the commit. + 'git rebase' will stop when "pick" has been replaced with "edit" or when a command fails due to merge errors. When you are done editing and/or resolving conflicts you can continue with `git rebase --continue`. diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 65690af..cec9cab 100644 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -418,6 +418,17 @@ do_next () { warn exit 0 ;; + ref) + mark_action_done + refname=$sha1 + sha1=$(git rev-parse --quiet --verify "$refname" \ + || echo "(null)") + if ! grep -Fq " $refname" "$state_dir"/oldrefs 2>/dev/null + then + echo "$sha1 $refname" >> "$state_dir"/oldrefs + fi + git update-ref $refname HEAD + ;; squash|s|fixup|f) case "$command" in squash|s) @@ -801,6 +812,7 @@ cat >> "$todo" << EOF # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell +# ref <refname> = update ref # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. diff --git a/git-rebase.sh b/git-rebase.sh index d7855ea..1bfe6a8 100755 --- a/git-rebase.sh +++ b/git-rebase.sh @@ -118,6 +118,8 @@ read_basic_state () { strategy_opts="$(cat "$state_dir"/strategy_opts)" test -f "$state_dir"/allow_rerere_autoupdate && allow_rerere_autoupdate="$(cat "$state_dir"/allow_rerere_autoupdate)" + test -f "$state_dir"/oldrefs && + oldrefs="$(cat "$state_dir"/oldrefs)" } write_basic_state () { @@ -332,6 +334,15 @@ skip) abort) git rerere clear read_basic_state + [ -n "$oldrefs" ] && echo "$oldrefs" | while read sha1 ref + do + if test "(null)" = $sha1 + then + git update-ref -d "$ref" + else + git update-ref "$ref" $sha1 + fi + done case "$head_name" in refs/*) git symbolic-ref -m "rebase: aborting" HEAD $head_name || -- 1.7.5.4 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html