This is a follow-up on this question on creating branches.
It strikes me as odd that I would still work on one repository because the files on my local machine will be a
As of Git 2.5, git-worktree
directly supports this workflow. See VonC's answer to this question for details.
My answer below may suffice if you don't like git-worktree
for whatever reason.
Git is designed to allow you to work within a single folder on disk. This is a single repository that contains all the branches you care about.† You checkout whichever branch you want to work on at the time.
Within a Git repository, you can only have a single branch checked out at a time. If you check out a second branch, the files on disk are removed and replaced with those from the second branch.
If you have the following branches:
BRANCH-A BRANCH-B
alpha.txt alpha.txt
bravo.txt
charlie.txt charlie.txt
delta.txt
When you're on branch-A and you checkout branch-B, then bravo.txt
will be removed and delta.txt
will be added to your working directory.
However, git-checkout
will not overwrite changes you've made to files unless you supply the -f
argument. If you make a change to alpha.txt
then try to switch to branch-B, you'll get a message warning you that your changes would be lost and aborts the checkout.
The exceptions are untracked files. If you have branch-A checked out and you create a new file called echo.txt
, Git will not touch this file when you checkout branch-B. This way, you can decide that you want to commit echo.txt
against branch-B without having to go through the hassle of (1) move the file outside the repo, (2) checkout the correct branch, and (3) move the file back into the repo.
† Actually, Git doesn't force you to use a single working directory. If you want, nothing is stopping you from creating different paths on disk for each branch you want to work on.
/home/me/project
+-- branch-a/
+-- branch-b/
+-- ...
Each of these paths is its own Git repository (each one has a .git
folder inside), and you can push and pull commits between the repos.
cd ~/project ## Go to my projects directory
git clone branch-a branch-b ## Create a new branch-b
cd branch-b
... work work work ...
git commit -a -m "Made some changes on branch-b"
git pull origin ## Fetch and merge the changes from branch-a
git push origin ## Push my changes back to branch-a
This is how some people use Mercurial if they aren't using named branches: they clone the repository into a new directory on disk for each branch they want, then push and pull changesets between them.