致命:不可能快进,中止

Jes*_*ite 56 git

为什么Git不允许我再快进合并?如果我试图强迫它使用--ff-only,我会收到"致命的信息:不可能快进,中止".我意识到有很大的优势merge --no-ff,但我只是为什么我--ff-only现在不能解开困惑?

Dhe*_*Rao 539

使用该选项--no-ff关闭一拉快进:

git pull --no-ff
Run Code Online (Sandbox Code Playgroud)

https://git-scm.com/docs/git-pull#Documentation/git-pull.txt---no-ff

  • 如果您特别试图避免进行变基,那么这是正确的答案。 (18认同)

Md *_*mon 86

尝试这个。效果会很好。

git pull origin --rebase 
Run Code Online (Sandbox Code Playgroud)

出现非快进错误后,只需执行以下操作:

git pull --rebase origin <name-of-the-remote-branch>
Run Code Online (Sandbox Code Playgroud)

这会将远程更改获取到本地分支。最重要的是,它将应用您的本地提交。

然后

git push origin <name-of-the-remote-branch>
Run Code Online (Sandbox Code Playgroud)

这会将远程分支本地副本中的本地更改应用到 git 中的实际远程分支存储库

** 受到推崇的

Also -you can try this command

git pull --no-ff
Run Code Online (Sandbox Code Playgroud)

终端中的响应 -

  1. 请输入提交消息来解释为什么需要进行此合并。
  2. 特别是如果它将更新的上游合并到主题分支中。
  3. 以“#”开头的行将被忽略,空消息将中止提交。

之后通常是git add、提交和推送


Amb*_*ber 63

您的分支不再直接基于您尝试将其合并到的分支 - 例如,另一个提交已添加到不在您的分支中的目标分支.因此,您无法快进(因为快进需要您的分支完全包含目标分支).

您可以在目标分支(git rebase <destination branch>)之上重新分支您的分支以重新提交提交,以便它们快进到它,或者您可以定期合并.

  • 只需运行:`git pull origin &lt;branch&gt; --rebase` (21认同)
  • @mathtick这条消息来自于你的拉取配置被设置为“ff”命令“git config pull.ff only” (9认同)
  • 这怎么可能?这是不正确的。一定是某些设置发生了变化。 (5认同)
  • “快进要求您的分支完全包含目标分支”似乎是倒退的。应该是“快进要求您的分支完全包含在目标分支内” (2认同)

Ajm*_*san 37

对我来说这有效。将branch_name更改为分支的实际名称:

git pull origin branch_name --no-ff
Run Code Online (Sandbox Code Playgroud)

  • 有效,但之后必须手动解决冲突。 (2认同)

Sus*_*Guy 33

git pull origin master如果您在本地分支上执行 a 时遇到此问题,请.gitconfig在记事本中打开(通常隐藏在 C:\Users\Myname 中)并添加这两行

[pull]
    ff = no
Run Code Online (Sandbox Code Playgroud)

保存配置git pull origin master并重试

  • `git pull origin master --ff/--no-ff/--ff-only` 是各自的_一次性_选项。 (10认同)

小智 29

出现此错误的原因是“合并冲突”。如果对 GitHub 文件进行了多次编辑/更新,而没有在更新的每个阶段提取更改,则会导致合并冲突。

正常情况:-

$ git pull
Run Code Online (Sandbox Code Playgroud)

注意:- 你会得到一个错误。 致命:无法快进,中止

试试这个:-

$ git pull origin master --rebase
Run Code Online (Sandbox Code Playgroud)

注意:- 现在执行此命令后,您将遇到合并冲突问题。所以现在您可以转到您的文件并手动解决冲突。合并冲突错误


cry*_*ick 27

git pull --rebase.与其他解决方案不同,您无需知道目标分支的名称.

  • 如果在此期间遇到合并冲突,请修复合并文件,然后运行“git rebase --continue”。 (15认同)
  • 这对我来说非常有用,除了我的分支上没有上游集,所以我必须使用“git pull origin &lt;branch&gt; --rebase”,它似乎可以解决问题。谢谢! (6认同)

小智 21

这对我有用

git pull --no-ff
Run Code Online (Sandbox Code Playgroud)

那么如果你面对这件事,

请输入提交消息来解释为什么需要进行此合并,
#特别是如果它将更新的上游合并到主题分支中。
#
# 以“#”开头的行将被忽略,并且空消息将中止
# 提交。

