git checkout branch显示错误的状态
git checkout branch显示错误的状态
git branch -a
显示了以下内容:
* master remotes/origin/HEAD -> origin/master remotes/origin/feature remotes/origin/master remotes/origin/origin/feature
我想要切换到最后一个分支remotes/origin/origin/feature
。
我真的不知道为什么会有remotes/origin/feature
和remotes/origin/origin/feature
,它们是由别人创建的。
文件结构如下所示:
--> F --> G origin/feature
/
A --> B --> C --> D --> E master
现在我想要将remotes/origin/origin/feature
合并到master分支。
奇怪的是,如果我想要使用以下命令切换到feature分支:
git checkout 'origin/feature'
所有文件的状态都是在点B
而不是点G
。我通过gitlab的GUI触发了合并,它告诉我我必须使用以下命令:
git checkout -b 'origin/feature' 'origin/feature'
这样可以正常工作,现在所有文件的状态都是在点G
。
为什么会这样?为什么即使该分支已经存在,我仍然需要使用-b
选项,并且为什么我需要输入两次?
问题的原因是在远程仓库中创建了一个名为origin/feature的分支,然后在本地仓库中使用git checkout命令尝试切换到该分支。由于origin/feature在本地仓库中也是一个远程跟踪分支的名称,所以git checkout命令将其解释为一个非分支名称,导致切换到了错误的状态。
解决方法是在远程仓库中将origin/feature分支重命名为一个更有意义的名称,例如feature2。然后在本地仓库中运行git fetch --prune命令,以使本地仓库更新为远程仓库的最新状态,并删除旧的远程跟踪分支名称refs/remotes/origin/origin/feature,并创建基于新分支名称的新远程跟踪分支名称。
谢谢详细的回答。我现在不能说我完全理解了所有的内容,但我对问题有了一个大致的了解。我以后会再回来深入研究一下。
git checkout branch shows wrong state这个问题的出现原因是使用了过时的git checkout命令,应该使用git switch命令来代替。另外,如果要强制git checkout将origin/feature视为一个分支名而不是一个文件名,可以使用git checkout origin/feature --命令。
解决这个问题的方法是使用git switch命令来切换分支,而不是使用git checkout命令。或者至少使用git checkout origin/feature --命令来强制git checkout将origin/feature视为一个分支名而不是一个文件名。
另外,为什么即使分支已经存在,我仍然需要使用-b选项,并且为什么需要输入两次分支名呢?因为该分支只存在作为一个远程跟踪分支(记录了最后从名为origin的远程仓库获取的内容)。最好不要在分支名中包含origin/xxx,因为这会造成混淆,因为默认的远程仓库本身就被命名为origin。只需使用git switch origin/feature命令就足够了,因为它有一个猜测模式:
如果没有找到
$ git switch -c