6

当我第二次推送功能分支时,如何避免收到以下消息:

To https://github.com/xxx/git_test.git
! [rejected]        feature_branch -> feature_branch (non-fast-forward)
error: failed to push some refs to 'https://github.com/xxx/git_test.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

我要做的是:

git pull origin sprint_branch1
git checkout -b feature_branch

date > a.txt
git add a.txt 
git commit -m 'added date'

git push origin feature_branch

有人对我的功能进行代码审查,同时其他人对 sprint_branch 进行更改:

git checkout sprint_branch1
date > a.txt 
git add a.txt 
git commit -m 'added another date'
git push origin sprint_branch1

我需要改进我的功能,所以我这样做

git checkout feature_branch
git fetch origin
git rebase origin/sprint_branch1

我遇到合并冲突并执行以下操作:

nano a.txt # removing inserted merge tags
git add a.txt 
git rebase --continue

然后我改进我的功能

date >> a.txt 
git add a.txt 
git commit -m 'add another date again'

我喜欢推送我的 feature_branch 进行第二次审查

git push origin feature_branch

但是,我收到顶部提到的错误消息。Git 建议我使用 git pull,但其他人建议我使用 rebase 工作流程。那么我应该怎么做才能推送 feature_branch 呢?我应该创建一个名为 feature_branch_v2 的新分支并推送它吗?在这种情况下,我是否需要手动记住要 git add 的文件,还是应该添加所有文件(创建一个混乱的提交)?有没有更好的推送方法而不会收到此错误消息?

4

2 回答 2

8

这是你出错的地方:

git rebase origin/sprint_branch1

您不应该对已发布的分支进行变基。这个命令应该是

git merge origin/sprint_branch1

一般来说,你应该小心git rebase——它周围似乎有某种宗教,尽管它是一个非常危险的工具。

你怎么能继续?

  • 如果您绝对确定没有其他人会再次触及功能分支,并且自上次拉动以来没有人对其进行任何更改,您可以这样做

    git push -f
    

    这将用您的 HEAD 覆盖服务器上的 HEAD。

  • 如果您确定自上次拉取后没有任何更改,但其他人使用您的分支,您可以执行上述操作并告诉每个人他们需要运行您的分支副本

    git fetch origin
    git checkout feature_branch
    git reset --hard origin/feature_branch
    

    不过,这将清除他们上次推送以来的所有本地更改。

  • 最安全的方法是将您的本地重命名feature_branch为其他名称,找到您添加的提交、当前分支origin/feature_branchcherry-pick所有更改。

运行gitk feature_branch origin/feature_branch以了解正在发生的事情。

于 2013-07-28T12:07:34.487 回答
2

吉特说

hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.

提交后,您可能只需要使用 rebase 工作流程从远程分支中提取 rebase,然后推送到远程。

git commit -m 'add another date again'
git pull --rebase

这可能会导致你必须解决的 rebase 冲突,然后继续 rebase。这主要是因为 sprint_branch1 中的树版本在 feature_branch 之后。

您应该确保正确的提交也进行了。一般来说,当您与 sprint_branch1 合并时,最好做一个

git checkout feature_branch
git merge sprint_branch1

这不是 rebase,因为 rebase 会重写您的提交,这可能会导致问题。合并后,如果您只是推动它应该可以正常工作。

编辑1:

如果您需要 rebase 并且仍然避免此错误,您可以使用

git push --force origin feature_branch

但是,不建议这样做,尤其是在分布式团队中,因为它会用您的本地分支重写远程分支,而不管其他人可能向其推送的任何更改。

于 2013-07-28T09:24:48.800 回答