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

Git签出修订版而不删除未受影响的文件,git,Git,我希望在不删除文件的情况下恢复到以前的版本,其视觉表示形式为: 档案3份 myfile mysecondfile mythirdfile 现在这是当前的origin/master和我的工作副本 我想做的是恢复到以前的版本,比如说DEADBEEF DEADBEEF修订版只有一个文件 myfile 我想做的是用以前的版本覆盖我的本地myfile,而不删除mysecondfile或mythirdfile,如果苏达卡先生的答案不能满足您的要求,恐怕git中没有这种可能性 如果您想让您的主控头指向my

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

档案3份

myfile
mysecondfile
mythirdfile
现在这是当前的
origin/master
和我的工作副本

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

DEADBEEF
修订版只有一个文件

myfile

我想做的是用以前的版本覆盖我的本地
myfile
,而不删除
mysecondfile
mythirdfile
,如果苏达卡先生的答案不能满足您的要求,恐怕git中没有这种可能性

如果您想让您的主控头指向myfile以前的修订版,并保持mysecondfile和mysecondfile当前状态,只需使用git方式,清晰且简单:

  • 将mysecondfile和mythirdfile保存到某个地方
  • 运行git revert[您最新提交的sha-1](可以通过git日志找到sha-1)
  • 将mysecondfile和mythirdfile复制回来,然后进行新的提交

  • 要使用旧提交(以及当前文件)的内容创建新提交,请尝试、和的组合:

    那就承诺吧


    意思是:无需在
    xargs
    中使用shell技巧:git拥有您需要的工具

    • git read tree DEADBEEF
      将从旧提交还原索引(这将使所有其他文件“未跟踪”或“修改”,因为它们不是旧提交的一部分
      DEADBEEF
    • git checkout index-f-a
      将强制工作树反映该索引(同样,不修改不属于索引的文件)
    • git update index-q--refresh
      将确保索引和工作树同步
    最后添加并提交:您将获得所有其他文件以及旧提交的内容。

    解决方案 如果您可以使用
    xargs
    命令行命令,这是一项简单的任务

    $ git ls-tree --name-only -r <tree-ish> . | xargs git checkout <tree-ish> --
    

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

    对于您在此处给出的情况,该命令是

    git checkout deadbeef -- .
    

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

    git checkout deadbeef--myfile
    这很好,但文件名是动态的,我只是用名字来澄清我的问题:你是说文件创建不会影响正在创建的文件?@RobertPounder你说文件名是“动态”是什么意思?您如何确定要保存在版本
    DEADBEEF
    的文件,以及要保存在版本
    origin/master
    的文件?您发布了一个不太优化的苏达卡先生解决方案版本,“如果你不知道该怎么做,我想知道你为什么把这个贴出来作为答案?”罗伯特·庞德,因为我知道没有答案way@RobertPounder:所以你坚持认为有很多种方法(多少是“充足”?3?50?),即使你一种都不知道?我相信有一些方法,但也许你应该在这里提出一些你自己的想法。(我建议您要么放弃运行
    git checkout
    ,要么使用一个git管理的工作树和一个完全独立的非git管理的树来保存文件的联合。)@Robert Pounder我的回答和进一步的评论是:“git没有执行这种操作的特殊命令”。Git有丰富的basis命令集。我几乎可以肯定你可以找到几个不同的命令包,但你不会找到一个可以解决问题的命令。也许有更好的方法,我不确定我的答案是否是最好的。但这很清楚,它解决了你的问题。虽然可能有或者没有其他方法,但@SergeyVoitovich建议的方法几乎肯定是最简单的。你不太可能再次遇到这样的情况,既然你可以用这种方法快速解决问题,为什么还要花几个小时来寻找“正确”的方法呢?这也是一个很好的解决方案,对不起,我不能给你两次赏金:(@RobertPounder没问题,我只是不明白你选的那一个。我试过了,它适合我的需要,我试过了,它也满足了我的需要,而且解释说不需要我改变网站帮助他获得了悬赏,以备将来参考
    $ git diff --staged -R
    
    git checkout deadbeef -- .