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

ssc*_*rus 50 git git-branch

这是关于创建分支的这个问题的后续行动.

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

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

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

Ste*_*ngs 39

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

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


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

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

如果您有以下分支机构:

BRANCH-A        BRANCH-B
alpha.txt       alpha.txt
bravo.txt
charlie.txt     charlie.txt
                delta.txt
Run Code Online (Sandbox Code Playgroud)

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

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

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


脚注

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

/home/me/project
 +-- branch-a/
 +-- branch-b/
 +-- ...
Run Code Online (Sandbox Code Playgroud)

这些路径中的每一个都是它自己的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
Run Code Online (Sandbox Code Playgroud)

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

  • @sscirrus请注意,它是**`commit`**,它将文件"放入"分支.`add`本身只是为提交准备(或"暂存")文件的一种方式. (3认同)

Von*_*onC 34

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

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

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

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

在" 使用Git多个工作目录? "中查看更多信息.


I82*_*uch 5

您担心“我本地计算机上的文件将是不同实验的奇怪组合。” 是没有根据的 - 如果您签出了分支 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
Run Code Online (Sandbox Code Playgroud)

  • 这不是同时进行的。 (2认同)