【问题标题】:Git - temporarily switch betweenGit - 临时切换
【发布时间】:2014-10-30 01:24:40
【问题描述】:

我已经看过了: Temporarily switch working copy to a specific Git commit Is it possible to switch between GIT commits? Git switching between commits 不过,我想梳理一个具体的话题:

我目前不在团队中工作,

我使用 Git 将我的项目历史保存在本地(没有 GitHub 或 Bitbucket)并且只有 master 分支,

在项目结束之前,我不会将我的提交推送到工作目录中的 .git 之外。 我的问题很简单:

我怎样才能安全地返回我以前的提交(有点像时间机器)而不考虑破坏现有的树索引?

如何确保在此实验期间在此特定提交之后添加的文件不会出现在工作目录中?

然后我怎样才能安全地返回树的 HEAD 并再次 - 确保在过去(很久以前,而不是这次)特定提交之后删除的文件不会出现在工作目录中?

我问这个问题的原因很简单:我现在正在学习,因此希望不时回来看看(只读) - 过去发生了什么(比如一个月前)。

谢谢。

【问题讨论】:

  • git checkout 怎么不能满足你的需求?
  • 它不会删除工作目录中在此特定提交之后添加的文件,AFAIK
  • @Mike:确实如此。它不会删除 未跟踪的 文件,但如果跟踪的文件在之前的提交中不存在,则会被删除。
  • 好的。 - 著名的。 - 我标记为不被跟踪的 .gitignore 、 .idea 、 netbeans 等文件呢? - 没有拖钓,只是提问。
  • @Mike .gitignore 被跟踪。另一个,如果未跟踪,默认情况下不会被触及(或者您可以应用 Chris Martin 的解决方案)

标签: git


【解决方案1】:

我认为这可以满足您的需求。

git stash --include-untracked
git checkout <commit>

git checkout master
git stash pop --index

对于一个完全干净的工作树,您可以将--include-untracked 替换为--all 以存储被忽略的文件。

【讨论】:

  • 1. 是否意味着“git reflog”的结果? - 像“24b7ecb”? 2. “git stash --include-untracked”的结果会变成树的头吗?
  • 抱歉,“refspec”是错误的词(意思是something else)。将其更改为“提交”。它可以是提交哈希(就像您在 git reflog 中看到的一样,是的,但在 git log 中更常见)、标签名称或分支名称。
  • @Mike 不,存储不会创建提交。我认为man page 可以解释存储比我更好的东西。 “当你想记录工作目录和索引的当前状态,但又想回到一个干净的工作目录时,请使用 git stash。......”
  • 我刚刚查看了 stash 的作用,这可能不是我想要的。 - 想象一下:这个项目已经在一个月前完成了。没有什么可更改、添加或提交的。 - 我只是想回到一个特定的状态,看看它是什么样子,然后回到 HEAD。 - 结果,在所有实验之后,必须对工作目录和 git 树进行任何更改。 - 我知道在本地克隆是最安全的解决方案,但这需要一些额外的努力。 - 我希望有人可以帮助我绕过。
  • +1。我喜欢隐藏的方法。我更喜欢我在回答中提到的克隆方法(当你玩你的 repo 副本时,这种方法不那么令人头疼。)
【解决方案2】:

一个简单的解决方案是:

  • 在本地再次克隆您的存储库
  • 在新克隆中进行实验

这样:

  • 您的原始存储库仍保留在 master 上
  • 你可以在第二个 repo 中随心所欲地做git checkout anOldCommitSHA1

您可以保留在主存储库中并签出您想要的任何较旧的提交,但是:

  • 在此之前执行git stash(以确保隐藏任何正在进行的工作)
  • 之后(再次签出 master 时)执行 git clean -d -f -x 以清理您在使用旧提交工作树时可能生成的任何本地文件。

【讨论】:

  • 谢谢。 - 我目前正在使用这种方法。 - 但我有点懒惰在虚拟主机和主机文件中为克隆项目创建新条目,并且想知道 Git 内部是否有更短的东西,风水方式......
  • 我不使用 repo,我只有一个带有 .git 的工作目录
  • @Mike 一棵工作树,里面有一个.git 文件夹 git repo:你正在使用repo。本地回购。非裸仓库(与没有工作树的裸仓库相反:stackoverflow.com/a/24115534/6309)。
  • @Mike 这意味着我提到的第一个解决方案(克隆本地存储库)不涉及 vhost 和其他网络设置:您可以将本地存储库(本地文件夹)克隆到另一个本地文件夹中。跨度>
  • 好的。 - 著名的。 - 我是 Git 的新手。 - 但 AFAIK 存储只能应用于“跟踪文件”。 - 我标记为不被跟踪的 .gitignore 、 .idea 、 netbeans 等文件呢?
猜你喜欢
  • 1970-01-01
  • 2012-05-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
相关资源
最近更新 更多