Git:"目前没有任何分支机构." 有没有一种简单的方法可以回到分支上,同时保持变化?

Eri*_*k B 192 git branch git-checkout

所以我在存储库中做了一些工作,当我即将提交时,我意识到我目前不在任何分支上.

在使用子模块时,这种情况发生了很多,我能够解决它,但这个过程很繁琐,而且我一直在想必须有一个更简单的方法来做到这一点.

有没有一种简单的方法可以回到分支上,同时保持变化?

ara*_*nid 197

如果你还没有承诺:

git stash
git checkout some-branch
git stash pop
Run Code Online (Sandbox Code Playgroud)

如果您已经提交并且没有更改任何内容,则:

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
Run Code Online (Sandbox Code Playgroud)

如果您已经承诺然后做了额外的工作:

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop
Run Code Online (Sandbox Code Playgroud)

  • 如果你已经提交:注意你提交的提交的哈希值(使用`git show`或`git rev-parse HEAD`),切换到分支,然后是`git cherry-pick`,然后是提交哈希. (24认同)
  • 如果你已经承诺,这个没有帮助.虽然没有在问题中指明,但没有downvote. (16认同)
  • 如果已提交,请获取上次提交的哈希值.检查你想要的分支,然后`git merge _hash_` (7认同)
  • 在每个命令面前发表评论会很棒 (4认同)

bab*_*bay 155

这对我有帮助

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch
Run Code Online (Sandbox Code Playgroud)

  • 你会感到惊讶. (47认同)
  • 如果您已经进行了多次提交,那么您需要这样做. (25认同)
  • @ErikB 我什至不知道有一种不在分支上的事情。这个答案对我很有帮助。 (2认同)
  • 可爱的答案,实际上只是输入并工作,不像GIT初学者遇到的其他所有东西 - 你可能想指出newbranch是一个arbritrary名称,并不打算用提交哈希替换 (2认同)

m_m*_*iah 22

git checkout master
Run Code Online (Sandbox Code Playgroud)

这样的结果是这样的:

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e
Run Code Online (Sandbox Code Playgroud)

所以,让我们这样做:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e
Run Code Online (Sandbox Code Playgroud)


Obs*_*ver 11

在这里留下另一种方式

git branch newbranch
git checkout master 
git merge newbranch 
Run Code Online (Sandbox Code Playgroud)

  • @ErikB他可能做过多次提交.在那种情况下,请参阅babay的回答. (3认同)

Abi*_*ern 9

或者,您可以设置子模块,以便检查分支而不是处于默认的分离头状态.

编辑添加:

一种方法是在使用-b标志添加子模块时检出子模块的特定分支:

git submodule add -b master <remote-repo> <path-to-add-it-to>
Run Code Online (Sandbox Code Playgroud)

另一种方法是进入子模块目录并检查它

git checkout master
Run Code Online (Sandbox Code Playgroud)


Eri*_*k B 5

我最近又遇到了这个问题。自从我上次使用子模块以来已经有一段时间了,并且了解了有关 git 的更多信息后,我意识到只需检查要提交的分支就足够了。即使您不隐藏工作树,Git 也会保留它。

git checkout existing_branch_name
Run Code Online (Sandbox Code Playgroud)

如果您想在新分支上工作,这应该适合您:

git checkout -b new_branch_name
Run Code Online (Sandbox Code Playgroud)

如果工作树中存在冲突,结帐将会失败,但这应该是很不寻常的,如果发生这种情况,您可以将其隐藏,弹出并解决冲突。

与接受的答案相比,这个答案将为您节省执行两个命令的时间,无论如何,这两个命令实际上不会花费那么长时间来执行。因此,我不会接受这个答案,除非它奇迹般地获得比当前接受的答案更多的赞成票(或至少接近)。


Ian*_*Ian 5

导致这种情况的一种方法是在从远程分支执行 rebase 之后。在这种情况下,新提交被指向HEADmaster不指向它们——它指向你重新定位另一个分支之前的任何地方。

您可以master通过执行以下操作使此提交成为您的新提交:

git branch -f master HEAD
git checkout master
Run Code Online (Sandbox Code Playgroud)

这会强制更新master为指向HEAD(不让您穿上master)然后切换到master.