重组分支的git同步

时间:2010-02-07 20:08:57

标签: git

我最近有一个关于多计算机git开发设置的question answered,我到那里的解决方案确实用master分支来解决我的情况,但不是基于主分支的侧分支。 / p>

这是我目前的设置:

A--B--C--D  master
          \
           E--F--G--H  BUG_37

BUG_37是一个分支,它正在为系统中的功能请求开发可选跟踪错误的修复程序,并最终将合并到主行中,但暂时是独立的。如果存储库处于此状态,一台计算机,我对master分支进行了一些更改:

A--B--C--D--I--J--K  master
          \
           E--F--G--H  BUG_37

然后我将BUG_37分支重新定位到master,以确保它可以作为对最新更改的增强功能:

A--B--C--D--I--J--K  master
                   \
                    E1--F1--G1--H1  BUG_37

让我们说rebase有一些冲突需要在rebase最终之前手动修复。如果我将这些更改推送到远程存储库,并且现在希望将更改下载到仍具有原始设置的另一个开发系统,那么最好的方法是什么? git pull --rebase将再次运行rebase,我将不得不手动完成第一次遇到的冲突,对吧?如果我再次遇到冲突时会出现轻微错误,这样新系统中的E1-H1略有不同,我会让存储库更加不同步。

如何将原始状态的本地存储库和第三个状态的远程存储库,并更新本地存储库以与远程存储库完全匹配(删除更改EH并移动BUG_37的HEAD到新的位置)?

4 个答案:

答案 0 :(得分:4)

删除分支,然后从远程存储库中提取两个分支。

git branch -D BUG_37
git pull origin master
git pull origin BUG_37:BUG_37

如果您不想删除本地BUG_37分支,请确保其有效,请将远程分支拉入另一个本地分支:

git pull origin BUG_37:NEW_BUG_37

答案 1 :(得分:4)

我根本不会在已经共享的分支上进行rebase。虽然它会产生最干净的历史,但它会改变BUG_37中所有提交的哈希值。因此,在目标计算机上,您需要完全删除BUG_37并再次将其拉出。这可以做一次或两次,但不如常规工作流程那么好。

master合并到BUG_37会更加容易;然后可以将合并提交(修复冲突的位置)推送到其他计算机,并且不需要删除分支。

答案 2 :(得分:3)

我正在遵循相同的工作流程,基本上是在笔记本电脑和台式机之间切换。我把主要的回购放在桌面上,笔记本电脑克隆了桌面的回购。最终他们不同步,因为我想在更新master后重新定义我的主题分支。

简单的答案就是不要使用git,而是使用rsync来保持你的回购同步。如果你知道你是唯一一个正在研究它的人,那么这是有道理的。

嗯,我也不是那个解决方案的忠实粉丝。所以,这可能有点“干净”。在笔记本电脑上,当从桌面的回购中拉出重新分支的分支时:

git co topic
git fetch origin/topic
git reset --hard origin/topic

这会抛弃任何不在桌面回购中的提交,所以请确保你真的想要这样做。

此外,您可能只需git pull笔记本电脑的master分支,因为它应该始终是快进的,因为您可能不需要对其进行重新定位。我认为重新定义主题分支是有意义的,因为否则试图将其合并回主人最终是一种痛苦。

答案 3 :(得分:2)

我刚试过它,并且在从一个重新分支的分支中使用git pull --rebase时起作用。如果没有--rebase标志,则提交将被复制,但是--rebase提交不会被复制。