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

Re: Git rebase basics

From
Michael Witten <mfwitten@gmail.com>
Date
Jun 14, 2012, 05:08 UTC
Message-ID
<af093eb8bd7c4b39a17807c5cb5723e4-mfwitten@gmail.com>
In-Reply-To
<1339642794317-7561489.post@n2.nabble.com>
On Wed, 13 Jun 2012 19:59:54 -0700 (PDT), Lance
Show 59 quoted lines
> Sorry about that.. I thought I was being pretty descriptive but maybe I
> missed something.
>
> After we setup Git (msysgit) and set it up using Apache with active
> directory authentication, I added a repository using git init --bare then I
> copied my files I wanted to add to the repository and did a git add . and
> git commit -a
>
> So that all worked.   We have done several clones using git clone with this
> remote repo.  We have also done  git push and git pull to verify everything
> is working ok.   Everything was working fine.
>
> So back to my original train of though.
>
> I am trying to learn more about rebase so i have cloned the central repo two
> times  (I call the central repo the origin) doing the following (to help you
> understand)
>
> git clone https://servername:port/repopath c:\clonedrepo1
>
> git clone https://servername:port/repopath c:\clonedrepo2
>
> and then made changes to this cloned copy (clonedrepo1) and pushed two
> commits back to origin.
> (git commit -a  two times)
>
> so now I have the following in the remote repo (origin)   
>
> origin -->  C1 --> C2
>
> (Note to help you understand  C1 = commit 1 and c2 = commit 2, etc)
>
> In the other cloned copy (clonedrepo2), which I consider a branch, I have
> made two more commits  C3 and C4
>
> clonedrepo2 --> C3 -->  C4
>
> I am able to easily pull from origin to get my clonedrepo2 to look like 
> clonerepo2 --> C3 --> C4 --> C1 --> C2 using git pull origin  or git pull
> https://servername:port/repopath
>
> however I was wanting to rebase the clonedrepo2 branch so that it shows   
> clonerepo2 -> C1 --> C2 --> C3 --> C4
>
> In other words I am wanting to rebase clonedrepo2 to the master of the
> origin.
>
>
> I thought the command to do this was   git rebase origin master but that
> doesnt work and I get
>
> C:\clonedrepo2>git rebase origin master
> Switched to branch 'master'
> Your branch is ahead of 'origin/master' by 2 commits.
> Current branch master is up to date.
>
> I know my my branch is ahead by c3 and c4 but it does not have C1 and C2
>
> Thoughts.
This is what I SUPPOSE you mean (using a bash prompt):
  $ git init temp; cd temp
  $ echo 0 > a; git add a; git commit -m C0
  $ cd ..; git clone --bare temp origin; rm -rf temp
  $ git clone origin clonedrepo1
  $ git clone origin clonedrepo2
  $ cd clonedrepo1
  $ echo 1 > a; git commit -am C1
  $ echo 2 > a; git commit -am C2
  $ git push
  $ cd ../clonedrepo2
  $ echo 0 > b; git add b; git commit  -m C3
  $ echo 1 > b;            git commit -am C4
  $ # The following line is essentially `git pull',
  $ # but it would appear that `git pull' is currently
  $ # ignorant of merge's `-m' flag for specifying a
  $ # commit message on the command line.
  $ git fetch; git merge -m C5 origin/master # Essentially `git pull'
  $ git log --format=%s --graph
  *   C5
  |\  
  | * C2
  | * C1
  * | C4
  * | C3
  |/  
  * C0

Notice how the history splits at C0, and then merges back together at C5; it's not actually the case that C1 has been made a child of C4 (I'm guessing you have used `git log' to see a linearized output, which does not reflect the topology of the graph).

The simplest solution would have been to tell `git pull' to perform a rebase rather than a merge:

  git pull --rebase

We can simulate having done so by resetting our work and pulling again:

  $ git reset --hard :/C4 # Reset back to C4; see `git help rev-parse'
  $ git branch C4 # Save this original C4 for later reference
  $ git log --format=%s --graph
  * C4
  * C3
  * C0
  $ git pull --rebase
  $ git log --format=%s --graph
  * C4
  * C3
  * C2
  * C1
  * C0
The line:
  git pull --rebase

Is essentially just the same as before, except that a rebase rather than a merge is performed, essentially equivalent to the following:

  git fetch; git rebase origin/master

which is something you could certainly do by hand to fix the problem without performing the additional fetch:

  $ git reset --hard C4 # Go back to the original C4 commit
  $ git rebase origin/master

Sincerely, Michael Witten

Previous: lancelyons
Message 8 of 8 in “Git rebase basics”
  1. lancelyonsJun 13, 2012
  2. Michael WittenJun 14, 2012
  3. lancelyonsJun 14, 2012
  4. Hilco WijbengaJun 14, 2012
  5. lancelyonsJun 14, 2012
  6. Michael WittenJun 14, 2012
  7. lancelyonsJun 14, 2012
  8. Michael WittenJun 14, 2012

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.