Reputation: 75
I've managed to commit some files incidentally in commit A001
. Those files are quite big (around 100MB each). After noticing my mistake, In next commit, I've deleted those files with rm
command, and commited those changes to commit A002
. I've thought that this solved my problem and continued developing. After few commits, let's say commit A005
I've tried to push everything on remote (Large files have been deleted, but they're still commited in commit A001
), push fails with following message:
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
...
...
! [remote rejected] melodic-dev -> melodic-dev (pre-receive hook declined)
Which is okay, because large files still exist in commit A001
.
How can I do following:
A001
, unstage those large files and recreate commit A001
without those large files that have been removed, do same to commit A002
A003
-A005
as they were on tip of the recreated A001_edited-A002_edited
commits without those large filesA001-A005
commits to remote branchI would need something like: Create new branch that has all commits NEW_BRANCH:A001-A005
. In that branch, I would like to remove some files from commit A001
, therefore i would have NEW_BRANCH: A001_edited
commit, and I would like to merge OLD_BRANCH:A001-A002-A003-A004-A005
with NEW_BRANCH: A001_edited-A002_edited
so that I have following: OLD_BRANCH: A001_edited-A002_edited-A003-A004-A005
A001_edited = A001 without commiting (revert git add Large files
) those large files
A002_edited = A002 without removing (revert git rm Large files
) those large files
In two successive commits somewhere in history, I want to remove some staged/unstaged files and keep everything else the same.
I've tried some stuff, but without success. I hope I've clarified my problem enough, if not let me know :)
Thank you for your time and help.
Upvotes: 3
Views: 56
Reputation: 75
I've managed to use rebase
as suggested by blinry but without git rm --cached bigfile1 bigfile2
.
I would use git rm --cached bigfile1 bigfile2
if I haven't already done so
with A002
commit.
To clarify, I've added accidentaly some big files to A001
and
removed them in commit A002
which disabled me from pushing on remote branch. I've simply used interactive rebasing and squashed commit A002
into A001
:
as follows:
pick A005
pick A004
pick A003
squash A002
pick A001
Squash
command "merges" choosen commit with previous one, in this case it "merged" removal of big files with addition of big files and some code changes, which resulted with wanted code changes and without big files, and clean git history (Everything before A001
- A001_without_big_files
-A003
-A004
-A005
)
Thank you for your help:)
Upvotes: 2
Reputation: 4955
This can be fixed with a powerful and scary approach called rebasing! :) Here's one way:
git rebase -i --root
. This will open an editor listing all commits all the way from A001 to your latest one.git rm --cached bigfile1 bigfile2
to remove them from the index, then run git commit --amend
to fix commit A001 to not contain them.git rebase --continue
. This will reapply all commits after that on top of the commit you changed. A002 should now only contain the changes you made other than removing the files. No commit should contain the big files anymore.Hope that works for you, let me know if you encounter any problems!
Upvotes: 3