Search code examples
gitgit-rewrite-historygit-history

Connect git historys after cut


My two repos are from the same project. I make a history cut after commit 3 and work now only with Repo ProjectnameWorking.

git log Repo "ProjectnameArchiv":

30114b2afac5d1c5a968441151ee8f91fc015ff3 4
9aa472d04501a14b5b704fde32445461f99f539a 3
1d0e5abe5daf60c0d86819938ba1aefd44b87ff5 2
766f4880e8ccf61bdc718dfae62466f800ae8119 1

git log Repo "ProjectnameWorking":

2932c4b8ea681f0a97bf151ccc46d2044e8e5a50 5
27ec1a4618f1bf0025b8ba83fd69c2607cdf78d4 4

Is there a way to connect later both historys & projectfiles to one?

git log Repo "Projectname"

2932c4b8ea681f0a97bf151ccc46d2044e8e5a50 5
27ec1a4618f1bf0025b8ba83fd69c2607cdf78d4 4
9aa472d04501a14b5b704fde32445461f99f539a 3
1d0e5abe5daf60c0d86819938ba1aefd44b87ff5 2
766f4880e8ccf61bdc718dfae62466f800ae8119 1

Edit:

  • Commit 4 at Repo "ProjectnameArchiv" - get new hash from cut

Solution

  • Yes, that is possible, but the SHAs of one of the projects will change:

    • Create a common remote repository:

      /some/other/path> git init . --bare
      
    • Create a branch in ProjectnameArchiv at 9aa472d04501a14b5b704fde32445461f99f539a and push it to the remote:

      ProjectnameArchiv> git branch merge-base 9aa472d04501a14b5b704fde32445461f99f539a
      ProjectnameArchiv> git remote add origin file:///some/other/path
      ProjectnameArchiv> git push --all
      
    • Do the same in the other repo but fetch instead of push:

      ProjectnameWorking> git branch working-top 2932c4b8ea681f0a97bf151ccc46d2044e8e5a50
      ProjectnameWorking> git remote add origin file:///some/other/path
      ProjectnameWorking> git fetch origin
      
    • cherry-pick the first working commit into the archive branch:

      ProjectnameWorking> git checkout -b archive origin/merge-base
      ProjectnameWorking> git cherry-pick 9aa472d04501a14b5b704fde32445461f99f539a
      
    • If you have only a few commits you can continue cherry-picking, but for a larger number, rebase-ing the rest of the work branch onto the archive branch is faster:

      ProjectnameWorking> git rebase --onto archive 9aa472d04501a14b5b704fde32445461f99f539a working-top
      

      You might add git’s -i option to check what it is doing before it starts, and interrupt the process if something went wrong.

    After that, the changes of the working repository are added to the archive repository but they get new SHAs.