一、几个基本概念:
工作区:
我们编辑文件的目录就是个工作区,上一讲讲到的我创建的test_git目录;
版本库:
实际上就是目录下的那个.git目录,我们可以看一下该目录的内容:
king@ubuntu:~/mydir/test_git/.git$ ls -al
drwxr-xr-x 2 king king 4096 May 2 21:36 branches
-rw-r--r-- 1 king king 34 May 2 22:15 COMMIT_EDITMSG
-rw-r--r-- 1 king king 136 May 2 21:51 config
-rw-r--r-- 1 king king 73 May 2 21:36 description
-rw-r--r-- 1 king king 23 May 2 21:36 HEAD
drwxr-xr-x 2 king king 4096 May 2 21:36 hooks
-rw-r--r-- 1 king king 137 May 2 22:43 index
drwxr-xr-x 2 king king 4096 May 2 21:36 info
drwxr-xr-x 3 king king 4096 May 2 21:51 logs
drwxr-xr-x 10 king king 4096 May 2 22:15 objects
-rw-r--r-- 1 king king 41 May 2 22:43 ORIG_HEAD
drwxr-xr-x 4 king king 4096 May 2 21:36 refs
暂存区:
实际上就是上述的index文件,有些也叫stage;
git会给我们自动创建的第一个分支master,以及指向master的一个指针HEAD;
其中:
git add code.cpp将修改的文件code.cpp加入到暂存区;
git commit code.cpp -m “版本说明” 对暂存区的文件生成一个版本然后提交到当前的分支;也就是说提交我们的更改。
二、示例说明:
1.示例:我们在工作区再创建一个文件code2.cpp,并且修改code.cpp:
king@ubuntu:~/mydir/test_git$ subl code.cpp
king@ubuntu:~/mydir/test_git$ subl code2.cpp
king@ubuntu:~/mydir/test_git$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: code.cpp
未跟踪的文件:
(使用 "git add <文件>..." 以包含要提交的内容)
code2.cpp
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
2.命令git status 用来提示我们修改了哪些文件;
1.code.cpp被我们修改了;
2.由于code2.cpp新创建没有被我们添加,提醒我们需要用git add 和/或 git commit来添加,否则git无法帮助我们跟踪管理该文件。
3.将新文件和修改的文件添加到暂存区,并且创建一个新版本:
1.将两个文件都添加到暂存区:
king@ubuntu:~/mydir/test_git$ git add code*
2.查看状态,发现两个文件还没有提交,一个是新建一个是修改的
king@ubuntu:~/mydir/test_git$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: code.cpp
新文件: code2.cpp
3.将暂存区的文件创建一个新版本提交
king@ubuntu:~/mydir/test_git$ git commit -m "版本3"
[master c6f194e] 版本3
2 files changed, 2 insertions(+)
create mode 100644 code2.cpp
king@ubuntu:~/mydir/test_git$ git log
commit c6f194e6ed0c7acc894ef2d8237f0ef363a8a3a0 (HEAD -> master)
Author: txp <cutetxp@126.com>
Date: Fri May 3 11:34:44 2019 +0800
版本3
commit 40e2c0026454138c0b4195dcb0345b6d2e2646f1
Author: txp <cutetxp@126.com>
Date: Thu May 2 22:15:47 2019 +0800
这是修改后的第二个版本
commit c5593ed7ebd4be3d2884605928cf7de480bd6da2
Author: txp <cutetxp@126.com>
Date: Thu May 2 21:51:20 2019 +0800
这是我的第一个版本
实际上此时版本信息如下:
当我们提交了所有工作区的文件后:
king@ubuntu:~/mydir/test_git$ git status
位于分支 master
无文件要提交,干净的工作区
总结一下:
1.我们编辑文件是在工作区进行;
2.git add 是将我们在工作区编辑好的文件提交给git,让git跟踪管理我们的代码;
3.git commit是将我们放在暂存区的代码文件,创建一个版本记录,方便管理。
三、git只根据暂存区的修改来创建新版本:
1.在code.cpp中添加一行代码:
king@ubuntu:~/mydir/test_git$ subl code.cpp
king@ubuntu:~/mydir/test_git$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: code.cpp
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
2.然后将修改的code.cpp添加到暂存区中;
king@ubuntu:~/mydir/test_git$ git add code.cpp
3.然后再去修改code.cpp
king@ubuntu:~/mydir/test_git$ subl code.cpp
4.然后将code.cpp创建一个新版本:
king@ubuntu:~/mydir/test_git$ git commit -m "版本6"
[master ca792c5] 版本6
1 file changed, 2 insertions(+)
king@ubuntu:~/mydir/test_git$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: code.cpp
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
总结:
即使我们commit了一个新版本,但是根据git status提示来看,还有被修改的未被提交;
说明git只会提交暂存区修改过的文件进行创建新版本。
所以:如果我们需要创建新版本,必须先把修改的文件添加到暂存区中。
四、如何撤销一个文件的修改:
1.撤回还没有加入到暂存区的文件修改,也就是还在暂存区的文件:
king@ubuntu:~/mydir/test_git$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: code.cpp
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
使用 “git checkout – <文件>…” 丢弃工作区的改动:
撤回前:
king@ubuntu:~/mydir/test_git$ cat code.cpp
#include<iostream>
using namespace std;
int main()
{
cout<<"hello world"<<endl;
cout<<"this is the second line"<<endl;
cout<<"this is the third line"<<endl;
cout<<"this is the forth line "<<endl;
cout<<"this is the five line"<<endl;
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
dddddddddddddddddddddddddddddddddd
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
oooooo
return 0;
}
执行命令撤回:
king@ubuntu:~/mydir/test_git$ git checkout -- code.cpp
撤回后:
king@ubuntu:~/mydir/test_git$ cat code.cpp
#include<iostream>
using namespace std;
int main()
{
cout<<"hello world"<<endl;
cout<<"this is the second line"<<endl;
cout<<"this is the third line"<<endl;
cout<<"this is the forth line "<<endl;
cout<<"this is the five line"<<endl;
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
dddddddddddddddddddddddddddddddddd
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
return 0;
}
2.如何撤回已经添加到暂存区的文件:
修改文件内容:
king@ubuntu:~/mydir/test_git$ subl code.cpp
将修改的文件添加到暂存区:
king@ubuntu:~/mydir/test_git$ git add code.cpp
下面提醒如何取消暂存区的文件:
king@ubuntu:~/mydir/test_git$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: code.cpp
使用git reset HEAD <文件> 来撤销添加到暂存区操作:
king@ubuntu:~/mydir/test_git$ git reset HEAD code.cpp
重置后取消暂存的变更:
M code.cpp
king@ubuntu:~/mydir/test_git$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: code.cpp
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
然后,我们回到工作区,按照撤销工作区的修改操作,就可以回到我们工作区修改前的文件,同上 如何撤销没有添加到工作区的文件修改。
如果已经创建了新的版本,想回退,参照第一篇文章,然后回到情景2,再到情景1.