重置或恢复使用Git的特定修订的特定文件?

我已经对作为一组文件的一部分提交了几次的文件进行了一些更改,但是现在想要将其上的改变重置/恢复到以前的版本。

我已经做了一个git log以及一个git diff来find我需要的修订版本,但是不知道如何让文件恢复到之前的状态。

假设你想要的提交的散列是c5f567

 git checkout c5f567 -- file1/to/restore file2/to/restore 

git checkout主页提供了更多信息。

如果你想恢复在c5f567之前c5f567一次提交的c5f567 ,把提交哈希作为c5f567~1

 git checkout c5f567~1 -- file1/to/restore file2/to/restore 

作为一个侧面说明,我一直对这个命令感到不舒服,因为它用于普通的事情(在分支之间转换)和非常的破坏性的事情(丢弃工作目录中的改变)。

您可以使用diff命令快速查看对文件所做的更改:

 git diff <commit hash> <filename> 

然后,要将特定的文件恢复到该提交,请使用reset命令:

 git reset <commit hash> <filename> 

如果您有本地修改,则可能需要使用--hard选项。

pipe理航点的良好工作stream程是使用标签在您的时间轴上清晰地标记点。 我不能理解你的最后一句话,但你可能想要的是从以前的时间点分歧的分支。 要做到这一点,使用方便的结帐命令:

 git checkout <commit hash> git checkout -b <new branch name> 

当你准备好合并这些改变时,你可以将它与你的主线重新绑定:

 git checkout <my branch> git rebase master git checkout master git merge <my branch> 

你可以使用任何对git commit的引用,包括SHA-1(如果最方便的话)。 问题是这个命令是这样的:

git checkout [commit-ref] -- [filename]

 git checkout -- foo 

这会将foo重置为HEAD。 你也可以:

 git checkout HEAD^ foo 

一次修改回来等

为了恢复最常用的版本,可以使用这个更简单的命令。

 git checkout HEAD file/to/restore 

我刚刚有同样的问题,我发现这个答案最容易理解( commit-ref是你想要回到日志的变化的SHA值):

 git checkout [commit-ref] [filename] 

这将把旧的版本放在你的工作目录中,如果你愿意的话,你可以提交它。

如果您知道需要返回多less次提交,则可以使用:

 git checkout master~5 image.png 

这假定你在master分支,并且你想要的版本是5提交。

我想我已经find了….从http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html

有时候,你只是想回过头去忘记每一个过去某个点的变化,因为它们都是错的。

从…开始:

$ git log

其中显示了最近提交的列表以及它们的SHA1哈希值。

接下来,键入:

$ git reset --hard SHA1_HASH

将状态恢复到给定的提交并从logging中永久删除所有较新的提交。

这对我工作:

 git checkout <commit hash> file 

然后提交更改:

 git commit -a 

当你说“回滚”时你必须小心。 如果你曾经有一个版本的文件在提交$ A,然后在两个单独的提交$ B和$ C(所以你看到的是文件的第三个迭代)做了两个更改,如果你说“我想回滚到第一个“,你真的是这个意思吗?

如果你想摆脱第二次和第三次迭代的变化,这很简单:

 $ git checkout $A file 

然后你提交结果。 该命令询问“我想从提交$ Alogging的状态检出文件”。

另一方面,你的意思是摆脱引入的第二次迭代(即提交$ B)的变化,同时保持提交$ C做了什么文件,你会想要恢复$ B

 $ git revert $B 

请注意,创build提交$ B的人可能没有受到严格的处罚,并且可能在同一提交中提交了完全不相关的更改,并且此恢复可能会触及文件以外的其他文件 ,因此您可能需要在执行操作后仔细检查结果所以。

有趣的是,如果工作副本位于名为foo的目录中,“git checkout foo”将不起作用; 然而,'git checkout HEAD foo'和'git checkout ./foo'将会:

 $ pwd /Users/aaron/Documents/work/foo $ git checkout foo D foo Already on "foo" $ git checkout ./foo $ git checkout HEAD foo 

以下是rebase工作原理:

 git checkout <my branch> git rebase master git checkout master git merge <my branch> 

假设你有

 ---o----o----o----o master \---A----B <my branch> 

前两个命令…提交git checkout git rebase master

…检出您要应用到master分支的更改分支。 rebase命令从<my branch>提交(在master找不到),并将其重新应用到master的头部。 换句话说, <my branch>中的第一个提交的父代不再是master历史中的前一个提交,而是当前的master 。 这两个命令是一样的:

 git rebase master <my branch> 

记住这个命令可能更容易,因为“基本”和“修改”分支都是显式的。

。 最终的历史结果是:

 ---o----o----o----o master \----A'----B' <my branch> 

最后两个命令…

 git checkout master git merge <my branch> 

…做一个快进合并,将所有的<my branch>更改应用到master 。 没有这一步,rebase提交不会被添加到master 。 最终的结果是:

 ---o----o----o----o----A'----B' master, <my branch> 

master<my branch>两个参考B' 。 另外,从这个angular度来说,删除<my branch>引用是安全的。

 git branch -d <my branch> 

我必须在这里插入EasyGit ,这是一个包装,使git更容易接近新手,而不会混淆经验丰富的用户。 它所做的一件事就是给git revert更多的意义 。 在这种情况下,你会简单地说:

