1.设置全局信息
如果想要进行软件的开发,那么一定需要存在有软件的开发这的人员信息,配置一些公共的环境属性。
**范例:**设置开发者的用户名称
git config --global user.name 'zengyixiang'
**范例:**设置开发者的邮箱信息
git config --global user.email '1305757203@qq.com'
如果需要知道当前的git下的全局信息,可以使用如下的命令执行:
git config --list
或者
git config -l
此时会返回如下的信息:
2. 创建仓库
如果使用SVN需要初始化一个仓库目录,而后将此目录作为项目的执行目录,读取仓库,所以来讲任何版本控制恐惧里面,仓库都是一个最为重要的概念。
-
假设说现在在e:\gitpro 的目录,这个目录要将其设为仓库目录
md e:\gitpro
-
如果要想将此目录变为仓库目录,则可以进入到此目录中配置
cd e:\gitpro
-
初始化仓库,对于仓库的初始化方式有两种:
- git init 他会在所在的目录中自动生成一个“*.git”隐藏文件夹。这个文件夹将包含git的全部版本信息。
- 直接将当前目录设置为git仓库:git init --bare 可以发现此目录中不在生成“*.git”隐藏文件夹,而此时 e:\gitpro 保存全部的配置信息
3.仓库的基本操作
在git中可以监控的范围的就是仓库信息,那么只要将一些文件保存在这个仓库中就可以进行监控了。编写代码的时候一定是用utf-8编码。
**范例:**观察当前仓库的状态 git status
如果仓库中发现增加了新的文件或者修改了文件,提示有未跟踪的文件。
现在假设hello.java 文件项目最终的文件,所以必须要将其进行提交,提交给git的文件管理系统。
**范例:**将文件添加到git暂存区中:
git add hello.java
添加完成之后,随后查询当前仓库的状态。
这个实际上当前目录中有一个需要使用的新文件:hello.java
范例:将文件提交到版本库中:
git commit -m "Create new file hello.java"
现在才表示将新的文件提交到git中进行管理,这个代码才能被项目所使用
但是如果说现在同时创建里好几个新文件呢?但是用的git status 会立刻告诉用户此时出现了两个新文件。
如果说现在要想让这两个文件可以使用,传统做法:先使用git add 提交到文件暂存区中,然后使用git add 提交到版本库中,但是文件一多,这样接很麻烦啦。为此在git 中提供批量添加新文件到暂存库中。
范例: 批量提交新文件到暂存库中:
git add .
此时所有在仓库中创建的新文件都保存到仓库暂存区中。
**范例:**随后进行版本库的提交
git commit -m "Add two files"
但是会有人觉得麻烦,既然所有的代码搜要提交到版本库中,那么完全没有必要先提交到暂存库,应该直接添加会比较好。
范例:自动添加并提交修改到版本库中。
-
修改Emp.java文件
public class emp{ private int num; }
-
随后查询当前的状态 git status
-
直接将修改后的文件添加到版本库中:
git commit -a -m "Change Emp.java file"
优点:以上没有用到任何的网络配置
4.修改仓库的文件
如果说现在碎玉仓库中的文件进行修改的话,在查询状态时会进行及时的体现
范例:修改hello.java 文件
public class hello{
public static void main(String args[]){
System.out.println("hello Git");
//System.out.println("first");
//System.out.println("second");
}
}
}
此时在hello.java 中添加了两行代码,此时查询状态:
git status
如果此时要想知道文件与已发布的代码哪块发生了改变,则可以使用如下的命令完成
git diff hello.java
"-"号表示删除的代码,”+“号表示增加的代码。所以这个工具可以非常清楚的区分前后的代码变化。
//提交修改
git commit -a -m "In hello.java modify one statement"
那么到此时为止,已经出现了很多次的提交,如果需要知道提交的历史,可以使用以下的命令:
git log hello.java
每一次提交的时候都会出现一个commit id 以供日后版本恢复的时候使用。
4.工作区、暂存区、版本库
在整个git之中,碎玉文件的保一共提供有三个区域。
- 工作区(用户所编写的代码的文件夹):所有文件操作都已工作区为主;不会影响到程序
- git仓库:
- 暂存区:只是将工作区中未保存文件保存到暂存区中,此时由git进行维护
- 版本库:进行发布的地方
- 首先用户需要在工作区中i编写我们所需要的文件,但是此时的文件并不能保存到git仓库中,并且在这一个区域中所进行的文件的增删改都不会影响到最终的软件版本的发布,就好比一个临时的区域。如果需要将临时区域的内容保存到最终发布的软件版本里面需要将其首先添加到暂存区。(此时没有发布到我们的版本库中可以撤销),使用 git add进行添加
- 使用git add 之后,首先将工作区中的新文件状态进行了删除,而后将所有的新文件保存在了暂存区里面。保存在暂存区里面的内容只能够暂时需要的,那么也可以将暂存区的内容删除掉,而后真正要想能够发布的项目必须将其设置在master分支上,这样之后进行提交之后才可以将暂存区内容保存在版本库中,被其他人所使用。执行 commit。
- 由于一个项目可能会被发布多次,所以在git里面保存了commit id ,用于开发者提供版本回退的处理机制。
-
首先修改hello.java 文件 添加 System.out.println(“new add”);
现在的文件内容再工作区里面修改,这个文件不能被真正的项目所使用。
-
当使用 git status 提示工作区发生变化
-
之后要进行暂存区的保存
实际上保存到暂存区中的内容尚志市给了用户一个临时保存暂时不改代码的空间,可以进行恢复。
-
如果现在继续修改hello.java 文件,此时的修改是在工作区的文件。再添加 System.out.println(“new add”);
暂存区的文件并没有修改。
5.版本穿越
整个git中最核心的就在于可以进行版本的回退以及前进的状态下切换。在任何的开发中,对软件的开发中很难保证不恢复到原始状态,因为新增加的程序可能会由于某些原因从而导致失败,而此时必须要能够快速进行版本恢复。
git进行版本穿越的核心在于每一个commit id。
范例:查看当前的日志信息。
git log或者 git log --pretty=oneline
**范例:**回退到上一个版本
git reset --hard HEAD~1
如果发现回过了,则需要滚回去。这时候会发现回滚过去的提交点不见了,此时不能再依靠传统的日志,依靠一个删除的提交点日志信息。
范例:查看所有删除的提交点。
git reflog
发现所有针对于版本的操作,reflog 都在进行记录,那么就可以实现恢复了。
范例:恢复到最后一个提交点
git reset --hard 5792e5d
6.撤销修改
在任何的开发过程中,都很难保证发生”无用“修改的操作,在git里面针对此类的操作是加上就是指的修改撤销功能,这里提供两种情况:
- 在工作区中发生了改变,此时没有提交到暂存区中(未add)
- 已经添加到了暂存区,没有提交到master分支(未commi)
-
在工作去中进行开发(未add并且commit)
这个时候如果想恢复到原来的代码,进行checkout操作
-
首先使用git status 查看当前的状态
-
如果现在需要重新检出已有的代码,则使用 git checkout
直接使用会告诉那些文件发生了变化
- 后面加上文件名会恢复当前的文件。
git checkout 文件名
-
工作区已修改,暂存区以保存,马上就要提交了
- 首先修改aaa.txt
- 将文件保存到暂存区中:git add .
- 查询一下当前的状态
此时文件存在暂存区当中,我们要做的是将暂存区中的文件恢复到工作区中。
-
git reset HEAD aaa.txt
此时aaa.txt 已经被踢回到了工作区,然后使用git checkout 文件名 恢复代码
7. 文件的删除
开发中出现过文件误删的情况,那么如果要想进行文件的删除,只需要删除磁盘的文件即可。
范例: 删除 aaa.txt 文件
-
但是此时只是工作区中的 文件被删除,如果要删除master分支上的代码,必须提交更新
git commit -a -m "delete aaa.txt"
如果说开发者认为删除错了,可以进行恢复。
以上的情况说的是删除已经被提交的情况。那么还有一种可能性,删除发生在工作区里面,这个时候由于master分支上仍热存在aaa.txt 文件,那么可以直接利用master分支上的aaa.txt 使用如下的代码:
git checkout -- aaa.txt
总结:工作区中的删除可以使用checkout重新检出,而master分支上的删除就必须使用版本穿越进行恢复了