然后按照下列步骤操作:

  1. i
  2. Esc
  3. :wq


小智 18

您可以在终端中尝试此操作,该终端实际上​​会编辑您的 <.gitconfig> 文件并设置 ff = no

git config pull.ff no
Run Code Online (Sandbox Code Playgroud)

  • 通过额外的支持信息可以改进您的答案。请[编辑]添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以[在帮助中心](/help/how-to-answer)找到有关如何写出好的答案的更多信息。 (2认同)

Ama*_*waj 17

  • If
git pull
Run Code Online (Sandbox Code Playgroud)

does not do the trick and if you want to merge both the current changes and the changes that'd come from the pull of the branch from origin then do this:-

git merge origin/BRANCH_NAME
Run Code Online (Sandbox Code Playgroud)
  • After that, resolve the merge conflicts if any and done for the day.

  • 工作了!!!!因此,就我而言,我从父分支拉到子分支,子分支几乎没有什么不同的变化,而父分支则继续下去。 (2认同)

Sid*_*jee 16

这个对我有用。您可以使用:

git pull --no-ff


Rah*_*din 12

使用:

git pull origin main --rebase
git pull --rebase
Run Code Online (Sandbox Code Playgroud)

上面的两个命令对我有用。但唯一的问题是我也在当前分支中看到来自分支的提交......


auv*_*ipy 11

git pull origin --no-ff 为我解决了问题。


Pra*_*oni 9

这是因为您启用了仅快进选项。这里的事情是您从分支中拉取将在您的本地 git 中创建一个合并提交,并且仅快进选项不允许在拉取时创建合并提交。

在一个大团队的情况下,你最终会在很多时候为每个来自 pull 的提交重新定位和解决冲突。

我建议您从 git 本地配置文件中删除 ff = only 行。

$ cd to-my-project-root-dir

$纳米.git/config

[pull]
        ff = only // remove this line
        rebase = false

Run Code Online (Sandbox Code Playgroud)

  • 仅当启用“ff = only”时才可能发生这种情况,但这不是原因。如果发生错误,则表明发生了非标准的情况,请参阅 /sf/answers/2028153711/ 了解确定发生情况的好方法。例如,我在尝试从 master 拉取时遇到此错误,而我实际上所做的是在 master 上本地提交一些远程中不存在的内容。在团队中,我们永远不应该致力于掌握或推动掌握;如果我禁用了 ff 那么它就不会告诉我我的错误。 (2认同)

LeG*_*GEC 5

我什么时候会看到这条消息?

\n

当你跑步git merge --ff-only <some/branch>git pull --ff-only <remote> <some/branch>,您尝试合并的分支或提交不是基于您当前的分支\xe2\x80\x94,它的历史记录以某种方式从您的分支中分叉出来。

\n

git pull可以在配置中设置默认值,因此如果您运行普通的git pull origin <some/branch>,并且您的配置有 ,您也可以看到这一点pull.ff = only。\n要检查您的配置:运行git config pull.ff\nor git config --show-origin pull.ff\n(git merge有类似的merge.ff选项)

\n

我怎样才能看到什么不起作用?

\n

要查看您的分支和目标分支的历史记录,您可以使用:

\n
git log --graph --oneline HEAD <some/branch>\n
Run Code Online (Sandbox Code Playgroud)\n

如果您没有明确输入分支名称(例如:git merge --ff-onlygit pull --ff-only),git则默认为“活动分支的上游分支”——通常是origin/mybranch。从命令行引用该分支的方法是@{u}

\n
git log --graph --oneline HEAD @{u}\n# For Powershell users: @{...} is an operator, you will need to quote "@{u}"\ngit log --graph --oneline HEAD "@{u}"\n
Run Code Online (Sandbox Code Playgroud)\n

您应该会看到当前分支和目标分支之间的差异。\n另请参阅“更多git log选项””。

\n

我可以做什么来解决这个问题?

\n

这取决于您想要达到的结果以及您在上面的历史记录中看到的内容。

\n

您可能希望在目标提交之上重新调整您的提交:

\n
git rebase <some/branch>\n\n# To rebase on top of your default upstream:\ngit rebase   # The same as \'git rebase @{u}\'\n
Run Code Online (Sandbox Code Playgroud)\n

您可能想要运行实际的合并,而不是只允许快进:

\n
git merge <some/branch>\ngit merge     # The same as \'git merge @{u}\'\n
Run Code Online (Sandbox Code Playgroud)\n

或者任何适合您需求的东西:

