在重基后同步两个克隆中的分支

  • 本文关键字:两个 分支 同步 git
  • 更新时间 :
  • 英文 :


我在两台机器上克隆了一个repo,并在每台机器上的同一个分支(分支"foo")中工作了一段时间。(类似的场景:两个拥有克隆的人在同一个分支上工作。)我不想在main分支的变化上落后太多,所以偶尔会在一个克隆中从main分支重新建立foo分支。

让另一个克隆同步的最好方法是什么?

在一个克隆中的rebase后,需要强制推送来更新远程。然后我可以取出另一个克隆。但如果我试着拉,我就会有合并冲突要处理。我试着拉--force期望工作,但这仍然导致合并冲突。

在第二个克隆中,我可以使用reset --hard备份到main中的最后一次提交,然后对foo分支进行快速合并。这是最简单的方法吗?

Best"这几乎总是一个意见问题,但我同意matt的观点,至少在第一步或两步:使用git fetch

让我们举个例子。假设机器L是一台Linux机器,机器M是一台Mac,您正在开发同时在这两种系统上运行的软件,但偶尔需要另一种系统的特殊情况代码。对于开发和测试,您现在正在您的特性分支上工作:分支foo(为什么不是feature?)谁知道)。

无论如何,这里你在机器L上工作,在分支foo上。你修改一些文件,提交,构建和测试,它几乎可以工作,所以你再做一些修改,提交,构建和测试,现在它可以工作了。转到机器M,在分支foo上运行git fetch L。你现在严格在L/foo之后,所以:

M$ git rev-list --count --left-right L/foo...foo

打印" 20 "例如。现在您想要快进,引入两个提交。我有一个别名,git mff,但你可以写:

M$ git merge --ff-only L/foo

,现在您已经了解了最新的m.w.r.t.l.,现在您可以构建和测试…然后发现,最新的更新在macOS上不能工作。所以你需要做更多的修改,构建、提交和测试。

但是在这一切工作之前,有些事情让你切换回机器L。当你在L上时,你也添加了一两个新的提交:

L$ git commit -m "fix major goof spotted on M"
...

现在,不管你在哪台机器上运行git fetch,你的:

git rev-list --left-right --count M/foo...foo

或与L/foo...foo相同,打印两个正数。也就是说,两台计算机都领先于对方(同时也落后于对方)。

既然您不喜欢面向合并的工作流,那么您现在必须在两台机器中选择一台使用git rebase:

L$ git rebase M/foo

,现在你的Linux机器严格领先于mac,因此在mac上你将运行git fetch L; git reset --hard L/foo并且是偶数;或:

M$ git rebase L/foo

,现在你的mac严格领先于Linux机器,因此在Linux机器上你将运行git fetch M; git reset --hard M/foo并且是偶数。

不想做的一件事是:

git reset --hard L/foo
例如,如果没有将M提交先放到L上,通过在L上重基。因此,您肯定需要跟踪哪台机器"领先"。另一个,可能会想要在M上将foo的上游设置为L/foo,在L上将foo的上游设置为M/foo,并大量使用git status或类似的方法来获取git rev-list --count --left-right的数字。这些就是git status打印的"前进"、"落后"或"发散"。数字(取决于状态输出格式和其他个人设置)。

最新更新