Git签出修订版而不删除未受影响的文件

时间:2016-12-02 10:51:46

标签: git

我希望在不删除文件的情况下恢复到以前的版本,可视化表示为:

3个文件;

myfile
mysecondfile
mythirdfile

现在这是origin/master和我的工作副本。

我想要做的是恢复到之前的版本,比如说DEADBEEF

DEADBEEF版本只有一个文件;

myfile

我想要做的是使用之前的修订版覆盖我的本地myfile而不删除mysecondfilemythirdfile

4 个答案:

答案 0 :(得分:6)

首先解决方案

如果您可以使用Date命令行命令,这是一项简单的任务。

xargs

使用的命令细分

  • git ls-tree将列出树对象的内容 这意味着它将显示某个提交时存储库中存在的所有文件
    • $ git ls-tree --name-only -r <tree-ish> . | xargs git checkout <tree-ish> -- 会将输出限制为(相对,使用--name-only绝对路径)文件路径
    • --full-name将递归显示所有文件
  • -r会将一个命令的输出传递给下一个
  • 此处使用
  • |xargs的结果作为ls-tree的参数
  • git checkout <tree-ish> --将(以此形式)来自给定git checkout的结帐文件而不更改分支

奖励:显示您在这些文件中更改的内容

要查看自tree-ish使用以来所做的更改:

<tree-ish>

如果在没有$ git diff --staged -R 的情况下使用该命令,您会看到更改,就像您将所有内容更改为旧状态一样。

答案 1 :(得分:3)

要使用旧提交的内容(以及您当前的文件)创建新提交,请尝试git read-treegit checkout-indexgit update-index的组合:

git read-tree DEADBEEF 
git checkout-index -f -a
git update-index -q --refresh

然后提交。

含义:不需要使用xargs的shell技巧:git拥有你需要的工具。

  • git read-tree DEADBEEF将从旧提交中恢复索引(这将使所有其他文件“未跟踪”或“已修改”,因为它们不属于旧提交DEADBEEF
  • git checkout-index -f -a将强制工作树反映该索引(同样,不修改不属于索引的文件)
  • git update-index -q --refresh将确保索引和工作树同步。

最后添加并提交:您将获得所有其他文件以及旧提交的内容。

答案 2 :(得分:2)

对于你在那里给出的情况,命令是

git checkout deadbeef -- .

将commit deadbeef中的每个文件重置为该提交的内容。

答案 3 :(得分:-1)

如果mr_sudaca的回答并不能满足你的愿望,我担心git中没有这种可能性。

如果您希望将主HEAD指向 myfile 以前的版本并保留 mysecondfile mythirdfile 当前状态 - 只需将其设为git即可方式,简单明了:

  1. 在某处保存 mysecondfile mythirdfile
  2. 运行git revert [你最新提交sha-1](sha-1可以通过git log找到)
  3. mysecondfile mythirdfile 复制回来,然后进行新的提交。