eg revert foo/bar foo/baz

git-aliases,awk和shell-functions来拯救!

 git prevision <N> <filename> 

其中<N>是文件<filename>回滚文件的修订版本号。
例如,要检出单个文件x/y/zc前一版本,请运行

 git prevision -1 x/y/zc 

git预览如何工作?

将以下内容添加到你的gitconfig

 [alias] prevision = "!f() { git checkout `git log --oneline $2 | awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f" 

基本上这个命令

  • 在指定的文件上执行git log
  • 在文件的历史logging中select适当的commit-id
  • 对指定文件的commit-id执行git checkout

从本质上讲,在这种情况下,
包裹在一个漂亮,高效的git-alias- git-prevision中

但是请注意, git checkout ./foogit checkout HEAD ./foo并不完全相同 , 例如:

 $ echo A > foo $ git add foo $ git commit -m 'A' foo Created commit a1f085f: A 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 foo $ echo B >> foo $ git add foo $ echo C >> foo $ cat foo A B C $ git checkout ./foo $ cat foo A B $ git checkout HEAD ./foo $ cat foo A 

(第二个add阶段的文件在索引中,但它没有提交。)

Git checkout ./foo表示从索引恢复path./foo ; 添加HEAD指示Git将索引中的path恢复为其HEAD修订版。

如果您想要将文件恢复到之前的提交(以及要恢复的文件已经提交),则可以使用

 git checkout HEAD^1 path/to/file 

要么

 git checkout HEAD~1 path/to/file 

然后只是阶段和提交“新”版本。

在知道一个提交可以在合并的情况下有两个父母的知识的情况下,应该知道HEAD ^ 1是第一个父代,HEAD_1是第二个父代。

如果树中只有一个父节点,它们将工作。

为了转到先前的文件提交版本,获取提交号码,然后说eb917a1

 git checkout eb917a1 YourFileName 

如果你只需要回到最后一个提交的版本

 git reset HEAD YourFileName git checkout YourFileName 

这将简单地带你到文件的最后提交状态

git checkout ref | commitHash – filePath

例如

 git checkout HEAD~5 -- foo.bar or git checkout 048ee28 -- foo.bar 

使用git log来获取特定版本的哈希键,然后使用git checkout <hashkey>

注意:不要忘记在最后一个之前input散列。 最后一个散列指出你的当前位置(HEAD)并且不改变。

显然有人需要写一本关于git的可理解的书,或者需要在文档中更好地解释git。 面对这个同样的问题,我猜到了

 cd <working copy> git revert master 

将撤消似乎要做的最后一次提交。

伊恩

这里提供了很多build议,大部分是git checkout $revision -- $file 。 几个晦涩的select:

 git show $revision:$file > $file 

而且,我只是暂时看这个版本,

 git show $revision:$file | less 

要么

 git show $revision:$file | vim -R - 

(OBS: $file需要以./为前缀,如果它是git show $revision:$file的相对path)

而更奇怪的是:

 git archive $revision $file | tar -x0 > $file 

对我来说,没有一个答案似乎很清楚,所以我想添加我的看起来超级简单。

我有一个提交abc1后,我已经做了几个(或一个修改)文件file.txt

现在说我搞砸了文件file.txt东西,我想回到以前的提交abc1

1. git checkout file.txt :这将删除本地的变化,如果你不需要它们

2. git checkout abc1 file.txt :这将把你的文件到你想要的版本

3. git commit -m "Restored file.txt to version abc1" :这会提交你的git commit -m "Restored file.txt to version abc1"

  1. git push :这将推送远程存储库上的所有内容

当然,在第二步和第三步之间你可以做git status来理解正在发生的事情。 通常你应该看到已经添加的file.txt ,这就是为什么不需要git add

首先重置目标文件头

 git reset HEAD path_to_file 

第二个签出该文件

 git checkout -- path_to_file 
 git revert <hash> 

将恢复给定的提交。 这听起来像你认为git revert只影响最近的提交。

这不能解决你的问题,如果你想恢复一个特定的文件的变化,并提交更改超过该文件。

这里有很多答案声称使用git reset ... <file>或者git checkout ... <file>但是这样做,你将会放弃在你想恢复的提交之后提交的<file>所有修改。

如果你想恢复从一个单一的文件提交更改,就像git revert只会做一个文件(或说一个提交文件的子集),我build议同时使用git diffgit apply像那样(用<sha> =要恢复的提交的哈希):

 git diff <sha>^ <sha> path/to/file.ext | git apply -R 

基本上,它会首先生成一个相应于要恢复的更改的补丁,然后反向应用该补丁来删除这些更改。

当然,如果已经通过<sha1>HEAD (冲突)之间的任何提交修改了回复的行,它将不起作用。

如果你正在使用Git扩展,你只想恢复到文件的父提交,你可以select包含你想要恢复的更改的提交,然后在详细信息窗格中select“Diff”选项卡,右键单击你要恢复的文件,然后'重置文件到',然后'A'(父)

这是我的方式。

a)在Android Studio中,打开文件。

b)git – >显示历史logging,find我想要恢复的以前的提交。 获取commit_id(即提交哈希)。

c) git checkout commit_id file_path