Commit a file to a Different Branch Without Checkout
It can be done by reimplementing git commit.
This can be done with various call to git hash-object
But this is hard to achieve.
Please read progit chapter 9 for more details and a full example of how to simulate a commit.
As several others have said, it is literally possible, but impractical.
However, as of Git 2.5 (with some important fixes in 2.6 and minor ones since then), there is a practical method for doing this using git worktree add
.
Let's say, for instance, that you want to work on branches main
and doc
"at the same time", or branches develop
and test
"at the same time", but the two branches in question deliberately contain different things. (For instance, the doc
branch has documentation that exists outside or alongside the code, or the test
branch has tests that will be run against the code, but not distributed, or which are expected to have failures for which tests are deliberately skipped on the develop
side, or whatever.)
Instead of just:
git clone -b develop <source> theclone
followed by working in theclone
with constant switching back and forth between the two branches, you would:
git clone -b develop <source> theclone
but then:
cd theclone
git worktree add ../ct test # check out branch test in ../ct
or just:
git worktree add ../test # check out branch test in ../test
Now you can run your tests in ../test
while developing in theclone
. You can merge and/or rebase changes from one branch to the other in the usual way: the underlying repository is already shared, so no git push
or git fetch
is required. You simply have both branches checked out, into two separate work-trees, named theclone
and test
from the top level.
So long as you don't have anything in your current index that differs from your HEAD
that you want to keep you can so something like this. (If you do want to keep your index you could temporarily export the GIT_INDEX_FILE
environment variable to point at a temporary file for the duration of these commands.)
# Reset index and HEAD to otherbranch
git reset otherbranch
# make commit for otherbranch
git add file-to-commit
git commit "edited file"
# force recreate otherbranch to here
git branch -f otherbranch
# Go back to where we were before
# (two commits ago, the reset and the commit)
git reset HEAD@{2}
We've never actually checked out otherbranch
and our working tree files haven't been touched.
It's not possible.
The changes you commit are related to the current working copy. If you want to commit to another branch it means that you could commit changes from your working copy, but base them from another copy state.
This is not a natural way of versioning your work, and this is why you need to make different steps (stash changes, checkout the branch, pop stash and commit) to accomplish it.
As for your specific use case, a simple way is to keep two copies of your work, one checked out at master
branch, and the other at pages
branch.
In the pages
working copy, add the master
copy as a remote repo.
- You commit pages on
master
- Pull from
master
on thepages
copy - push to GitHub
- reset the master branch at its previous state.