如何在几个分支上同时工作

时间:2011-12-12 05:41:46

标签: git git-branch

这是关于创建分支机构this question的后续行动。

令我感到奇怪的是,我仍然会在一个存储库上工作,因为我本地计算机上的文件将是不同实验的奇怪组合。

我认为最佳实践方法是复制存储库并在我的计算机上为每个分支工作在不同的文件夹中 - 但我不知道如何设置它。我在Documents / San / CompProj上有我当前的存储库,那么我用来创建一个绑定到不同本地文件夹上不同分支的新存储库的命令是什么?

Git对我来说相当新鲜,所以我喜欢你对我上面假设/提出的任何更正。

4 个答案:

答案 0 :(得分:38)

从Git 2.5开始,git-worktree直接支持此工作流程。有关详细信息,请参阅VonC's answer to this question

如果您因任何原因不喜欢git-worktree,我的回答可能就足够了。


Git旨在允许您在磁盘上的单个文件夹中工作。这是一个包含您关注的所有分支的单一存储库。您可以检查当时要处理的分支。

在Git存储库中,您一次只能检出一个分支。如果您签出第二个分支,则磁盘上的文件将被删除,并替换为第二个分支中的文件。

如果您有以下分支机构:

BRANCH-A        BRANCH-B
alpha.txt       alpha.txt
bravo.txt
charlie.txt     charlie.txt
                delta.txt

如果您在 branch-A 上并且结帐 branch-B ,则会移除bravo.txt并添加delta.txt到你的工作目录。

但是,git-checkout覆盖您对文件所做的更改,除非您提供-f参数。如果您对alpha.txt进行了更改,然后尝试切换到 branch-B ,则会收到一条消息,警告您更改将丢失并中止结帐。

例外是未跟踪的文件。如果您签出了 branch-A 并且创建了一个名为echo.txt的新文件,那么当您签出 branch-B 时,Git将不会触摸此文件。通过这种方式,您可以决定是否要针对 branch-B 提交echo.txt,而无需经历(1)将文件移出仓库之外的麻烦,(2)结帐正确的分支,以及(3)将文件移回回购。


脚注

实际上,Git并没有强迫您使用单个工作目录。如果你愿意,没有什么能阻止你为你想要处理的每个分支在磁盘上创建不同的路径。

/home/me/project
 +-- branch-a/
 +-- branch-b/
 +-- ...

这些路径中的每一个都是它自己的Git存储库(每个路径都有一个.git文件夹),你可以在存储库之间推送和提取。

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

如果他们没有使用named branches,这就是有些人使用Mercurial的方式:他们将存储库克隆到磁盘上的新目录中,用于他们想要的每个分支,然后在它们之间推送变换集。

答案 1 :(得分:33)

使用Git 2.5+(2015年第2季度),Git不再设计为在单个文件夹(即单个工作树)中工作

Git将使用新命令git worktree add <path> [<branch>]支持多个工作树(对于一个克隆的git repo)。

用一个更强大的机制替换旧脚本contrib/workdir/git-new-workdir,其中&#34;链接&#34;工作树实际上记录在主repo新$GIT_DIR/worktrees文件夹中(以便在任何操作系统上工作,包括Windows)。

您可以在同一主克隆回购邮件的同时签出不同路径的不同分支。

详情请见&#34; Multiple working directories with Git? &#34;

答案 2 :(得分:1)

您对本地计算机上的文件的关注将是不同实验的奇怪组合。是没有根据的 - 如果你检查了分支2,你将不会同时看到分支1的文件。

我会做像

这样的事情
# on master branch
git checkout master
# Create a branch for feature 1
git checkout -b feature_1
# work on feature 1

# Start a new feature branch
git checkout master
git checkout -b feature_2
# work on feature 2

# feature 2 finished and committed, time to merge 
git checkout master
git merge feature_2

# update feature_1 branch
git checkout feature_1
git merge master

答案 3 :(得分:1)

我通过小脚本https://web.archive.org/web/20141114201917/http://www.redhotchilipython.com/en_posts/2013-02-01-clone-per-feature.html

建议我的解决方案

虽然git stash工具很好,但我发现有多个克隆更好。您可以在一个分支中运行测试,而在另一个分支上运行。或者你甚至不必停止调试器,关闭编辑器,清理临时文件或其他东西。