Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件

工作区和暂存区:

Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。

工作区(Working Directory):

就是你的本地版本库所在的目录。即.git隐藏文件夹所在的目录。

如:

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

本地版本库(Repository):

工作区有一个隐藏目录.git,这就是Git的本地版本库

暂存区(stage):

暂存区(stage)在Git的本地版本库中,版本库中还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

Git中文件的四种状态和它们之间的关系:

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

当我们将一个文件第一次放入工作区中时,使用git status 可以看到这个文件的状态为Untracked。

git status命令可以查看文件的状态。我们也可以使用git status -s查看简明的修改状态

使用git status -s查看文件状态时,红色M为modified状态(保存了文件的修改但还没git add .),绿色M为Staged状态(已经git add .但还没有git commit),灰色M为Unstaged状态(文件Staged状态后突然又想修改使用git reset 文件名回退后的状态)

如:

我们在一个工作区中新建了一个1.py文件,然后用git status查看:

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

此时我们使用git add 1.py命令将该文件加入暂存区,再用git status命令查看,文件变为Staged状态。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

再使用命令git commit -m ‘标签’,将修改加入本地版本库的当前操作的分支,文件变为Unmodified状态。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

如果此时我们又重新编辑了1.py文件,比如在该文件内添加了一行a=1,然后保存该文件,这时候再用命令git status命令,可以看到文件又变回了modified状态。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

这时我们要重新git add 1.py,然后git commit -m ‘标签’,这样修改后的文件就重新加入本地版本库的当前操作的分支,文件再次变为Unmodified状态。

管理版本修改:

同其他版本控制系统相比,Git跟踪并管理的是修改而非文件。

每次修改后,只有git add添加到暂存区中后,git commit才会把修改提交到本地版本库。

正常情况下把一次修改(可能是多个文件的修改)添加到Git本地版本库中需要两步:

第一步是用git add .添加修改到暂存区;

第二步是用git commit-m提交更改,实际上就是把暂存区的所有内容提交到本地版本库中。

我们可以使用git log命令查看每次commit的详细信息,也可以使用git log –oneline只查看每次commit的id。

git status命令可以查看文件的状态。我们也可以使用git status -s查看简明的修改状态

如:

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

接上面的例子,我们在1.py文件中添加了一行a=1后,保存文件,使用git status命令查看,此时文件重新变成了modified状态。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

接下来git add 1.py,然后git commit -m ‘change1’把修改提交到本地版本库。这时候再使用git log命令,可以看到多了一次commit(新的commit标签设为change1)的信息。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

查看更改的细节:

如:

接上例,我们再将1.py改为a=2回车b=1.然后保存文件。

使用命令git diff可以查看具体修改的内容。

要注意的是git diff只能显示Unstaged状态时的文件与上一次commit的内容的对比,如果进行了git add 1.py命令,则git diff命令不能显示修改内容。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

如果文件已经git add .,变成Staged状态,我们还想查看修改内容,此时要用git diff –cached命令。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

如果此时我们又对1.py进行了修改,增加一行c=b,并保存文件,再用git status -s命令,此时文件变成绿色M和红色M并存的状态(文件Staged状态过后又修改了)。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

这个时候我们要查看修改,则要用git diff HEAD命令(文件Staged状态过后又修改后再去查看修改内容)。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

后面有^M显示的是已经Staged过的修改内容。

撤销版本修改:

接上例,我们使用git log –oneline命令可以查看到我们已经进行了3次修改:first commit,change1,change2。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

有时我们在某次提交时忘记了某个文件的修改的提交,我们又不想为了单个文件进行一次整体的新提交,而是把这个遗漏的文件放到最近的一次提交里,怎么办呢?

如:

我们复制1.py,然后粘贴重命名为2.py。但是我们不想为了2.py这个文件再重新进行一次新的总体提交,而是想把2.py这个文件的修改放到change2这次提交中。

使用git add 2.py命令后,使用git commit –amend –no-edit来提交。–amend表示放到最近一次提交中,–no-edit表示不修改最近一次提交的标签

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

再使用git log –oneline,我们可以发现没有新的commit,但最近一次的commit的id改变了

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

如果一次修改(可能是多个文件的修改)已经git add .到暂存区,处于Staged状态,但是我们突然发现文件还要修改:

如:

接上例,在1.py中再加一行d=3,然后保存文件。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

这时候我们突然想起来1.py还需要修改一些内容。

使用命令git reset 1.py可以把1.py文件从Staged状态返回到Unstaged状态。这个时候1.py的内容不变(仍有上面增加的d=3内容),但文件状态改变了。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

版本回退:

在前面工作区和暂存区的介绍中,我们知道Git中有一个指向分支的指针HEAD,默认情况下,系统自动创建master分支,而HEAD指针默认指向该分支,每提交一次新的修改,master分支总是指向最新的一次提交。

如:

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

我们可以对HEAD指针进行移动,当HEAD移动到不同的提交id上时,本地版本库中的所有修改都会回退到该次提交的状态。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

如果我们已经将一次修改(可能是多个修改)git commit到本地版本库,我们又想对某个文件修改,这时候又怎么办呢?我们可以用版本回退来解决。

如:

接上例,再使用命令git add 1.py,然后使用命令git reset –hard HEAD,可以看到HEAD指针仍然在最近一次提交上,但是我们做的git add .修改全部被取消了。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

如果想回到上一次提交,则使用命令git reset –hard HEAD^。

一个^代表回到上一次提交,两个^代表回到上两次提交,依次类推。。。

如:

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

如果版本太多,还可以用命令git reset –hard HEAD~100(100代表回到第前100个版本)

我们还可以使用命令git reset –hard 1844ba8(某次commit的id)来直接回到指定的那个版本。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

回到过去某个版本后,如果我们还是不满意,又想再回到之后的版本,该怎么办呢?

如:

我们把HEAD回到了change1,这个时候再用git log –oneline查看就看不到change2了。这个时候我们再想回到change2该怎么办?

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

使用命令git reflog可以查看到你每一步的修改和每步修改对应的id。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

这时只要找到我们的change2提交的那次修改的id,使用命令git reset –hard 1844ba8即可。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

单个文件的修改:

如果我们只想让某一个文件回到某次提交的状态,我们可以使用git checkout 该次commit的id — 文件名 。

如:

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

可以发现1.py的内容回退到了只有a=1。但是2.py的内容(2.py复制的是change2后的1.py)仍然不变。

我们再在1.py中加上# I went back to change 1,然后保存文件,再git add 1.py,然后 git commit -m ‘back to change 1 and add commit for 1.py’。

再使用git log –oneline会发现多了一次提交。但是我们的change2提交没有被修改。我们只是进行了一次新的提交,且这次新提交只修改了1.py。

《Git工作区和暂存区、Git中文件的四种状态和关系、管理版本修改、撤销版本修改、版本回退、单个文件修改、删除文件》

删除文件:

在Git中,删除也是一个修改操作。

如果你提交了一个新文件到版本库,现在你想删除它:

你可以直接在文件管理器中把没用的文件删掉,或者用$ rm 文件名删除它。

此时使用git status命令会立刻告诉你哪些文件被删除。

这时候有两种情况:

如果确实要从版本库中删除该文件,那就用命令git rm 文件名删掉,并且git commit;

如果删错了,但版本库里还有该文件最近一次提交的版本,可以使用$ git checkout — 文件名把误删的文件恢复到最近一次提交的版本。

    原文作者:一骑走烟尘
    原文地址: https://www.cnblogs.com/zgcr654321/p/9655493.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