【问题标题】:Unable to switch branches. What am I doing wrong?无法切换分支。我究竟做错了什么?
【发布时间】:2015-06-25 22:58:58
【问题描述】:

我可能遗漏了一些东西。请指出我的错误。

我有一个存储库。 主干称为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'
$

非常欢迎提出建议。

【问题讨论】:

  • git reset 切换分支。 git checkout 是您要查找的命令。
  • 你为什么在这里使用git reset --hard?这可能不是你想要做的......
  • @Jubobs :我正在另一个系统上编码并测试这个系统上的更改。我定期使用git reset --hard 来保持与远程代码的同步。我想我误认为这个命令(也)能够在分支之间切换。
  • 真正的问题:git branch -a 给你什么?

标签: git branch git-reset


【解决方案1】:

转到 Git CMD 并根据需要运行以下命令。

如果您是第一次切换使用:git fetch --all

如果您尝试拉取最近创建的分支,请使用:git fetch

【讨论】:

    【解决方案2】:

    reset 将您当前的 HEAD 移动到指定的提交(--hard 相应地更新工作文件)。

    如果您的HEADmaster 并且您运行$ 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
    

    (如果您在本地工作时创建/推送其他提交到远程,这将失败。在这种情况下,您需要先pull,见下文。)


    设置完成后,更新本地分支就很容易了。你想做的是:

    git fetch origin dev-17
    git merge origin/dev-17
    

    这可以在一个操作中完成:

    git pull origin dev-17
    

    (假设您在本地分支dev-17

    【讨论】:

    • 感谢您的信息。仅供参考,我无意从测试机上提交。它只需要与我指向的任何分支保持同步。我正在处理master,一切都很顺利。然后我想用dev-17做一些测试,上面发生了。
    • 所以,如果我理解正确的话。只要我留在给定的$branch 上,我就可以使用git fetch origin && git reset --hard origin/$branch && git clean -f -d。但如果我想切换到另一个 $branch,我需要使用 git checkout -b $branch2 进行切换,然后从那里继续。
    • 而 HEAD(我现在明白了)是指向存储库历史中给定提交的指针。当前工作目录中的文件反映了该历史点的回购状态。
    • 根本不要使用resetHEAD 是指向给定提交(您已签出的提交)的指针,正确。实际上,所有分支都只是指向给定提交的指针,即使是masterreset 的目的是移动当前分支指向的内容。如果你在master 上运行reset,你正在改变master 的含义!你不希望出现这种情况。同样,git checkout 要更新的本地分支,然后是 git pull origin <the_branch_on_remote_to_update_from>
    • checkout -b创建一个新分支并检查它。要仅切换到现有分支,您需要 git checkout 不带标志。
    【解决方案3】:

    为了切换分支,您不需要进行重置。您需要 checkout 所需的分支

    git fetch --all --prune
    git checkout dev-17
    

    这将检查 dev-17 分支

    【讨论】:

    • 嗯。这似乎有效。请解释为什么fetch之前checkoutgit fetch origin 不会做同样的事情吗?
    • 你好。 --all 标志将获取 all 分支+标签,而不仅仅是您现在所在的当前分支。这就是区别。
    • --prune 也将删除所有已删除的分支/标签
    • 好的。因此,git fetch ...(重新)下载存储库。然后git checkout <branch> 将正确的文件集放入工作目录中。对吗?
    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 2016-07-18
    • 2015-12-02
    • 2019-12-23
    • 2014-06-15
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    相关资源
    最近更新 更多