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

标签 git git-branch

这是对 this question 的跟进关于创建分支。

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

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

Git 对我来说是相当新的,所以我希望您能对我在上面假设/提出的问题做出任何更正。

最佳答案

从 Git 2.5 开始,git-worktree 直接支持这个工作流程。参见 VonC's answer to this question了解详情。

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


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

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

如果你有以下分支:

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

当您在 branch-A 上 checkout branch-B 时,bravo.txt 将被删除并且 delta.txt 将添加到您的工作目录。

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

异常(exception)是未跟踪的文件。如果您 checkout 了 branch-A 并创建了一个名为 echo.txt 的新文件,那么当您 checkout branch-B。这样,您可以决定要针对 branch-B 提交 echo.txt,而不必经历 (1) 将文件移出存储库的麻烦, (2) checkout 正确的分支,并且 (3) 将文件移回 repo 协议(protocol)。


脚注

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

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

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

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 的方式: 他们将存储库克隆到磁盘上他们想要的每个分支的新目录中,然后在它们之间推送和 pull 变更集。

关于git - 如何同时在几个分支上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8470360/

相关文章:

git - bash - 引号中的变量

git - 如何从失效的 Heroku 应用程序中检索源代码?

git - 将 Gerrit 项目迁移到不同的 Gerrit 实例

git - 在 "remote"本地分支上重新设置 master 是如何工作的?

git - git-flow merge 是否适合更大的团队?

git - git checkout --track origin/branch 和 git checkout -b branch origin/branch 的区别

git - 将单个文件提交到另一个分支

git:仅重做旧提交

git - 如何在本地计算机上进行 git rebase 后删除存储库中的 "branch"

Git - 将分支移动到master