好的,我认为这是一个简单的git场景,我错过了什么?

我有一个主分支和一个特征分支。我在master上做了一些工作,在feature上做了一些工作,然后在master上做了一些工作。我最终得到了这样的东西(字典顺序暗示了提交的顺序):

A--B--C------F--G  (master)
       \    
        D--E  (feature)

我对git push origin master来保持远程master的更新没有问题,也没有git push origin feature(当在特性上时)来维护我的特性工作的远程备份。到目前为止,我们都很好。

但现在我想在master上的F- G提交的基础上rebase feature,所以我git checkout feature和git rebase master。还好。现在我们有:

A--B--C------F--G  (master)
                 \
                  D'--E'  (feature)

问题:当我想备份新的基于git的推源特性分支的重基特性时,推被拒绝了,因为树已经因为重基而改变了。这只能用git的push -force origin特性来解决。

我讨厌在不确定自己是否需要的情况下使用武力。那么,我需要它吗?调整基地是否意味着下一步的行动应该是强有力的?

这个功能分支并没有与其他开发者共享,所以事实上我对强制推送没有任何问题,我不会丢失任何数据,问题更多的是概念性的。


当前回答

git在特性分支上的合并主有什么问题?这将保留您的工作,同时使其与主线分支分离。

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

编辑:啊,对不起,没有读你的问题声明。当你执行重基时,你将需要力量。所有修改历史记录的命令都需要——force参数。这是防止您丢失工作的故障保险(旧的D和E将丢失)。

所以你执行了一个git rebase,使树看起来像这样(尽管部分隐藏,因为D和E不再在一个命名的分支中):

A--B--C------F--G
       \         \
        D--E      D'--E'

所以,当你试图推动你的新特征分支(其中有D'和E')时,你会失去D和E。

其他回答

在这个分支上可能只有一个开发人员,也可能没有,也可能是现在(在重基之后)不与原始/特性内联。

因此,我建议使用以下顺序:

git rebase master
git checkout -b feature_branch_2
git push origin feature_branch_2

是的,新的分支,这应该解决这个问题,没有一个力量,我认为这通常是一个主要的git缺点。

我将使用“checkout -b”来代替,这样更容易理解。

git checkout myFeature
git rebase master
git push origin --delete myFeature
git push origin myFeature

当您删除时,您阻止在包含不同SHA ID的现有分支中推入。 在本例中,我只删除远程分支。

以下是我的工作:

Git push -f origin branch_name

而且它不会删除我的任何代码。

但是,如果你想避免这种情况,你可以做以下事情:

git checkout master
git pull --rebase
git checkout -b new_branch_name

然后,您可以挑选所有提交到新分支的文件。 git选择COMMIT ID 然后推你的新树枝。

一个解决方案是做msysGit的重基合并脚本所做的事情——在重基之后,在旧的特征头中合并-s ours。你最终会得到一个提交图:

A--B--C------F--G (master)
       \         \
        \         D'--E' (feature)
         \           /
          \       --
           \    /
            D--E (old-feature)

... 你的特色推广将是一个快进。

换句话说,你可以:

git checkout feature
git branch old-feature
git rebase master
git merge -s ours old-feature
git push origin feature

(没有测试过,但我认为是对的…)

我避免强迫推的方法是创建一个新的分支,并继续在这个新分支上工作,在一些稳定之后,删除被重基的旧分支:

在本地重设检出分支的基 从重基分支分支到新分支 将该分支作为新分支推到远程。并在远程删除旧的分支