Answers:
假设所需的提交哈希为c5f567
:
git checkout c5f567 -- file1/to/restore file2/to/restore
在git的结帐手册页提供了更多的信息。
如果您想还原到c5f567
,append 之前的提交~1
(其中1是您要返回的提交数,则可以是任意值):
git checkout c5f567~1 -- file1/to/restore file2/to/restore
附带说明一下,对于该命令,我一直感到不舒服,因为它既用于普通事物(在分支之间切换)又用于异常,破坏性的事物(丢弃工作目录中的更改)。
develop
),则需要git checkout develop -- file/to/restore
(注意双破折号)
您可以使用diff命令快速查看对文件所做的更改:
git diff <commit hash> <filename>
然后要将特定文件还原到该提交,请使用reset命令:
git reset <commit hash> <filename>
--hard
如果您进行了本地修改,则可能需要使用该选项。
管理航点的一个很好的工作流程是使用标签在时间轴中标记清楚。我不太理解您的最后一句话,但是您可能想要的是将分支与上一个时间点分开。为此,请使用方便的checkout命令:
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 checkout <commit hash> <filename>
对我来说比git reset
git checkout <commit hash> <filename>
为我工作。恕我直言,这不是公认的答案。 git reset
没有。
git reset
重置单个文件,您将收到一个错误fatal: Cannot do hard reset with paths
git reset --hard <commit hash> <filename>
。这将与fatal: Cannot do hard reset with paths.
Motti Strom所说的错误:使用git checkout <commit hash> <filename>
您可以使用对git commit的任何引用,如果方便的话可以使用SHA-1。关键是该命令如下所示:
git checkout [commit-ref] -- [filename]
--
与没有答案的答案有什么区别?
rm
命令就会使用getopt(3)解析其参数。getopt
是解析命令参数的命令。gnu.org/software/libc/manual/html_node/Getopt.html
git checkout -- foo
那将重置foo
为HEAD。你也可以:
git checkout HEAD^ foo
一回修订等
git checkout -- foo
如果foo
有特殊之处(例如目录或称为的文件-f
),我建议使用语法来避免任何错误。如果不确定,请使用git始终为所有文件和目录添加特殊参数--
。
--
不是git命令,并且不是git专用的。它是内置的bash,用于表示命令选项的结尾。您也可以将其与许多其他bash命令一起使用。
--
是不是在bash一个内置特殊的词。但这是许多命令行解析器支持的通用约定,并且由许多CLI(包括git)使用。
要恢复到最常用的最后提交版本,可以使用此更简单的命令。
git checkout HEAD file/to/restore
我想我已经找到了....来自http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html
有时您只是想回去,忘记经过某个特定点的所有更改,因为它们都是错误的。
从...开始:
$ git log
它显示了最近提交及其SHA1哈希的列表。
接下来,键入:
$ git reset --hard SHA1_HASH
将状态恢复为给定的提交,并从记录中永久删除所有较新的提交。
git push --force
说“回滚”时必须小心。如果您以前在$ A提交中拥有文件的一个版本,然后又在$ B和$ C的两个单独提交中进行了两次更改(那么您看到的是文件的第三次迭代),并且如果您说“我想回滚到第一个”,您是真的吗?
如果要摆脱第二次和第三次迭代的更改,这非常简单:
$ git checkout $A file
然后提交结果。命令询问“我要从提交$ A记录的状态中检出文件”。
另一方面,您的意思是摆脱第二次迭代(即提交$ B)带来的更改,同时保留提交$ C对文件所做的操作,您希望还原$ B
$ git revert $B
请注意,无论谁创建的提交$ B可能都没有受到严格的纪律,并且可能在同一提交中提交了完全不相关的更改,并且此还原可能会涉及您看到有问题的更改以外的文件,因此您可能需要在执行后仔细检查结果所以。
有趣的是,git checkout foo
如果工作副本位于一个名为的目录中,它将不起作用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
git checkout -- 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'
。同样,从这一点来看,删除<my branch>
引用是安全的。
git branch -d <my branch>
从git v2.23.0开始,有一个新的git restore方法,该方法应该假定是其中的一部分git checkout
(即使已接受的答案git checkout
也很令人困惑)。在github博客上查看更改的要点。
该命令的默认行为是使用来自source
参数的内容(在您的情况下为提交哈希)恢复工作树的状态。
因此,根据Greg Hewgill的答案(假设commit hash为c5f567
),该命令将如下所示:
git restore --source=c5f567 file1/to/restore file2/to/restore
或者,如果您想还原到c5f567之前的一次提交的内容,请执行以下操作:
git restore --source=c5f567~1 file1/to/restore file2/to/restore
目标文件的第一个重置头
git reset HEAD path_to_file
第二次结帐该文件
git checkout -- path_to_file
git-aliases,awk和shell函数可以解救!
git prevision <N> <filename>
其中<N>
是要回滚给file的文件修订版本号<filename>
。
例如,要签出单个文件的前一修订版本x/y/z.c
,请运行
git prevision -1 x/y/z.c
将以下内容添加到您的 gitconfig
[alias]
prevision = "!f() { git checkout `git log --oneline $2 | awk -v commit="$1" 'FNR == -commit+1 {print $1}'` $2;} ;f"
基本命令
git log
对指定的文件 执行- 在文件的历史记录中选择适当的提交ID,然后
git checkout
对指定文件执行commit-id。
本质上,在这种情况下,所有需要手动执行的操作都将
打包成一个漂亮而有效的git-alias- git-prevision
我必须插入EasyGit此处,这是一个包装,可以使git对新手更易于使用,而又不会使经验丰富的用户感到困惑。它做的一件事是赋予git revert
。在这种情况下,您只需说:
eg revert foo/bar foo/baz
这里有很多建议,大部分与相似git checkout $revision -- $file
。几个晦涩的替代方案:
git show $revision:$file > $file
而且,我经常使用它只是为了临时查看特定版本:
git show $revision:$file
要么
git show $revision:$file | vim -R -
(OBS:如果是相对路径$file
,./
则必须加上前缀git show $revision:$file
)
更奇怪的是:
git archive $revision $file | tar -x0 > $file
但是请注意,git checkout ./foo
与git 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
表示./foo
从索引恢复路径; 添加HEAD
指示Git HEAD
在执行此操作之前将索引中的路径还原为其
修订版本。
对我而言,没有一个答案似乎很明确,因此我想补充一下,这似乎超级容易。
我有一个提交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 push
:这会将所有内容推送到远程存储库中 当然,在第2步和第3步之间,您可以git status
了解发生了什么。通常,您应该看到file.txt
已经添加的内容,这就是为什么不需要的原因git add
。
git checkout Last_Stable_commit_Number -- fileName
2. Git将文件还原到特定分支
git checkout branchName_Which_Has_stable_Commit fileName
这里有很多答案都声称要使用git reset ... <file>
,git checkout ... <file>
但是这样做,您将在<file>
要还原的提交之后失去对提交的所有修改。
如果你想恢复的变化,从一个在单个文件提交而已,就像git revert
会做,但只有一个文件(或说的一个子集提交文件),我建议同时使用git diff
,并git apply
像(与<sha>
的=散列提交您要还原的内容):
git diff <sha>^ <sha> path/to/file.ext | git apply -R
基本上,它将首先生成与您要还原的更改相对应的补丁,然后反向应用该补丁以删除这些更改。
当然,如果通过(<sha1>
和HEAD
)之间的任何提交修改了还原行,则该行将不起作用。
git show -p <sha> path/to/file.ext|git apply -R
<sha>^!
代替<sha>^ <sha>
使用git log
以获得特定的版本,然后使用哈希键git checkout <hashkey>
注意:不要忘记在最后一个字符之前输入哈希值。最后一个哈希点指向您当前的位置(HEAD),并且保持不变。
显然,有人需要编写有关git的可理解书籍,或者需要在文档中对git进行更好的解释。面对同样的问题,我猜想
cd <working copy>
git revert master
将撤消似乎正在执行的最后一次提交。
伊恩
您可以通过4个步骤进行操作:
您需要在终端中输入什么:
git revert <commit_hash>
git reset HEAD~1
git add <file_i_want_to_revert>
&& git commit -m 'reverting file'
git checkout .
祝好运
git-revert
只能对整个仓库进行操作,因此要进行补偿,我们必须撤消其他所有事务。
git revert --no-commit <commit_hash>
2. git reset HEAD
这样可以节省额外的提交,并且仅在您的工作目录中进行所有更改。
git revert _oldcommit_ --no-commit
git reset -- _unchanged1_ _unchanged2_ ...
git commit -m "branch without changes to specific files"
新的分支提示反映了除还原文件以外的所有更改。
--cached
检查时不要忘记git diff
。 链接