分支 Git - 临时切换分支

4
我已经查看过以下内容:暂时将工作副本切换到特定的Git提交是否可以在GIT提交之间切换?Git之间切换提交。然而,我想梳理一个特定的主题:
我目前不在团队中工作,
我使用Git在本地保存我的项目历史记录(没有GitHub或Bitbucket),只有主分支,
我不会在项目结束之前将我的提交推送到工作目录外的.git文件夹。
我的问题很简单:
如何安全地返回到以前的提交(类似于时间机器),而不考虑破坏现有的树索引?
如何确保此特定提交之后添加的文件在此实验期间不会出现在工作目录中?
然后如何安全地返回到树的HEAD,并再次确保在此特定提交之后删除的文件(很久以前,不是这次)不会出现在工作目录中?
我提出这个问题的原因很简单:我正在学习,因此偶尔需要回顾一下过去发生了什么(只读)——比如一个月前。
谢谢。

git checkout 有什么不符合您的需求? - Chris Martin
据我所知,它不会删除在此特定提交之后添加的工作目录中的文件。 - Mike
@Mike:是的,它会。它不会删除未跟踪的文件,但如果已跟踪的文件在之前的提交中不存在,则会被删除。 - knittl
好的。- 已经注意到了。- 那么像.gitignore,.idea,netbeans等我标记为不跟踪的文件呢?- 没有恶意,只是一个问题。 - Mike
@Mike .gitignore已被跟踪。如果其他文件未被跟踪,则默认情况下不会被处理(或者您可以应用Chris Martin的解决方案)。 - VonC
@VonC .gitignore在这里并不特殊。它可能被跟踪,也可能不被跟踪,并且会像git checkout中的所有其他文件一样运行。 - user743382
2个回答

3
我认为这可以满足您的需求。
git stash --include-untracked
git checkout <commit>

git checkout master
git stash pop --index

为了完全清理工作目录,您可以将--include-untracked替换为--all,以便将被忽略的文件也存储在工作树中。


抱歉,“refspec”这个词不正确(它的意思是其他东西)。已将其更改为“commit”。它可以是提交哈希(就像在git reflog中看到的那样,但更常见的是在git log中),标签名称或分支名称。 - Chris Martin
@Mike 不,暂存不会创建提交。我认为手册页面可以更好地解释stash是什么。"当您想记录工作目录和索引的当前状态,但想返回到干净的工作目录时,请使用git stash。..." - Chris Martin
我刚刚了解了一下stash的作用,这可能不是我想要的。假设:项目已经完成一个月了。没有什么需要更改、添加或提交的。我只是想回到一个特定的状态,看看它所有的样子,然后返回HEAD。结果,经过所有的实验,工作目录和git树都不应该被应用任何更改。我知道本地克隆是最安全的解决方案,但这需要一些额外的努力。我希望有人能帮我绕过这个问题。 - Mike
@Mike 感到如此强烈地关心你不打算提交的内容的保留,这确实很奇怪。但这就是stash的作用。它做错了什么? - Chris Martin
错误的例子。很抱歉。将继续克隆我的工作目录并在那里进行实验,使用“git checkout <anOldCommitSHA1>”。看来我想从Git中得到它无法做到的东西。感谢所有参与者,祝你们周末愉快。 - Mike
显示剩余4条评论

0
一种简单的解决方案是:
  • 再次在本地克隆您的存储库
  • 在这个新克隆中进行实验
这样做的好处是:
  • 您的原始存储库仍然保留在主分支上
  • 在第二个克隆中,您可以根据需要执行git checkout anOldCommitSHA1
您可以继续留在主存储库并检出任何旧的提交,但是:
  • 在此之前,先执行git stash(以确保任何正在进行中的工作都被暂存)
  • 在切换回主分支后,执行git clean -d -f -x以清理使用旧提交工作树时可能生成的任何本地文件。

谢谢。- 目前我正在使用这种方法。- 但是我有点懒得为克隆的项目在虚拟主机文件和hosts文件中创建新条目,并且想知道Git中是否有更简便的方式,风水顺畅一点的方式... - Mike
我不使用仓库,我只有一个带有.git的工作目录。 - Mike
1
@Mike,一个带有.git文件夹的工作树就是Git仓库:你正在使用一个本地仓库。这是一个非裸仓库(与没有工作树的裸仓库相对应:https://dev59.com/QIDba4cB1Zd3GeqPEXX5#24115534)。 - VonC
@Mike,我提到的第一种解决方案(克隆您的本地repo)不涉及vhost和其他网络设置:您可以将本地repo(本地文件夹)克隆到另一个本地文件夹中。 - VonC
@Mike,天哪,我没想到你想要处理被忽略的文件...但是如果你使用--all标志,stash也可以做到。 - Chris Martin
显示剩余2条评论

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