6

我有一个分支签出,我编辑并提交了一个文件。与此同时,其他人将更改推送到同一个文件。

当我执行 git pull 时,我看到了

First, rewinding head to replay your work on top of it...
Applying: add new line
Applying: create 1 conf
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging <filename>
CONFLICT (add/add): Merge conflict in <filename>
Recorded preimage for '<filename>'
Failed to merge in the changes.
Patch failed at 0002 create 1 conf
When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

我试图手动解决文件中的冲突,但是我发现我不在任何分支上。我想知道为什么会这样。

git status
# Not currently on any branch.
# Untracked files:
4

2 回答 2

6

这个是正常的。您只需要修复文件,然后按照rebase说明进行操作 - 通常使用--continue.

您通过以下方式解决问题

  1. 编辑文件以解决冲突
  2. git checkout --ours -- <filenames>如果您知道您的版本很好,请执行
  3. git checkout --theirs -- <filenames>如果他们的好,就表演。

跟随所有这些git add <filenames>。请注意,--oursand--theirs在某些情况下可以与您预期的不同;因此,如果您使用选项 2 或 3,请检查实际签出的文件。

结束git rebase --continue(这将为您完成提交)。如果您决定中止,请务必使用git rebase --abort,以便 git 可以让您摆脱“不在任何分支上”的状态。

于 2013-05-04T22:20:31.623 回答
6

我不在任何分支上。我想知道为什么会这样?

试图回答这个问题并帮助了解正在发生的事情——而不仅仅是一个从无头状态“坚持下去”的秘诀

  • 您似乎正在使用 git config 设置(pull.rebasebranch.*rebase),它指示git pull执行 fetch+rebase 而不是 fetch+merge
  • rebase 基本上是在远程分支的头部重放您的本地提交(即,无论有什么最新提交)。这涉及以下内容:

    1. git 检索自您上次获取/拉取以来的本地提交列表,以及其他人在远程分支上所做的提交
    2. 在你的情况下,它发现上述 2 已经分歧(所以不是一个快进的情况)
    3. 它检查远程分支的最新版本。注意:它不会检查远程分支本身,即:不会将 HEAD 引用设置为 remote/yourbranch,因为它是被禁止的(因为它是远程 repo 的只读镜像,所以你不能通过提交直接更新它) . 这就是无头状态的意思。
    4. 它尝试逐一挑选(重播)您的提交到该点,建立与您所做的类似的历史(具有相同的差异/补丁序列),除了现在它基于最新和最伟大的

      4.1。如果任何补丁在第 4 步期间导致冲突,该过程将暂停以让您解决它。那是当你意识到你处于一个奇怪的状态时:状态说“不在任何分支上”,gitk 将在最新提交上显示没有头标签。因此,只需遵循 git 的建议:解决冲突,进行更改(git add),然后......

      4.2. git rebase --continue恢复这个过程(不需要提交,git会为你做)。转到 4. 或者,您可能希望放弃更改,--skip或者如果您太困惑,--abort将所有内容重置为变基部分之前的位置。

    5. 在所有提交完成之后(即:应用补丁),它移动(重置)你对这个的原始分支引用到重新定位历史的提示(顺便说一句,放弃原始的提交序列以支持重放的历史)..所以现在,您会自动获得一个全新的 HEAD(您的分支参考)。无头已经结束,你不会注意到有片刻处于那种状态

如果您碰巧使用了git config pull.rebase=falseor (branch.*rebase),您将避免这种可怕的状态(以及可能更多的冲突) - 但是您可能会通过大量合并获得更嘈杂的历史记录。(个人也可以通过传递将其关闭以进行单次拉动--no-rebase

更深入地了解 rebase: http: //git-scm.com/book/en/Git-Branching-Rebase

希望这可以帮助。

于 2013-05-05T00:10:12.557 回答