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

问题描述 投票:42回答:4

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

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

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

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

git git-branch
4个回答
39
投票

从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

当你在分支-A上并结帐分支-B时,bravo.txt将被删除,delta.txt将被添加到你的工作目录中。

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

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


Footnote

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

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

这些路径中的每一个都是它自己的Git存储库(每个都有一个.git文件夹),你可以在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

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


34
投票

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

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

这取代了旧的脚本contrib/workdir/git-new-workdir,具有更强大的机制,其中这些“链接”工作树实际上记录在主repo新$GIT_DIR/worktrees文件夹中(以便在任何操作系统上工作,包括Windows)。

您将能够在不同路径中检出不同的分支,同时成为同一主克隆回购的一部分。

查看更多“Multiple working directories with Git?


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

1
投票

我通过小脚本https://web.archive.org/web/20141114201917/http://www.redhotchilipython.com/en_posts/2013-02-01-clone-per-feature.html建议我的解决方案

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

© www.soinside.com 2019 - 2024. All rights reserved.