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
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.
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.
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...
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With