GIT拉冲突:怎么没有任何分支?

时间:2013-05-04 22:10:21

标签: git

我检查了一个分支,我编辑并提交了一个文件。与此同时,其他人推送更改为同一个文件。

当我做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:

2 个答案:

答案 0 :(得分:6)

这很正常。您只需要修复该文件,然后按照rebase说明操作 - 通常使用--continue

您可以通过

解决问题
  1. 编辑文件以解决冲突
  2. 如果您知道自己的版本不错,请执行git checkout --ours -- <filenames>
  3. 如果他们是好人,请执行git checkout --theirs -- <filenames>
  4. 使用git add <filenames>完成所有这些操作。请注意--ours--theirs在某些情况下可以根据您的预期进行交换;因此,如果您使用选项2或3,请检查实际签出的文件。

    git rebase --continue结束(将为您提交)。如果您决定中止,请务必使用git rebase --abort,以便git可以让您脱离'不在任何分支'的条件。

答案 1 :(得分:6)

  

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

尝试回答这个问题,并帮助了解正在发生的事情 - 而不仅仅是一个让你重新回到过去的秘诀。从无头状态

  • 您似乎正在使用git配置设置(pull.rebasebranch.*rebase),该设置指示git pull执行fetch + rebase而不是fetch + merge
  • rebase基本上是在远程分支机构上重播你的本地提交。 head(即最新提交的内容)..这涉及以下内容:

    1. git检索自上次获取/拉取后的本地提交列表,以及其他人在远程分支上执行的提交
    2. 在你的情况下,它发现上面的2个已经分歧(所以不是快进案例)
    3. 它会检出远程分支的最新版本。注意:它不会检查远程分支本身,即:不要将HEAD引用设置为remote / yourbranch,因为它是远程仓库的只读镜像(因为它是远程仓库的只读镜像) ,所以你不能通过提交直接更新它。这就是无头状态的含义。
    4. 它试图逐个挑选(重播)你的提交到那一点,建立一个与你所做的相似的历史(使用相同的差异/补丁序列),除了现在它& #39; s基于最新和最伟大的

      4.1。如果任何补丁在步骤4中导致冲突,则该过程将暂停以让您解决它。当你意识到你处于一个陌生的状态时:状态显示&#34;不在任何分支上#34; gitk将在最新的提交中没有显示头标签。所以只需按照git建议的建议:解决冲突,分阶段进行更改(git add),然后只是...

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

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

如果您碰巧使用git config pull.rebase=false或(branch。* rebase),您可能会避免这种可怕的状态(并且可能会发生更多冲突) - 但是您可能会通过大量合并来获得更糟糕的历史记录。 (亲身 通过传递--no-rebase可以将其关闭一次。

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

希望这会有所帮助。