使用GIT还原一个文件的部分代码

问题描述 投票:0回答:1

我正在处理Python脚本。我经常将更改提交到我的Git / GitHub存储库。现在,我面临的情况是我需要还原文件的某些部分。我在一些提交中介绍了这些更改。

还原一个特定文件的部分代码的最佳方法是什么?

git github
1个回答
0
投票

您要求best方式;不一定有最好的方法。不过,有很多方法可以实现您的目标。

首先,请记住,Git在您使用的级别上存储的是commits。每个提交都包含文件all的完整和完整的快照。当您使用git checkout(或在Git 2.23或更高版本中为git switch)时,通常通过选择一些commit(通常使用分支名称)来执行此操作。这将提取所有文件的快照。您现在可以使用every文件的那个版本这意味着切换到以前的版本非常容易,但是仅当您希望

every

文件来自该以前的版本时。首先,您可以选择所需的特定提交(也许通过运行git log并查看每个提交直到找到所需的提交),然后使用其唯一的哈希ID将其检出:git checkout a123456

或:

git switch a123456

假定缩写的提交哈希为a123456。 (如果您使用鼠标剪切和粘贴哈希ID,则只需抓取并粘贴整个对象即可。)这基本上可以使您“及时”回到特定的提交。要返回“当前时间”,您只需使用git checkout mastergit switch feature或其他命令返回分支提示提交(同样,如果您使用的是Git 2.23或更高版本,则使用git switch;如果是,则使用git checkout较旧的Git,或者您只喜欢使用较旧的命令)。

但是这不是您想要的。这样会将

all

文件恢复到该版本。您只想将一个文件的一部分恢复到该版本。所以现在您有很多选择。一个可能是最适合您的。在接下来的几节中,请记住:

每个提交都具有所有文件的完整快照。 Git提供了用于处理这些快照的tools

某些作业最好使用某些特定的工具完成,有时您可以滥用该工具以取得良好的效果,例如,使用平口螺丝刀作为凿子,但是right工具将使其变得更容易。考虑使用git revert

git revert命令本质上是[[1

]将提交与它的直接父提交进行比较,找出发生了什么[[changed和

un-does

的更改。由于您已经进行了许多小的提交,因此如果您比较在更改代码部分的提交与提交之间进行比较,则可能要更改的代码[[back就是您更改的only在此之前。如果是这样,git revert <hash>将撤消该更改,并从结果中进行新的提交。使用一个简单的Git命令,您将完全拥有所需的内容。如果您已提交所做的更改大于您想要的更改,则您仍然可以使用git revert。使用git revert -n,Git会将每个“撤消”应用于该提交中已更改的每个文件,但实际上不会

commit

撤消。然后,您可以修复所需的任何内容,包括使用git checkout HEAD -- path撤消对任何特定文件的撤消。

2

显然,此操作比执行所有操作的还原操作要多,但仍可能是采用该操作的有用方法。 “退出提交”工具。
1我说基本上是因为,在内部,Git使用其
合并引擎
进行还原工作。这意味着您可以在进行还原时获得

合并冲突

。如果您确实得到了一个,并且不想处理它,则可以使用git revert --abort撤消还原尝试,并将所有内容恢复到开始时的状态。
请注意,要使git revert --abort正常工作,您需要使用[clean]设置start还原。但是,普通的git revert仍然需要这样做。另一方面,git revert -n并非如此,因此在使用git revert -n进行干净设置时要特别小心-其中git status表示nothing to commit, working tree clean2在Git 2.23和更高版本中,可以根据需要使用git restoregit checkout HEAD --方法仍然有效。

考虑使用git checkout -p

如果您已找到具有所需代码版本的快照(any快照),则可以运行:


git checkout -p <hash> -- <path>

具有Git

compare名为path的文件的版本与

hash所标识的快照中的文件的版本。也就是说,git checkout -p将文件的提交版本提取到临时区域,然后运行git diff比较临时副本与常规工作树区域中的副本。然后,对于此git diff显示的每个更改,Git将提供使工作树副本看起来像已提交副本的样子。

您现在可以告诉Git仅接受所需的差异(变更的一部分),而不接受其他部分。请注意,此过程是非常互动的:它通常需要大量的时间。

考虑使用git show同样,每次提交都保存所有文件的完整快照。但是,如果您只想look at并可能保存在其他文件中,则一次提交的

one

文件的内容呢? git show命令可以执行此操作:

git show <hash>:<path>

如通过寻呼机显示的那样,显示由path

标识的提交中名为hash的文件的提交副本。您可以使用外壳程序的重定向操作:
git show <hash>:path/to/file.ext > path/to/file.ext.old

将全部内容转储到文件中。请注意,如果您位于子目录中,例如path/to,则可能需要:

git show <hash>:path/to/file.ext > file.ext.old 或:
git show <hash>:./file.ext > file.ext.old

作为完成此任务的一种较短方法(使用完整路径首先需要cd-进入存储库的顶层)。

现在,您具有该文件的特定版本,并且可以在该文件的当前版本和旧版本上使用任何喜欢的工具,例如您的日常文件编辑器。
© www.soinside.com 2019 - 2024. All rights reserved.