Working with Git, I had to go back to a specific commit. I made some changes and I now want to commit them. What is a proper way of doing this?
My project is now in detached-HEAD state. Will my changes be saved if I make a commit with
git commit
? Otherwise, what should I do to not lose my changes?
Create a new branch from this commit and THEN do the
commit
:Assuming you already staged (i.e.
git add myfile1 myfile2
) your files.to save your work in the detached head:
and if you want to merge it to master:
Disclaimer: git isn't complicated, it's just versatile. Don't be scared off just because I've rambled into a long answer :)
You had:
master: a-b-c-d-e-f
and wanted to change
c
. You did:*
git checkout c
(avoid checking out commits in future. Move the branch head instead)* changed some files
You are in:
If you want to re-apply d-e-f on top of your changed "c"
(If you have pushed, people downstream will be have to recover from upstream rebase)
git stash .
git checkout master
git stash pop
(resolve conflicts)git stage .
git commit -m "temporary name for g"
master: a-b-c-d-e-f-g
)git rebase c -i
("re-apply my current branch on to point c, and let me manipulate the commits interactively", i.e, re-parent (rebase)d-e-f
onto a newc
)g
so it's after c, then change the rebase command frompick
tofixup
.dd
to delete a line,P
to place it,i
to enter insert mode to type "fixup" then:wq
to save and exit vim.master: a-b-c'-d'-e'-f'
, wherec'
is the result of you mergingg
andc
during the rebase.d-e-f
have becomed'-e'-f'
as their ancestry has changed so they're not the "same" commits as far as git is concerned, but their contents remain the same)If you want to undo
d-e-f
(and rewrite history as if you never made them)(If you have pushed, people downstream will be have to recover from upstream rebase) :
git stash .
git checkout master
master: a-b-c-d-e-f
, with stashed files originally based upon c)git reset --hard c
(discard all files and commits on master since c)master: a-b-c
, with stashed files)git stash pop
(resolve conflicts)master: a-b-c-*
)git stage .
git commit -m "description of g"
master: a-b-c-g
)If you want to undo d-e-f (but keep them in history)
git stash
git revert --no-commit d
git revert --no-commit e
git revert --no-commit f
git push
git stash pop
(will be no conflicts)git stage .
git commit -m "Undo d-e-f in order to fix..."
git push
If you have
git push
d-e-f, and you want to keep them separate:Sounds like your new changes are for a new branch off master.
git branch <foo>
.