Git签出修订版而不删除未受影响的文件
我希望在不删除文件的情况下恢复到以前的版本,其视觉表示形式为: 档案3份Git签出修订版而不删除未受影响的文件,git,Git,我希望在不删除文件的情况下恢复到以前的版本,其视觉表示形式为: 档案3份 myfile mysecondfile mythirdfile 现在这是当前的origin/master和我的工作副本 我想做的是恢复到以前的版本,比如说DEADBEEF DEADBEEF修订版只有一个文件 myfile 我想做的是用以前的版本覆盖我的本地myfile,而不删除mysecondfile或mythirdfile,如果苏达卡先生的答案不能满足您的要求,恐怕git中没有这种可能性 如果您想让您的主控头指向my
myfile
mysecondfile
mythirdfile
现在这是当前的origin/master
和我的工作副本
我想做的是恢复到以前的版本,比如说DEADBEEF
DEADBEEF
修订版只有一个文件
myfile
我想做的是用以前的版本覆盖我的本地
myfile
,而不删除mysecondfile
或mythirdfile
,如果苏达卡先生的答案不能满足您的要求,恐怕git中没有这种可能性
如果您想让您的主控头指向myfile以前的修订版,并保持mysecondfile和mysecondfile当前状态,只需使用git方式,清晰且简单:
要使用旧提交(以及当前文件)的内容创建新提交,请尝试、和的组合: 那就承诺吧
意思是:无需在
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 -- .