我检查了一个分支,我编辑并提交了一个文件。与此同时,其他人推送更改为同一个文件。
当我做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:
答案 0 :(得分:6)
这很正常。您只需要修复该文件,然后按照rebase
说明操作 - 通常使用--continue
。
您可以通过
解决问题git checkout --ours -- <filenames>
git checkout --theirs -- <filenames>
。使用git add <filenames>
完成所有这些操作。请注意--ours
和--theirs
在某些情况下可以根据您的预期进行交换;因此,如果您使用选项2或3,请检查实际签出的文件。
与git rebase --continue
结束(将为您提交)。如果您决定中止,请务必使用git rebase --abort
,以便git可以让您脱离'不在任何分支'的条件。
答案 1 :(得分:6)
我不在任何分支机构。我想知道为什么会这样?
尝试回答这个问题,并帮助了解正在发生的事情 - 而不仅仅是一个让你重新回到过去的秘诀。从无头状态:
pull.rebase
或branch.*rebase
),该设置指示git pull
执行fetch + rebase而不是fetch + merge rebase基本上是在远程分支机构上重播你的本地提交。 head(即最新提交的内容)..这涉及以下内容:
它试图逐个挑选(重播)你的提交到那一点,建立一个与你所做的相似的历史(使用相同的差异/补丁序列),除了现在它& #39; s基于最新和最伟大的
4.1。如果任何补丁在步骤4中导致冲突,则该过程将暂停以让您解决它。当你意识到你处于一个陌生的状态时:状态显示&#34;不在任何分支上#34; gitk将在最新的提交中没有显示头标签。所以只需按照git建议的建议:解决冲突,分阶段进行更改(git add),然后只是...
4.2。 git rebase --continue
恢复进程(不需要提交,git会为你做)。转到4.或者,您可能希望放弃更改--skip
,或者如果您太困惑,--abort
会将所有内容重置为rebase部分之前的位置。
完成所有提交后(即:应用了补丁),它会将您原来的分支引用移动(重置)到重新定位的历史记录(顺便说一句,放弃原始的提交顺序,转而使用重放的历史记录) )..所以现在,你自动获得一个全新的HEAD(你的分支参考)。无头已经结束了,你不会注意到那一刻已经处于那种状态
如果您碰巧使用git config pull.rebase=false
或(branch。* rebase),您可能会避免这种可怕的状态(并且可能会发生更多冲突) - 但是您可能会通过大量合并来获得更糟糕的历史记录。 (亲身
通过传递--no-rebase
可以将其关闭一次。
更深入地了解rebase:http://git-scm.com/book/en/Git-Branching-Rebasing。
希望这会有所帮助。