如何安全查询历史记录?

How to check out history safely?

在大多数情况下,检查以前的提交是安全的。但是由于 .gitIgnore 也是版本控制的,检查旧版本的 .gitIgnore 的旧提交可能会产生严重的副作用。

假设我们最新的提交包括以下文件:

由于 git 忽略 config.properties 恢复到较旧的提交将保持 config.properties 不变。 但是由于旧的提交不会忽略 config.properties 它现在显示为一个添加的文件。

为了再次检查最新的提交,可以:

每一个都不理想。每个都有副作用。

提交文件或忽略文件(更新 .gitignore)创建一个新头。 删除文件或存储它们将删除我们的版本控制的那些文件。这意味着当返回到我们最新的提交时,这些文件将会丢失。

检出之前提交的最安全方法是什么?

恕我直言,问题是,在您的情况下,git checkout 本身可能会默默地覆盖所述文件的内容。

以下面的例子为例,其中 config.properties 实际上是在您历史记录的某个时间点被跟踪的:

  1. commit 1 : config.properties 在 repo
  2. 中添加并提交
  3. commit 2 : config.properties 被删除,并在 .gitignore
  4. 中添加一行
  5. 在您的磁盘上,您创建了一个本地 config.properties,它被 git
  6. 忽略了

如果从第 3 步开始,您 运行 git checkout <commit 1>,git 将用 commit 1 中存储的内容覆盖 config.properties 的内容。


如果这种情况可能会在您的回购协议中触发,我建议的最安全的操作顺序是:

  • 运行git stash -a运行宁git checkout

git stash -a 是一个快速的一行,也许有些文件你也不想隐藏(比如:obj/ 目录),你可以 select 文件你想包括在那个藏匿处:

git stash push -a -- config.properties config/

# 'push' can be omitted :
git stash -a -- config.properties config/

如果您担心工作目录发生任何变化,只需使用 git worktree

git worktree add ../<new dir> <sha or branch>

编辑: 抱歉,我记错了最好检查 docs

的语法