如何在Git撤销后返回到一个Git分支

3

因为我的代码存在一个根本性的问题,所以我不得不更改整个项目的目录树。在进行大规模更改之前,我进行了提交,然后才意识到其实并不需要进行这些更改。因此,我进行了

git checkout ##SHA##

我已经成功让整个项目按照预期工作,但现在出现了一个不同的问题。我不再在我正在工作的分支中签出。我该如何保留现有的代码并回到分支内继续工作?

git branch -a

说我在

* (no branch)

有没有人知道我可以做什么,除了创建一个新分支并删除旧分支?


尝试过 git checkout master 吗?或者你的分支名称。 - jweyrich
4个回答

6

永远不要执行git checkout <hash>。它的作用是暂时检查一个提交(因此你看到了没有分支)。你想要做的是,在分支中执行git reset --hard <hash>(如果你需要工作目录中的更改,则删除--hard)。

恢复方法:

git checkout the_branch
git reset --hard <hash>

请注意,上述的<hash>将与您在尝试“还原”更改时使用的git checkout所使用的哈希值相同。

好的回答!非常有信息量……谢谢您告诉我们 git checkout <hash> 的真正用途! - Jeremy Iglehart
那么我完成后不是还要进行一些编辑,然后再提交吗?我知道当前的<hash>是好的...为什么我不能只是git checkout my_branch,然后git merge <hash of the current commit that I know works>呢?或者我必须创建一个新分支,以便我可以提交它,然后将该新分支合并到实验之前保存的提交中吗? - Jeremy Iglehart
谢谢,这帮助我从被垃圾回收的无头提交中恢复,并在它们上面重置了主题分支。 - OnesimusUnbound

2

回到你的分支,然后将你在无头分支上所做的更改合并:

git checkout my_branch
git merge ##SHA##

接下来,您应该在您最近提交的分支my_branch上。


我非常喜欢这个答案,因为它是最快解决问题的方法 - 所以请注意,这真的是针对我的问题直接回答的最佳答案。然而@carleeto有一个教育性的观点,我认为他赢得了“答案”,因为我希望未来的访问者能够理解-carleeto的教育观点的好处。 - Jeremy Iglehart
这确实是解决这个问题最快、最直接的方法。 - Jeremy Iglehart
那么...现在我有一个分离的HEAD状态,对吧?这个状态有一个##SHA##(<哈希>)吗?我可以在检出旧的但“正确的”分支后引用它吗?或者检出该分支的过程会摧毁那段代码,无法引用它? - Jeremy Iglehart
首先,请确保将更改提交到分离的 HEAD。然后使用 git log 命令并复制顶部提交哈希值,切换到目标分支并与该哈希值合并。 - dorsh

1
  1. 创建一个分支:git branch -b branch_for_new_code
  2. 添加并提交您的更改。
  3. 检出您想要返回的分支:git checkout branch_i_was_on
  4. 将新分支与旧分支合并:git merge branch_for_new_code
  5. 一旦合并完成,删除新分支。

对于未来,请记住一个简单的经验法则:当您做一些不确定的事情时,请先创建一个分支。最后,除非您确实知道自己在做什么,否则只检出分支名称。


这是一个很好的点。谢谢你帮助我更好地了解 git 的实践方法,为未来打下坚实的基础!干杯,伙计,-J. - Jeremy Iglehart

0
如果您确定当前分支是您想要的,您可以执行以下操作:
git branch -D my_branch
git checkout -b my_branch

这会删除旧的分支指针,并创建一个新的指向当前 HEAD 的指针。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接