使用git checkout和git reset覆盖本地修改

咱们在本地修改文件、或者删除文件后,若是想恢复这些文件内容为git仓库保存的版本,可使用下面几个命令:git

  • git checkout [--] <filepath>:能够恢复尚未执行 git add 的文件,但不能恢复已经执行过 git add 的文件
  • git reset [--] <filepath>:把文件从git的staged区域移除,即取消git add,再使用 git checkout 进行恢复
  • git reset --hard:恢复整个git仓库的文件内容为当前分支的最新版本

git checkout [--] <filepath>

当修改文件内容、或者删除本地文件后,若是尚未执行 git add 命令添加改动,能够执行 git checkout [--] <filepath> 命令来把 filepath 指定的文件恢复成当前git分支的最新版本。对该命令的参数说明以下:shell

  • [--]:表示 -- 是可选参数,该参数用于指定后面跟着的参数只是文件路径,而不是branch分支名或者commit信息。

若是当前有一个branch分支名是 hello.c,且当前目录下有一个 hello.c 文件,那么不加 -- 参数时,git checkout hello.c 表示切换到 hello.c 分支,而不是覆盖 hello.c 文件的改动。这种场景下,必须用 git checkout -- hello.c 指定覆盖 hello.c 文件的改动,-- 参数能够消除歧义。
在没有名称歧义的状况下,能够不提供 -- 参数。例如使用 git checkout hello.c 覆盖 hello.c 文件。bash

  • <filepath>:filepath 指定要被覆盖的文件路径,基于当前shell工做目录进行寻址。例如要覆盖当前目录下 src 子目录的 utils.c 文件,要写为 src/utils.c.

虽然filepath参数提供的文件路径是基于当前shell工做目录进行寻址,但这只是描述文件目录结构关系,并不表明在当前工做目录底下必定存在这个文件。例如删除本地的 src/utils.c 文件后,能够用 git checkout src/utils.c 命令恢复这个文件,可是执行这个命令时,本地并不存在 src/utils.c 文件,执行以后才会从新生成。code

  • 注意:这里的[]表示是可选参数,<>限定非命令选项的参数名,它们都不是参数自身的内容,在输入的时候不要加[]或者<>
  • 在Bash shell下面,. 表示当前目录路径。当不提供 -- 参数、filepath 参数写为 . 时, git checkout . 命令表示覆盖当前目录及其子目录的改动。这是 git checkout 命令经常使用的形式。

注意:当不带有 -- 参数时,在 bash shell 下使用 Tab 键补全,默认只会列出本地分支名、远端分支名、和 git refs,不会列出本地文件名。即,默认没法用 Tab 键来补全文件名,即便当前目录下只有一个文件也没法补全,能够先输入文件名开头的部分,才能用 Tab 键补全。
当带有 -- 参数时,在 bash shell 下使用 Tab 键补全,默认只会列出本地文件名,不会列出分支名和 git refs,方便补全本地文件名。it

git reset

当修改文件内容、或者删除本地文件后,若是已经执行过 git add 命令来添加该文件的改动,那么用 git checkout 命令没法恢复这个文件为当前git分支的最新版本,须要使用下面的 git reset 命令进行处理:class

  • git reset [--] <filepath>:把 filepath 文件从git的staged区域移除,至关于尚未执行 git add 命令。该命令不会恢复文件内容,须要再使用上面描述的 git checkout 命令来恢复文件。

当使用已删除的文件路径做为参数时,git checkout 命令能够不加 -- 参数,可是 git reset 不加 -- 参数会报错,必须使用 -- 来表示后面跟着的是文件路径。例如 hello.c 文件被删除,git checkout hello.c 能够正常恢复该文件,而 git reset hello.c 会报错,git reset -- hello.c 不会报错。file

  • git reset --hard:将整个git仓库的文件都恢复成当前分支的最新版本,会直接恢复文件内容,不须要再执行 git checkout 命令。

该命令不须要传入任何文件路径,默认对git仓库跟踪的工做目录、全部子目录、以及全部文件都生效。例如,当前shell的工做目录位于某个子目录下,要恢复其父目录下的改动,不须要先执行 cd 命令切换到父目录,直接在子目录下执行 git reset --hard 命令就能恢复父目录下的改动。删除文件

相关文章
相关标签/搜索