Git - temporarily switch between
我已经查过了:临时将工作副本切换到特定的Git提交是否可以在Git提交之间切换?Git在提交之间切换但是,我想整理出一个具体的主题:
我现在不在一个团队工作,
我使用Git在本地保存我的项目历史(没有GitHub或BitBucket),并且只有主分支,
在项目结束之前,我不会将我的提交推到工作目录中的.git之外。我的问题很简单:
我怎样才能安全地返回到以前的一个提交(有点像时间机器),而不考虑破坏现有的树索引?
如何确保在这个特定提交之后添加的文件在这个实验期间不会出现在工作目录中?
然后我如何才能安全地返回到树的头部并再次确保在过去的特定提交(很久以前,不是现在)之后删除的文件不会出现在工作目录中?
我问这个问题的原因很简单:我现在正在学习,因此我想不时回来看看(只读)-过去发生了什么(比如一个月前)。
谢谢您。
- git checkout如何不能满足您的需求?
- 它不会删除工作目录中在此特定提交之后添加的文件,afaik
- @迈克:是的。它不会删除未跟踪的文件,但如果跟踪的文件在早期提交中不存在,则会将其删除。
- 好啊。-注意。-我标记为不被跟踪的.gitignore、.idea、netbeans等文件呢?-不拖拉,只是提问。
- @Mike.GitIgnore被跟踪。另一个,如果没有追踪,默认情况下不会被触碰(或者你可以应用Chris Martin的解决方案)
- @这里没有什么特别的。它可以被跟踪,也可以不被跟踪,其行为与git checkout上的所有其他文件相同。
我想这就是你想要的。
1 2 3 4 5
| git stash --include-untracked
git checkout <commit>
git checkout master
git stash pop --index |
对于一个完全干净的工作树,可以用--all替换--include-untracked,以存储忽略的文件。
- 1。是否表示"git reflog"的结果是什么?-比如"24B7ECB"?2。"git stash——include untracked"的结果会变成树的头吗?
- 对不起,"refspec"是个错误的词(意思是其他的)。将其更改为"提交"。它可以是一个提交哈希(就像您在git reflog中看到的那样,是的,但在git log中更常见)、标记名或分支名。
- @迈克,不,藏匿不会造成承诺。我想手册页可以解释藏匿的东西比我强。"要记录工作目录和索引的当前状态,但要返回到干净的工作目录时,请使用git stash。……"
- 我刚看过Stashing做了什么,这可能不是我想要的。-想象一下:这个项目一个月前就完成了。没有什么可以更改、添加或提交的。-我只想回到一个特定的状态,看看它是什么样的,然后回到大脑。-因此,在所有的实验之后,工作目录和Git树都不需要进行任何更改。-我知道在本地克隆是最安全的解决方案,但这需要付出一些额外的努力。-我希望有人能帮我搭桥。
- + 1。我喜欢藏东西的方法。我更喜欢我在回答中提到的克隆方法(当你在你的repo副本中玩的时候,用这种方法就不那么头痛了。)
- @迈克,对保存的东西感到如此强烈,以至于你无意承诺,这是非常奇怪的。但斯塔什就是这么做的。它有什么错?
- 我觉得这里有点误会。-我真的不想冒犯任何人。-我只是没有任何我以后想承诺的事情,但现在我必须做。-事实并非如此。-我想在工作目录快照之间跳转。-不关心在以前的快照和当前快照之间创建或删除的文件。就是这样。
- 你拉?我以为你没有遥控器!我现在更困惑了。
- 错误的例子。对不起的。将继续克隆我的工作目录,并在那里试验"git结帐"。看来我想从吉特那里得到它不能做的。感谢大家的参与,祝大家周末愉快。
一个简单的解决方案是:
这样:
- 您的原始回购仍保留在master上
- 在第二次回购中,您可以按照自己的意愿执行git checkout anOldCommitSHA1。
您可以保留在主回购中,并签出您想要的任何旧的承诺,但:
- 以前做过一次git stash(以确保任何正在进行的工作都被藏起来了)
- 在(再次签出master时)之后执行git clean -d -f -x以清除在使用旧的提交工作树时可能生成的任何本地文件。
- 谢谢。-我目前正在使用这种方法。-但我有点懒惰,在vhosts中创建新的条目,并为克隆项目托管文件,我想知道在Git、风水路内部是否存在较短的条目…
- @迈克,好的,我已经编辑了答案。
- 我不使用repo,我只有一个包含.git的工作目录
- @Mike一个在里面有.git文件夹的工作树是一个git repo:您使用的是repo。本地回购。非裸回购(与没有工作树的裸回购相反:stackoverflow.com/a/24115534/6309)。
- @Mike这意味着我提到的第一个解决方案(克隆本地repo)不涉及vhost和其他网络设置:您可以将本地repo(本地文件夹)克隆到另一个本地文件夹中。
- 好啊。-注意。-我是吉特的新手。-但Afaik存储只能应用于"跟踪文件"。-我标记为不被跟踪的.gitignore、.idea、netbeans等文件呢?
- @迈克,你读过克里斯的回答吗,尤其是《江户记》的一部分?(git scm.com/docs/git存储)
- @Mike Jeeze,我觉得你不想接触被忽略的文件…但是如果你使用--all标志,stash也可以做到这一点。