Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to replace a commit with another one in Git rebase?

Tags:

git

git-rebase

Say I'm working on a feature in a branch oldFeature. I've done commits A and B1 and sent it for the code review. In B1 I changed some existing files but also added newfile.txt.

In the meantime I started working in a branch newFeature, forked from oldFeature (HEAD == B1). I've added C, D, E.

Meanwhile, I got code review results and had to amend B1, changing newfile.txt, and also changing some existing files. After the fixes, it became B2.

So to illustrate it:

newFeature   oldFeature A             A B1            B2 [B1 with some fixes] C D E 

Now I'm in newFeature and I want to rebase newFeature to have B2 instead of B1. When I simply do the rebase, I have rebase a conflict due to newfile.txt being added in both parts of the rebase.

I want to keep the version from oldFeature (B2).

I can't move B1 to the HEAD, because C, D, E depend on it.

I know I can do the following workaround:

  • git checkout --theirs
  • git add
  • continue rebase

Then I'll have a situation like this:

newFeature   oldFeature A             A B2            B2 BX C D E 

where BX is more or less B2\B1 on the files that existed in A. Now I can do interactive rebase and remove BX.

However my workaround is kind of convoluted. Is there a simpler way to do it? By simpler I mean, that I either have

newFeature   oldFeature A             A B2            B2 B2\B1 C D E 

without any rebase conflicts, and then I can get rid of that B2\B1 commit, or to replace them automatically so I get

newFeature   oldFeature A             A B2            B2 C D E 

Using Git 1.8.0.

like image 937
jakub.g Avatar asked Jan 29 '13 18:01

jakub.g


People also ask

How do you commit changes in rebase?

Open the file sample. txt and make the change as shown below. Use commit --amend to make the change. You will now need to execute "git rebase --continue" to proceed with completing the rebase process.

Does rebase change commit ID?

you can see that the last two commits have been squashed together, the id's of all the commits whose history hasn't changed are left untouched. That's the real good answer. If no action has been made on a commit during à rebase, the sha1 is changed only if an ancestry has changed...

Does rebase create a new commit?

The Rebase Option But, instead of using a merge commit, rebasing re-writes the project history by creating brand new commits for each commit in the original branch.


1 Answers

You could do a rebase interactive:

git checkout new_feature git rebase --interactive old_feature 

and drop B1: you simply delete the line with B1:

# If you remove a line here THAT COMMIT WILL BE LOST 
like image 66
VonC Avatar answered Oct 03 '22 05:10

VonC