git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: What's in git.git

From
Junio C Hamano <junkio@cox.net>
Date
Feb 10, 2006, 00:28 UTC
Message-ID
<7v8xsk5a6k.fsf@assigned-by-dhcp.cox.net>
In-Reply-To
<B8E391BBE9FE384DAA4C5C003888BE6F05AA1FB3@scsmsx401.amr.corp.intel.com>
"Luck, Tony" <tony.luck@intel.com> writes:
Show 20 quoted lines
> Looks very close to what I want.
>
>> git checkout topic
>> git format-patch --stdout origin > topic-diff
>
>  topic-diff contains each commit as a separate message
>
>> $VISUAL topic-diff
>> # Fix comments
>
>  so this needs some skill & care to rearrange the pieces
>  and end up with legal input to git-am
>
> Perhaps I'd like to have:
>
>  git diff SHA-where-I-branched..HEAD
>
> but I don't see the way to compute the SHA-where-I-branched
>
> -Tony

If what you want to end up with is a single commit, that is easy.

If your topic branch is only "fork from master and never re-merge with master but just pile new commits on top of the tip, single strand of pearls" kind,

        git-merge-base master topic
would find the 'x' commit, where you forked from:
                           "master"
        ---x---o---o---o---o
            \
             o---o---o---o
                          "topic"

If you have "my topic will conflict with a change recently done in master so let's merge up from master to resolve conflict before going further" kind of merge commit on your topic branch, then you cannot have a single two-tree diff easily anyway, but in such a case, the following steps would work.

                           "master"
        ---o---o---o---o---o
            \       \
             o---o---*---o
                          "topic"
  (1) First merge "master" into "topic":
        $ git checkout topic
        $ git pull . master
                           "master"
        ---o---o---o---o---o
            \       \       \ 
             o---o---*---o---*
                             "topic"
      which would give you the rightmost '*' merge.
  (2) Extract diff from "master" to '*':
        $ git diff HEAD^2 HEAD >P.diff
      HEAD^1 is previous "topic" head and HEAD^2 is what you
      merged ("master").
  (3) Pick commits only on "topic" branch but not on "master"
        $ git rev-list --pretty --no-merges master..topic >P.log
      This will pick up the three 'o' commits on the lower
      development track and show their commit log message.
  (4) Reset the "topic" branch to "master", and do the squashed
      commit:
	$ git reset --hard master
        $ git apply --index P.diff
        $ git commit -F P.log -e

This obviously would work equally well for single strand of pearls case. Maybe you can package the above up, and send in a patch to add "git-squash" command?

Previous: Luck, TonyNext: Junio C Hamano
Message 2 of 6 in “RE: What's in git.git”
  1. Luck, TonyFeb 9, 2006
  2. Junio C HamanoFeb 10, 2006
  3. Junio C HamanoFeb 10, 2006
  4. Luck, TonyFeb 14, 2006
  5. Ryan AndersonFeb 10, 2006
  6. Junio C HamanoFeb 10, 2006

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.