\n
    \n
  • 在远程分支之上挑选一些您的提交,
  • \n
  • 使用git rebase -i
  • \n
  • 反过来合并...
  • \n
\n

跑步时如何避免这种情况git pull

\n

如果您已设置--ff-only为默认值(例如:如果git config pull.ff返回only),则可以通过显式提供命令行标志来一次性覆盖此默认值:

\n
git pull --rebase  # Rebase on top of fetched branch, rather than merge it.\ngit pull --ff      # Run a normal merge\n                   # (note: you *will* have a merge commit in your history)\n
Run Code Online (Sandbox Code Playgroud)\n

如果您想将该默认值更改为其他值:

\n
# Remove that default value, allow normal merges when pulling\ngit config --global --unset pull.ff\n\n# Run `git pull --rebase` by default\n#   Note: you still need to run \'git config --global --unset pull.ff\'\ngit config --global pull.rebase true\n
Run Code Online (Sandbox Code Playgroud)\n
\n

更多的git log选择

\n

要查看终端中两个分支之间的差异:

\n

git log --oneline --graph a ba将向您展示和组合在一起的完整历史记录b。\n如果您想查看ab 自从它们分叉以来的历史记录的历史记录:

\n
git log --oneline --graph --boundary a...b\n\n# a...b (3 dots) : Means \'symmetric difference\' in git log\n# --boundary     : Will show the commit that was at the fork point\n#                  without this option, the two histories will be\n#                  printed one below the other\n
Run Code Online (Sandbox Code Playgroud)\n

如果您想隐藏侧分支 - 例如,如果您想查看git log my/branch...master,但不想查看合并到 的所有拉取请求的详细信息master

\n
git log --oneline --graph --boundary --first-parent a...b\n\n# --first-parent : On merge commits, only follow the first parent\n
Run Code Online (Sandbox Code Playgroud)\n

许多 Git 图形前端(Git ExtensionsTortoiseGitgitk等)都可以在您查看存储库历史记录时激活这些选项。\n在 GUI 中查找复选框,以及可以在其中键入a...b或 的字段HEAD...@{u}

\n

如果您打算定期使用其中一些命令,请为它们设置别名:

\n
# Example: show HEAD vs @{upstream} log\ngit config --global alias.whatsup \'log --oneline --graph --boundary HEAD...@{u}\'\n\n# You can now run:\ngit whatsup\n
Run Code Online (Sandbox Code Playgroud)\n


小智 5

此错误通常在尝试 git pull 或 git merge 时发生,并且您正在处理的本地分支与远程分支存在分歧,导致 Git 无法执行快进合并。以下是该问题的详细分析以及解决该问题的步骤:

为什么发生此错误: 历史记录不同:您的本地分支和远程分支具有对方没有的提交。Git 无法快进,因为没有线性路径来组合历史记录。

非线性历史:只有当合并分支的头是基础分支头的直接后代时,才可能快进。如果你们的历史有分歧,情况就不是这样了。

如何诊断: 检查提交历史记录:使用 git log --graph --all --decorate --oneline 可视化分支之间的差异。

识别不同的提交:查找本地分支中不在远程分支中的提交,反之亦然。

解决问题: 合并提交:您可以创建合并提交来协调差异。这保留了两个分支的历史记录,但向历史记录添加了新的提交。

git merge <remote-branch>
Run Code Online (Sandbox Code Playgroud)

变基:如果您喜欢干净的线性历史记录,则可以在远程分支之上对本地更改进行变基。这会重写您的本地提交并将它们放置在远程分支的提交之上。

git fetch
git rebase <remote-branch>
Run Code Online (Sandbox Code Playgroud)

注意:如果有重大更改,变基可能会很复杂,因此最好在更改相对较小时使用。

强制推送(谨慎):如果您确定本地更改应覆盖远程更改,则可以强制推送。但是,这可能会覆盖远程分支上的更改,因此存在风险。

git push -f
Run Code Online (Sandbox Code Playgroud)

警告:仅当您完全理解其含义时才使用此选项,尤其是在协作环境中。

最佳实践: 定期获取和拉取:为了避免此类问题,请定期从远程分支获取和拉取更改。 清晰的沟通:在团队环境中,与团队成员就分支机构变更进行沟通。 备份分支:在执行变基或强制推送等操作之前,创建备份分支。

处理此类 Git 错误和版本控制中的最佳实践,这是我遇到的解决 Git 错误问题的详细指南