我希望在不删除文件的情况下恢复到以前的版本,可视化表示为:
3个文件;
myfile
mysecondfile
mythirdfile
现在这是origin/master
和我的工作副本。
我想要做的是恢复到之前的版本,比如说DEADBEEF
,
DEADBEEF
版本只有一个文件;
myfile
我想要做的是使用之前的修订版覆盖我的本地myfile
而不删除mysecondfile
或mythirdfile
。
答案 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-tree
,git checkout-index
和git 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即可方式,简单明了: