Why does git revert complain about a missing -m option?

后端 未结 3 1937
不思量自难忘°
不思量自难忘° 2020-11-29 15:16

So I\'m working on a project with other people, and there\'s multiple github forks being worked on. Someone just made a fix for a problem and I merged with his fork, but the

3条回答
  •  暖寄归人
    2020-11-29 15:50

    Say the other guy created bar on top of foo, but you created baz in the meantime and then merged, giving a history of

    $ git lola
    *   2582152 (HEAD, master) Merge branch 'otherguy'
    |\  
    | * c7256de (otherguy) bar
    * | b7e7176 baz
    |/  
    * 9968f79 foo

    Note: git lola is a non-standard but useful alias.

    No dice with git revert:

    $ git revert HEAD
    fatal: Commit 2582152... is a merge but no -m option was given.

    Charles Bailey gave an excellent answer as usual. Using git revert as in

    $ git revert --no-edit -m 1 HEAD
    [master e900aad] Revert "Merge branch 'otherguy'"
     0 files changed, 0 insertions(+), 0 deletions(-)
     delete mode 100644 bar

    effectively deletes bar and produces a history of

    $ git lola
    * e900aad (HEAD, master) Revert "Merge branch 'otherguy'"
    *   2582152 Merge branch 'otherguy'
    |\  
    | * c7256de (otherguy) bar
    * | b7e7176 baz
    |/  
    * 9968f79 foo

    But I suspect you want to throw away the merge commit:

    $ git reset --hard HEAD^
    HEAD is now at b7e7176 baz
    
    $ git lola
    * b7e7176 (HEAD, master) baz
    | * c7256de (otherguy) bar
    |/  
    * 9968f79 foo

    As documented in the git rev-parse manual

    ^, e.g. HEAD^, v1.5.1^0
    A suffix ^ to a revision parameter means the first parent of that commit object. ^ means the n-th parent (i.e. ^ is equivalent to ^1). As a special rule, ^0 means the commit itself and is used when is the object name of a tag object that refers to a commit object.

    so before invoking git reset, HEAD^ (or HEAD^1) was b7e7176 and HEAD^2 was c7256de, i.e., respectively the first and second parents of the merge commit.

    Be careful with git reset --hard because it can destroy work.

提交回复
热议问题