Rebase让推动变得不可能

时间:2015-07-02 14:22:27

标签: git rebase

我在Git中使用rebase遇到了一些麻烦,这里是对情况,我想要的以及我做了什么的“画面”。

Repo state (initial)

   --- C1 --- C5 --- C6 --- C7 (master & origin/master)
        \
         \--- C2 --- C3 --- C4 (my-branch & origin/my-branch)
Repo state (wanted)

   --- C1 --- C5 --- C6 --- C7 --- C2 --- C3 --- C4 (my-branch & origin/my-branch)
                             |
                (master & origin/master)

所以,在这种情况下,我这样做了:

$ git checkout my-branch
$ git rebase origin/master

但是回购变成了这种状态:

   --- C1 --- C5 --- C6 --- C7 --- C2 --- C3 --- C4 (my-branch)
        \                    |
         \       (master & origin/master)
          \
           \--- C2 --- C3 --- C4 (origin/my-branch)

所以,当我试图推“my-branch”时,git告诉我一个错误告诉我,我的分支有些没有被改变所以我无法推动。

我做了什么(我知道这是糟糕解决方案):

$ git push origin --delete my-branch
$ git push

因此,远程分支被删除并重新创建。

我确实还有另一种解决方案,但我无法找到我的想法。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

将来您只需使用git-merge

  

git-merge - 一起加入两个或多个开发历史

     

合并来自命名提交的更改(因为   他们的历史时间从现在的分支分歧进入   目前的分支。 git pull使用此命令进行合并   来自另一个存储库的更改和可以手动用于合并   从一个分支变为另一个分支

例如:

git checkout my-branch
git merge master

这会将master的提交带到my-branch,而不会更改master中的任何内容。

一个非常有用的提示是学习如何使用git-refloggit-reset撤消您可能已经执行过的不受欢迎的rebase。由于您已经删除了远程仓库,因此这样做没有意义,但如果您再次需要它,这是一个示例:

git reflog
# This will print a history of repository changes.
# Pick the latest ref before the rebase - let's suppose it's HEAD@{3}

# CAUTION: Be sure you understand what git-reset --hard does
git reset --hard HEAD@{3}

现在你的存储库应该回到你做rebase之前的状态。

注意 - 关于git-reset使用的--hard标志:

  

- hard重置索引和工作树。 自< commit>以来对工作树中跟踪文件的任何更改被丢弃