我在两台机器上克隆了一个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
打印的"前进"、"落后"或"发散"。数字(取决于状态输出格式和其他个人设置)。