I had one Git repository (A) which contains the development of a project until a certain point. Then I lost the USB stick this repo A was on. Luckily I had a backup of the latest commit, so I could create a new repository (B) later where I imported the latest project's state and continue development. Now I recovered that lost USB stick, so I have two Git repositories.
I think I just have to rebase repo B onto repo A somehow, but I have no idea how to do that, maybe using fetch/pull and rebase?
As opposed to merging, which pulls the differences from the other branch into yours, rebasing switches your branch's base to the other branch's position and walks through your commits one by one to apply them again.
Merging is a safe option that preserves the entire history of your repository, while rebasing creates a linear history by moving your feature branch onto the tip of main .
From merge to rebaseCreate a new “feature” branch called `my-new-feature` from a base branch, such as `master` or `develop` Do some work and commit the changes to the feature branch. Push the feature branch to the centralized shared repo. Open a new Pull Request for `my-new-feature`
If A and B are not the same repo (you created B by using the latest working copy you had), you have to use a graft to pretend that they have common history.
Let’s assume you’ve added A as a remote for B as per VonC’s answer, and the repo looks like this1:
~/B$ git tnylog * 6506232 (HEAD, master) Latest work on B * 799d6ae Imported backup from USB stick ~/B$ git tnylog A/master * 33b5b16 (A/master) Head of A * 6092517 Initial commit
Create a graft telling the root of B that its parent is the head of A:
echo '799d6aeb41095a8469d0a12167de8b45db02459c 33b5b16dde3af6f5592c2ca6a1a51d2e97357060' \ >> .git/info/grafts
Now the two histories above will appear as one when you request the history for B. Making the graft permanent is a simple git filter-branch
with no arguments. After the filter-branch, though, you aren’t on any branch, so you should git branch -D master; git checkout -b master
.
1git tnylog
= git log --oneline --graph --decorate
If A and B are the same repo (the first SHA1 are common), you can:
git remote add A /path/to/A
git fetch A
to update all remote A branches on the B repogit checkout dev
(on B, where you are developing)git rebase A/devBranch
to replay B (i.e. what you develop or re-develop from your backup) on top of A/devBranch
(the development you lost). A bit like this SO question.The last step allows you to sync your dev with the one you lost.
But actually, once you have fetch from A, you are done: B now contains the "all" history (the one you lost and your current work)
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