将分支与主分支保持最新

29

我有一个远程仓库,我已经将其拉取并从中创建了一个分支。我想让新的分支与主分支的更改保持同步。我考虑以下工作流程,这是否合理,或者有更好的方法来实现?

  1. 初始分支和检出:

    git checkout master
    
    git pull
    
    git checkout -b my_branch
    
  2. 我的分支中做一些工作,然后定期执行:

  3. git checkout master
    
    git pull
    
    git checkout my_branch
    
    git merge master --no-ff
    

按需重复执行步骤 2,并定期推送到远程分支my_branch

然后当准备好合并回去时:

git checkout master

git merge my_branch --no-ff

听起来可以吗?

2个回答

24
你可以简化你的命令:
1.
git fetch
git checkout -b my_branch origin/master

2.

git fetch
git merge origin/master

git fetch 命令会更新你的远程分支,如果你不打算在某个分支上进行工作,通常情况下是没有必要在本地保留这个分支的副本的。

在运行 git config --global merge.ff false 后,你可以省略 --no-ff 参数。

git help config 命令的解释如下:

   merge.ff
       By default, Git does not create an extra merge commit when merging
       a commit that is a descendant of the current commit. Instead, the
       tip of the current branch is fast-forwarded. When set to false,
       this variable tells Git to create an extra merge commit in such a
       case (equivalent to giving the --no-ff option from the command
       line). When set to only, only such fast-forward merges are allowed
       (equivalent to giving the --ff-only option from the command line).

请注意,git pull只是git fetchgit merge的组合。

通常你只需要使用git pull --rebase,它本质上是git fetchgit rebase的结合,可以创建更清晰的提交历史记录。

你是否有进行“定期推送”的原因?如果没有其他人在同一分支上工作,完全可以在完成一切工作后再进行推送。


1
感谢你和克里斯托夫的回复。回答你的问题,我定期推送代码并没有其他原因,只是为了备份以防我的电脑出问题。另外,如果有人想要使用我的代码进行自己的工作,这也可以提供便利。虽然在我的代码被合并到主分支之前,这种情况不太可能发生。此外,在公共分支上进行变基可能会导致麻烦,所以我理解这一点(但不确定具体原因)。 - larryq
1
变基是一把双刃剑。一方面,它们通常会导致更清晰的历史记录。另一方面,它们会创建全新的提交,基本上是旧内容。如果您推送您的提交,其他人理论上可以在这些提交上构建自己的更改。如果您稍后决定变基您的提交,您基本上会使旧提交无效,并且所有基于它们构建的更改也会失效。即使您删除了旧分支,其他人可能会推送他的更改,因此也会推送您的旧更改,这将导致重复提交和混乱的结果。 :) - michas
1
非常感谢。我一直在阅读关于git pull --rebase的内容,但如果我在(比如说)my_branch中调用它时会发生什么还不是100%确定。在这种情况下,该命令从my_branch远程拉取,然后重新基于...哪个分支?我想不是主分支,因为我没有在命令中提到它。所以它必须重新基于my_branch,这对我来说听起来有点奇怪,因为我总是将两个单独的分支进行重新基于。但我认为这是可能的,现在我想了想,为什么不呢? - larryq
2
git pullgit pull --rebase 都能与配置的上游分支合作(详见 git branch -vv)。通常,本地分支“my_branch”将跟踪远程分支“origin/my_branch”。但在第一次推送之前,跟踪“origin/master”也是可以的。git pull --rebase 仅获取上游分支的当前版本,将您的分支重置为该版本,并回放您所做的所有提交。因此,您会得到相同的更改,仅基于上游分支的当前版本。 - michas
1
你可以通过 git tag old_state; git pull --rebase; gitk HEAD old_state 命令来查看 rebase 的工作情况。假设你已经进行了一些本地提交,并且上游有新的提交,那么你应该能够看到基于旧版本上游的原始提交以及基于当前版本上游的 rebase 提交。 - michas

14
我建议使用基于变基(rebase)的工作流程。因此,您应该使用git pull --rebase而不是git pull
对于功能分支,我也会这样做。所以,不要使用git merge master --no-ff,而是使用git rebase master。但是,如果该功能分支在开发过程中需要与同事共享,则最好定期将主分支合并到功能分支中。
但是说实话,我在一个小团队中工作,如果我们需要共同在一个功能分支上工作,并且需要将其与主分支更新,则我们只需暂停我们的工作一小段时间(并清楚地沟通进程),在主分支上变基并强制推送功能分支。但是,这对于更大的团队来说并不可扩展。然而,我发现使用基于主分支的变基的功能分支比处理来自主分支的合并方便得多。
确保阅读此文章。 Git 工作流程和变基 vs 合并问题

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接