重置或恢复使用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 ./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
表示从索引恢复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"
。
-
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 diff
和git 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