在cherryPick之后Git无法提交修改

0 git github intellij-idea

场景如下

  1. 创建新的更改提交并推送(完成 OK)未合并,但我们称其为A
  2. 一段时间后执行 git reset --hard origin 然后获取并重新基于 master 3.cherry 选择更改A 并更新两个文件
  3. git 添加 .
  4. git 拉取
  5. git commit --修改
  6. git push -f 原始主机

现在我收到以下错误:

Total 0 (delta 0), reused 0 (delta 0)
remote: Processing changes: done
To ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Run Code Online (Sandbox Code Playgroud)

我在提交之前做了一个 git pull 并收到消息说它是最新的,知道我在这里错过了什么吗?我应该如何让它发挥作用?

我用的是intellij

Sch*_*ern 5

正是“pull然后”commit --amend才把事情搞砸了。从视觉上看,这就是您所做的。在拉取之后,master并且origin/master处于相同的提交状态。

A - B - C [master] [origin/master]
Run Code Online (Sandbox Code Playgroud)

然后你做了一个commit --amend. 这将采用 B 和 C 之间的更改以及您的新编辑,并创建一个新的提交 D。D 的父级是 B,因此您已经创建了一个分支。

A - B - C [origin/master]
     \
      D [master]
Run Code Online (Sandbox Code Playgroud)

origin/master现在已经master出现分歧。当你尝试pushgit 拒绝时,因为只允许快进。

为了解决这个问题git reset --soft origin/master--soft将保留 D 中的工作,但现在您的父级是 C。然后您可以进行正常提交(而不是提交修改)。这是首选选项,因为它允许您push正常进行并且不会扰乱其他人的工作。

         [origin/master]
A - B - C - E [master]
     \
      D
Run Code Online (Sandbox Code Playgroud)

(D 将被垃圾收集)。

或者你也可以git push --force。这告诉 git D 是现在的新提示master,要抛弃 C。强制推送对于其他开发人员来说非常不友好,他们基于 C 的工作现在将无效。他们在尝试时会遇到错误,pull并且必须做一些工作来修复它,这真是一团糟。


经验法则是,一旦您推送了更改,就不要对其进行变基git commit --amend算作变基。

并且不要习惯性地强行推动。