环境:Linux操作系统-Centos
创建本地仓库
首先创建一个目录,命名为:gitcode
mkdir gitcode
进入gitcode目录,创建本地仓库
git init
此时,就会创建出了一个空的仓库在当前目录下了,此时目录下就有git的目录了
配置Git
首先重要的是需要配置我们创建出来的仓库的名称和Email。
git config [--global] user.name "Your Name"
git config [--global] user.email "email@example.com"
# 把 Your Name 改成你的昵称
# 把 email@example.com 改成邮箱的格式,只要格式正确即可
其中--global 是⼀个可选项。如果使用了该选项,表示这台机器上所有的Git仓库都会使用这个
配置。如果你希望在不同仓库中使用不同的name或 e-mail ,可以不要--global 选项,但要
注意的是,执行命令时必须要在仓库里。
配置完后,可以使用以下命令来查看配置项
git config -l
当想要删除name和email时:
git config [--global] --unset user.name
git config [--global] --unset user.email
Git中的工作区、暂存区、版本库
工作区:是在电脑上你要写代码或文件的目录。
暂存区:英文叫stage或index。⼀般存放在 .git 目录下的index文件(.git/index)中,我们
把暂存区有时也叫作索引(index)。版本库:又名仓库,英文名 repository 。⼯作区有⼀个隐藏目录 .git ,它不算⼯作区,而
是Git的版本库。这个版本库里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
首先在当前目录("gitcode")下创建出一个新的文件:"ReadMe",注意此时的git并不能直接管理“ReadMe”文件。
此时,.git就是版本库,用于管理指定的文件,而处于gitcode的文件就是工作区了,而暂存区其实是存在于版本库中的。
当需要管理的文件,从工作区到版本库中被管理起来,简单的流程是:工作区的内容在被修改(增删改操作)后, 使用add,会在版本库中的一个叫objects的对象库中保存(每一次add就每次创建出一个新的对象,对应着每一个版本),此时在暂存区会通过索引,从对象库(objects)中找到对应的版本,然后使用commit(提交)到master中,也是通过索引。此时就被git管理起来了。
添加文件
使用 git add 来添加文件到暂存区中:
对于git来说,可以添加一个或多个文件到暂存区:
git add [file1] [file2] ...
也可以将当前目录下所有文件添加到暂存区:
git add .
随后使用 git commit 来添加到master中:
git commit也可以同时提交多个文件到仓库中:
git commit [file1] [file2] ... -m "message"
提交文件后,我们可以使用 git log 来查看提交的历史:
加上参数:--pretty=oneline ,可以简化历史内容:
查看 .git 文件
首先查看一下 .git 的目录结构:
可以看到,在 .git 的目录中,存在着index索引(暂存区)和objects对象库,还有HEAD(默认指向master分支的指针)。
查看一下masert的内容:
会看到一串长长的数据,这段数据就是最新提交的commit id。
通过命令: git cat-file -p commit id,就可以查看对应的版本库对象的内容:
在内容中,出现了一行:tree 0e6b........945的数据,使用同样的方法查看:
发现出现了历史修改过的版本文件等等,再次查看对应的commit id
就会发现,我们可以查看历史版本了!!!历史修改过的版本,被git记录下来了。
总结:在 .git 的目录下,我们可以查看到暂存区和Head,对Head指向的master进行查看,可以找到最新保存的commit id,查看这个commit id可以找到以往文件的保存的commit id,通过这些id,可以查看到历史修改过的版本。
继续添加文件
带着对上述的工作区、暂存区和版本库的理解,继续添加文件:
创建出file1,然后add添加file1,然后继续创建fiel2,接着直接commit提交:
可以看到,虽然有两个新的在工作区的文件,但是因为只将 file1 add 到了暂存区中,因此在提交commit的时候,也只会提交file1,即"1 file changed"。
修改文件
Git追踪管理的是修改的内容,而不是整个文件!接下来对“ReadMe”文件再次修改:
由于已经将”ReadMe“提交到了仓库中,而仓库中的ReadMe和我们工作区的ReadMe是不同的,因此先来查看一下当前仓库状态:git status
- Changes not staged for commit:暂存区是干净的,没有内容
- modified: ReadMe 意思是被修改的文件是ReadMe.
通过查看了仓库状态,得知哪些文件内容被修改了,接下来是查看一下被修改前后的差别:
git diff [file] 命令用来显示暂存区和工作区文件的差异,显示的格式正是Unix通用的diff格式。也可以使用 git diff HEAD -- [file] 命令来查看版本库和工作区文件的区别:
- diff --git a/ReadMe b/ReadMe:意思是 a表示修改前的内容,b表示的是修改的内容。
- --- a/ReadMe +++ b/ReadMe 意思是 ---也表示修改前,+++修改后。
- @@ -1 +1,5 @@ 意思是 -1表示改动前的第一行,+1表示改动后的第一行,5表示从+1开始改动到第五行结束。
查看到修改前后的变化,确认无误,可以放心提交了!
[wjmhlh@VM-12-9-centos gitcode]$ git commit -m "modified ReadMe"
[master 891d516] modified ReadMe1 file changed, 5 insertions(+), 1 deletion(-)
提交后,查看仓库状态:
[wjmhlh@VM-12-9-centos gitcode]$ git status
# On branch master
nothing to commit, working directory clean
版本回退
执行 git reset 命令用于回退版本,可以指定退回某⼀次提交的版本。要解释⼀下“回退”本质是要将版本库中的内容进行回退,⼯作区或暂存区是否回退由命令参数决定:
git reset [--soft | --mixed | --hard] [HEAD]
--mixed 为默认选项,使用时可以不用带该参数。该参数将暂存区的内容退回为指定提交版本内容,工作区文件保持不变。
--soft 参数对于工作区和暂存区的内容都不变,只是将版本库回退到某个指定版本。
--hard 参数将暂存区与工作区都退回到指定版本。切记⼯作区有未提交的代码时不要用这个命令,因为⼯作区会回滚,你没有提交的代码就再也找不回了,所以使⽤该参数前⼀定要慎重
HEAD 说明:
◦ 可直接写成commitid,表示指定退回的版本
◦ HEAD表示当前版本
◦ HEAD^上⼀个版本
◦ HEAD^^上上⼀个版本
◦ 以此类推...
• 可以使用〜数字表示:
◦ HEAD~0表示当前版本
◦ HEAD~1上⼀个版本
◦ HEAD^2上上⼀个版本
◦ 以此类推
另外:对于git reset中的版本回退,如果版本库是空的,那么在回退到版本库一致的时候,暂存区和工作区会变为空。
查看历史提交记录:git log --pretty=oneline
撤销修改
情况一:对于工作区的代码,还没有add
git checkout -- [file] 命令让工作区的⽂件回到最近⼀次 add 或 commit 时的状态
撤销前:
撤销后:
情况二:已经add,但是没用有commit
将文件内容修改后,add一下,通过git status查看,是否存在暂存区。
首先,因为没用commit,因此版本库中是空的,因此,可以使用git reset回退到当前版本的内容,因此这会导致暂存区变成空的了。这样就会回到第一种情况。
情况三:add后,commit了
首先,更新文件ReadMe内容:
接着,将其add和commit:
此时的情况就是,版本库中,最新的版本就是有XXX code的ReadMe,而上一个版本是没有的。
使用git reset --hard HEAD^,就能将工作区、暂存区和版本库回退到上个版本。不过这个操作是有条件的,就是你还没有把⾃⼰的本地版本库推送到远程,也就是没有push操作!
删除操作
如果想要删除git管理的文件,使用rm命令是不行的。
首先创建了个文件,将其add和commit
想要删除file1,有两个方法:
第一种方法:①先使用rm删除file1 ②使用git add file1,将工作区的变动提交。③git commit -m "" 进行提交。
第二种方法:①使用git rm file1进行删除,此时是在暂时区删除的。
②最后提交一下,即可删除。
简单总结
①在git结构中,分有工作区、暂存区和版本库。
②添加文件:git add file--将一个或多个文件添加到暂存区中。git commit -m "XXX" 将文件添加到版本库中。使用git log或者git log --pretty=oneline查看提交历史
③git reset 命令用于回退版本。git checkout -- [file] 命令让工作区的⽂件回到最近⼀次 add 或 commit 时的状态
④使用git rm file进行删除,最后commit提交。