无法切换分支。我究竟做错了什么?
Unable to switch branches. What am I doing wrong?
我可能遗漏了什么。请指出我的错误。
我有一个存储库。
主干称为 master
(很明显)并且包含许多文件。
我创建了一个名为 dev-17
的分支,并向其中添加了一个文件(名为 file17
)。
现在,在基于 Debian 的系统上我这样做:
$ git fetch origin
$ git reset --hard origin/master
HEAD is now at 13e51c7 20150418.2030
$ git clean -f -d
$ git status
# On branch master
nothing to commit (working directory clean)
$
看起来不错。 ls
显示了我期望的所有文件。
然后我做:
$ git fetch origin
$ git reset --hard origin/dev-17
HEAD is now at 145e638 add file17
$ git clean -f -d
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
$
执行 ls
表明添加的 file17
确实存在。所以,显然我在 dev-17
分支上。但是,为什么 git status
说我在 master
?
现在真正的问题是,在 dev-17
分支上(编辑:上面的内容似乎并没有真正将我带到 dev-17 分支,所以这个说法是不正确的)当我想看看 file17
是否已经改变时会发生这种情况:
$ git --no-pager diff --name-only dev-17..origin/dev-17 -- ./file17
fatal: bad revision 'dev-17..origin/dev-17'
$
非常欢迎提出建议。
为了切换分支,您不需要进行重置。您需要 checkout
所需的分支
git fetch --all --prune
git checkout dev-17
这将检查 dev-17 分支
reset
将您当前的 HEAD
移动到指定的提交(并且 --hard
相应地更新工作文件)。
如果你的 HEAD
是 master
而你 运行 $ git reset --hard origin/dev-17
,你 移动 master
到与 origin/dev-17
相同的提交。您正在将引用移动到另一个提交,而不仅仅是更新本地文件。正如 git status
告诉您的那样,您仍在 master
上,但是 master
现在是另一个提交(与 origin/dev-17
指向的相同)。
要使用远程更新的提交更新 origin/dev-17
的内容,请使用 git fetch origin dev-17
。
要更新您的本地文件以反映 origin/dev-17
的内容,您需要 checkout
分支 origin/dev-17
。
如果你想继续在分支上工作,我建议创建一个本地分支来提交:
git checkout origin/dev-17
git checkout -b dev-17
将提交添加到分支后,您可以将其推送回远程:
git push origin dev-17
(如果您在本地工作时向远程提交了额外的 created/pushed,这将失败。在这种情况下,您需要先 pull
,见下文。)
设置完成后,很容易使您的本地分支机构保持最新状态。你想要做的是:
git fetch origin dev-17
git merge origin/dev-17
这可以在一次操作中完成:
git pull origin dev-17
(假设您在本地分支机构 dev-17
)
转到 Git CMD 并根据需要 运行 以下命令。
如果您是第一次切换使用:git fetch --all
如果您尝试提取最近创建的分支,请使用:git fetch
我可能遗漏了什么。请指出我的错误。
我有一个存储库。
主干称为 master
(很明显)并且包含许多文件。
我创建了一个名为 dev-17
的分支,并向其中添加了一个文件(名为 file17
)。
现在,在基于 Debian 的系统上我这样做:
$ git fetch origin
$ git reset --hard origin/master
HEAD is now at 13e51c7 20150418.2030
$ git clean -f -d
$ git status
# On branch master
nothing to commit (working directory clean)
$
看起来不错。 ls
显示了我期望的所有文件。
然后我做:
$ git fetch origin
$ git reset --hard origin/dev-17
HEAD is now at 145e638 add file17
$ git clean -f -d
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
$
执行 ls
表明添加的 file17
确实存在。所以,显然我在 dev-17
分支上。但是,为什么 git status
说我在 master
?
现在真正的问题是,在 dev-17
分支上(编辑:上面的内容似乎并没有真正将我带到 dev-17 分支,所以这个说法是不正确的)当我想看看 file17
是否已经改变时会发生这种情况:
$ git --no-pager diff --name-only dev-17..origin/dev-17 -- ./file17
fatal: bad revision 'dev-17..origin/dev-17'
$
非常欢迎提出建议。
为了切换分支,您不需要进行重置。您需要 checkout
所需的分支
git fetch --all --prune
git checkout dev-17
这将检查 dev-17 分支
reset
将您当前的 HEAD
移动到指定的提交(并且 --hard
相应地更新工作文件)。
如果你的 HEAD
是 master
而你 运行 $ git reset --hard origin/dev-17
,你 移动 master
到与 origin/dev-17
相同的提交。您正在将引用移动到另一个提交,而不仅仅是更新本地文件。正如 git status
告诉您的那样,您仍在 master
上,但是 master
现在是另一个提交(与 origin/dev-17
指向的相同)。
要使用远程更新的提交更新 origin/dev-17
的内容,请使用 git fetch origin dev-17
。
要更新您的本地文件以反映 origin/dev-17
的内容,您需要 checkout
分支 origin/dev-17
。
如果你想继续在分支上工作,我建议创建一个本地分支来提交:
git checkout origin/dev-17
git checkout -b dev-17
将提交添加到分支后,您可以将其推送回远程:
git push origin dev-17
(如果您在本地工作时向远程提交了额外的 created/pushed,这将失败。在这种情况下,您需要先 pull
,见下文。)
设置完成后,很容易使您的本地分支机构保持最新状态。你想要做的是:
git fetch origin dev-17
git merge origin/dev-17
这可以在一次操作中完成:
git pull origin dev-17
(假设您在本地分支机构 dev-17
)
转到 Git CMD 并根据需要 运行 以下命令。
如果您是第一次切换使用:git fetch --all
如果您尝试提取最近创建的分支,请使用:git fetch