场景如下
- 创建新的更改提交并推送(完成 OK)未合并,但我们称其为A
- 一段时间后执行 git reset --hard origin 然后获取并重新基于 master 3.cherry 选择更改A 并更新两个文件
- git 添加 .
- git 拉取
- git commit --修改
- 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
正是“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
出现分歧。当你尝试push
git 拒绝时,因为只允许快进。
为了解决这个问题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
算作变基。
并且不要习惯性地强行推动。
归档时间: |
|
查看次数: |
10464 次 |
最近记录: |