Git Rebase -> 为什么在拉取时会合并?

Leo*_*rdo 3 git rebase git-rebase

我创建了一个分支来开发新功能。由于这个新功能完全是作为一个新项目开发的,唯一可能的冲突来源是解决方案文件。

随着功能的开发,主分支更新了几次。当我完成开发和测试时,我做了:

git checkout master
git fetch
git pull
git checkout myFeature
git rebase master
Run Code Online (Sandbox Code Playgroud)

变基(和所有其他命令)运行良好,没有报告任何冲突/错误/问题。我的下一步是,git status结果是:

在分支 myFeature
你的分支和 'origin/myFeature' 有分歧,分别有 7 和 5 个不同的提交。(使用“git pull”将远程分支合并到你的分支中)

当我git pull打开合并并查看历史记录时,我的提交被重复了。在我看来,这种重复是不应该发生的。我期待我的提交应该在最后一次(当前)提交后重新应用。

我做错了什么还是我的期望是错误的?

Jul*_*ian 7

为什么会有合并提交

当您进行 rebase 时,您正在更改 Git 历史记录。当您再次执行拉取操作时,Git 会尝试再次合并两个历史记录。默认情况下git pullgit fetch+ git merge,这将导致合并提交。

这不是您在更改历史后想要的,因为它会(部分)恢复您的历史更改。不幸的是,暗示git status有点误导......

变基/更改历史记录后您应该做什么

在更改历史(例如 rebase)之后,您需要强制推送,以便您也将在遥控器上获得该历史。你告诉 git 然后“历史是不同的,但相信我,这是有意的”。

建议使用“带租约的强制推送”:git push --force-with-lease- 参见git push --force-with-lease vs. --force

修复当前状态的步骤

幸运的是,您可以git pull使用 Git reflog回到 之前!

这将修复错误的拉动,并且不会有任何冲突需要解决:)

所以步骤如下:

  1. 在 reflog 中找到正确的提交git reflog,所以在之前git pull(注意:您可以通过键入退出 reflog q
  2. Git重置为该提交,例如 git reset 327fb961e --hard
  3. 仔细检查并执行git push --force-with-lease.

注意:如果您在使用 时出错git reset,您可以git reflog再次使用:)

注 2:reflog 仅在您的本地机器上