问与答 git-如何在几个分支上同时工作

pope · 2020-02-22 14:30:06 · 热度: 35

这是关于创建分支的此问题的后续措施。

我仍然可以在一个存储库上工作,这使我感到奇怪,因为本地计算机上的文件将是各种实验的奇怪组合。

我想最好的方法是复制存储库并在每个分支的计算机上的不同文件夹中工作-但我不知道如何设置它。 我当前的存储库位于Documents / San / CompProj,那么我将使用哪些命令来创建绑定到不同本地文件夹中不同分支的新存储库?

Git对我来说还很陌生,所以我很喜欢您可以对我在上面假设/提出的问题进行的任何更正。

猜你喜欢:
共收到 4 条回复
tyshon #1 · 2020-02-22 14:30:06

从Git 2.5开始,.git直接支持此工作流程。 有关详细信息,请参见VonC对这个问题的回答。

如果您出于任何原因不喜欢.git,那么我在下面的回答就足够了。


Git旨在允许您在磁盘上的单个文件夹中工作。 这是一个单一的存储库,其中包含您关心的所有分支。†您签出当时要处理的任何分支。

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

如果您具有以下分支:

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

当您在分支A上并且签出分支B时,将删除.git,并将echo.txt添加到您的工作目录中。

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

例外是未跟踪的文件。 如果您已经签出了分支A,并且创建了一个名为.git的新文件,那么当您签出分支B时,Git将不会触摸该文件。 这样,您可以决定要针对分支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

如果不使用命名分支,这就是某些人使用Mercurial的方式:他们将存储库克隆到磁盘上每个所需分支的新目录中,然后在它们之间推送和提取更改集。

stan #2 · 2020-02-22 14:30:07

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

Git将使用新命令contrib/workdir/git-new-workdir支持多个工作树(对于一个克隆的git repo)。

它用更可靠的机制替换了较早的脚本contrib/workdir/git-new-workdir,其中那些“链接”的工作树实际上记录在主存储库新的$GIT_DIR/worktrees文件夹中(以便可以在包括Windows在内的任何OS上工作)。

成为同一主要克隆存储库的一部分时,您将能够以不同的路径签出不同的分支。

有关更多信息,请参见“使用Git的多个工作目录?”。

landen #3 · 2020-02-22 14:30:08

您对“本地计算机上的文件将是各种实验的奇怪组合”的关注。 是没有根据的-如果您已将分支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
sunil #4 · 2020-02-22 14:30:09

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

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

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册