Git undoing changes.

2020/11/14

Three trees

先来看下整体结构:

首先,你需要了解Git中存在三棵树,分别是Working Directory, Staging IndexCommit History

其中Working Directory就是当前的你的工作环境,当你在本地做了任何改动:

此时你就可以使用add命令将其添加到Staging Index中:

然后,你可以继续使用commit命令将其添加到Commit History中:

checkout

然后,我们来介绍一下checkout命令,它的作用是什么?

第一,它可以用来切换分支。

命令: git checkout branch_name

如果切换一个并不存在的分支会怎么样?

可以看到,抛出了一个error

第二,它可以用来创建并切换分支。

命令: git checkout -b new_branch_name

等同于如下命令:

git branch c;
git checkout c;

第三,它可以撤销在Working Directory改动的文件。

命令: git checkout -- file_name

rm

接着,我们讨论下rm命令,老规矩,为什么要使用它?

它与add属于配套命令,add命令负责将本地的改动文件添加到Staging Index

而它则负责将Working DirectoryStaging Index的改动文件删除。

命令: git rm -f file_name

reset

继续,那么reset命令的作用是什么?

它通过移动Head指针来撤销本地尚未pushcommit

来看下示意图,reset之前:

reset之后:

首先,我们模拟在本地进行三次commit

然后,回退到bb45266

注意喔,git reset commit_id 默认使用mix模式。

接着,我们详细讨论一下reset的三种模式,分别为hard,softmixed

先来看下hard

Resets the index, working tree and commit history.
Any changes to tracked files in the working tree since are discarded.

再来看下soft:

Does not touch the index file or the working tree at all (but resets the head to , just like all modes do). This leaves all your changed files "Changes to be committed".

最后来看下默认模式mix

Resets the index and commit history but not the working tree.
This is the default action.

revert

老规矩,revert命令的作用是什么?

当你想撤销一个或多个已pushed的提交时,就可以使用revert,注意它并不会删除已有的commit history

举个例子。

第一步,分别提交四个commitpush到远程仓库。

第二步,撤销其中三个提交。

此时,Working Directory中只有剩余一个commit的内容,也就是类C

最后将本地的改动push到远程仓库即可:git push origin branch_name

Reference


一位喜欢提问、尝试的程序员

(转载本站文章请注明作者和出处 姚屹晨-yaoyichen

Post Directory