我如何将修改的文件转换为以前的修订,在一个特定的 commit hash (我通过 git log 和 git diff 确定)?


当前回答

但是,请注意, 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

(第二个添加步骤是指数中的文件,但它不会被承诺。

Git checkout./foo 是指从指数中转向./foo 路径; 添加 HEAD 指示 Git 将指数中的路径转向其 HEAD 修订之前。

其他回答

下面是Rebase如何工作:

git checkout <我的分支> git rebase 主 git checkout 主 git merge <我的分支>


假设你有

───────────────────

... 查看你想向大师分支申请的变革分支。 退缩命令从 <我的分支>(不在大师中找到)采取命令,并将其重新应用到大师的头部。 换句话说,在 <我的分支>中的第一个命令的父母不再是大师历史中的先前命令,而是当前大师的头部。

git rebase master <my branch>

这可能更容易记住这个命令,因为“基础”和“修改”分支都明确。

历史的最终结果是:

────────────────────


git checkout master
git merge <my branch>

...做一个快速前进的合并,将所有 <我的分支> 变更应用于主人. 没有这个步骤,退缩承诺不会添加到主人. 最终结果是:

───────────────────

git branch -d <my branch>

有趣的是, 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 和 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

(第二个添加步骤是指数中的文件,但它不会被承诺。

Git checkout./foo 是指从指数中转向./foo 路径; 添加 HEAD 指示 Git 将指数中的路径转向其 HEAD 修订之前。

要回到最后一个承诺的版本,这是最常用的,你可以使用这个更简单的命令。

git checkout HEAD file/to/restore

首页 > 首页 > 目标文件

git reset HEAD path_to_file

第二次检查该文件

git checkout -- path_to_file