这里我们使用Git Bash
这个工具,具体安装过程这里不细说了,然后就是笔记是以李兴华老师的教程为基础的。
一、设置开发者的个人信息
设置全局信息
因为git是分布式版本控制系统,所以,每个机器都需要填写自己的基本信息:开发者名字、Email地址。
- 姓名:
git config --global user.name "yjaal"
- email:
git config --global user.email "xxx@gmail.com"
- 查询全局信息:
git config -l
说明:设置成功之后不会有任何提示信息,我们可以对全局信息进行查看,当然这里我已经在之前就设置好了,这里不给出相关的操作截图。
二、创建仓库
在仓库之中可以保存所有用户开发过程之中所编写的代码的日志记录。如果要开发项目,必须首先有一个仓库,可以简单理解为电脑中的一个文件夹。而我的电脑中所有的仓库都放在E:\github\LocalSource
中,所以我们在这个文件夹中新建一个仓库:
git init mypro
此时我们可以看到相关的提示信息,这样我们就创建好了一个仓库,当然我们直接在电脑中查看,发现还是空的,但是我们使用
Git Bash
可以看到里面有一个.git
的目录:
此目录就是用来保存仓库的相关版本信息的,一般不要对此目录做出任何改动。
三、添加文件
现在我们像仓库中增加一些代码,这里最好将代码的编码设置为UTF-8
,避免出现一些不必要的问题。
在仓库中新建一个程序Hello.java
:
public class Hello{
public static void main(String args[]){
System.out.println("Hello World");
}
}
然后我们使用命令:
git status
就可以查看那仓库中的改动情况
在状态信息中有一些提示信息:
-
on branch master
表示现在的开发是在主分支上; -
Initial commit
表示初始化仓库的提交; -
Untracked files
表示未标记的文件; - 一些操作的命令(
use "git add <file>..." to include in what will be committed
) - 标记文件的列表:
Hello.java
。
将文件加入到暂存库之中:
git add Hello.java
当然如果有多个文件,则可以使用命令:
git add .
进行一次性添加所有改动。
同样不会有提示信息,我们再次查询仓库状态:
我们发现状态信息发生了改变,现在的文件并没有提交到主分支(真正要运行的程序的所有代码)上。
提交文件信息:
git commit -m "The first commit test"
注意:我们一般在提交的时候都需要使用-m
参数来添加本次提交的一些提示信息。此时Hello.java
文件就真正被提交到了主分支上了。
提交之后我们发现状态信息也发生了变化,意思是仓库中没有任何文件需要提交,仓库是干净的。但是我们不能每次都使用这个命令来查看相关信息,我们可以使用命令来专门查看
Hello.java
这个文件的日志信息。
查看Hello.java
文件的日志信息:
git log Hello.java
查看日志信息时,有时候信息不会一下子就全部信息,我们可以使用回车向下查看,当出现一个END
的时候我们可以输入一个字母q来结束日志信息的查看。
首先会出现一个提交的信息号
fa6e49279b6d94641d9fb94a08b68e3e0a416232
,可以理解为我们每次提交的一个id号,后面还有提交者和提交日期。如果有多次提交,那么日志信息也会越来越多。
注意:我们所有修改的代码都会被git监测到,所有的代码想要真正提交都需要进行两步操作,在使用git commit
之前必须使用git add
进行添加,当然我们也可以不分成两步进行,可以简化命令为git commit -a -m "some information"
四、修改仓库文件
下面我们看git如何控制文件修改。首先我们修改Hello.java
文件:
public class Hello{
public static void main(String args[]){
System.out.println("Hello World");
System.out.println("Hello World--001");
System.out.println("Hello World--002");
}
}
此时文件有两处修改。查询仓库状态:
现在git提示文件还没有保存到暂存区中,还给出了一些提示命令,要么使用命令
git add
将文件暂存,或者使用命令git checkout
将文件恢复到没有改动的状态(后面会讲)。还提示我们Hello.java
有改动。但是如果是别人查看此文件,那么这样他是不能知道此文件到底在哪些位置做出改动。此时我们需要查看文件的前后区别。
查看文件的前后区别:
git diff Hello.java
可以看到这里就详细显示出文件的详细改动信息,增加的行使用加号标记,当然删除的行也会使用减号标记。
现在我们使用简写命令进行提交:
git commit -a -m "some modifies"
提交之后我们还查询了日志信息,这里又多出了一个提交号。
五、 工作区与暂存区
工作区就是当前电脑的操作目录
mypro
,之前我们修改或新建代码时保存在工作区之中,当我们使用git add
之后就会保存到暂存区之中,这个暂存区可以理解为数据库操作中的事务操作。使用git commit
之后才表示真正的发出了修改,而真正的可以运行的程序都保存在master分支上。保存在工作上的代码如果没有保存到暂存区是不能进行提交的。当我们将暂存区的代码提交到主分支上之后会自动的清空暂存区之中的内容。
六、版本回退
每当用户运行代码提交的时候都会自动生成一个提交号,而这个提交号就是进行代码回退的主要操作方式。
首先我们先增加一个文件Demo.java
public class Demo{
public static void main(String args[]){
System.out.println("The new file Demo.java");
}
}
提交之后我们再进行一些修改:
public class Demo{
public static void main(String args[]){
System.out.println("The new file Demo.java" + "/" + "some modifies");
}
}
同时我们对Hello.java
也做一点修改后提交:
public class Hello{
public static void main(String args[]){
System.out.println("Hello World");
System.out.println("Hello World--001");
System.out.println("Hello World--002");
System.out.println("modify");
}
}
查询当前仓库的修改日志信息:
git log
此时我们发现信息有很多,而我们有时候只需要查看到信息中的提交号,那么可以这样:
git log --pretty=oneline
这样可以方便的查看所有提交的提交号,当然这些提交号不是顺序排列的。当然我们可以使用此工具的图形界面进行查看,当然我们不推荐。
在master分支上会有一个HEAD的指针,这个指针默认永远指向最后一次提交的位置。于是我们就可以使用此指针来进行回退。如果回退一步,那么之前的操作不会被删除,但是所有的代码将回归到指定的状态。
回退一步:
git reset --hard HEAD~1
其中--hard
表示强制。
此时我们会发现代码就会退回到改动之前的状态。如果此时又想回到最新的状态,那么就必须找到所有的提交号,然后找到最新的提交号进行回退:
git reset --hard "d82a9cdaaeddf008b1f36dbbe896d4f7bebcedbb"
当然我们将提交号简写为其前7位也行:
git reset --hard "d82a9cd"
此时的代码就恢复到了最新的状态了。
七、文件修改问题
实际上,在有了暂存区和master主分支的概念之后,就需要回避一个问题,只有保存在暂存区中的内容才可以真正的被修改,而不是指工作区中的那个文件。下面我们通过例子进行说明。
首先修改Hello.java
:
public class Hello{
public static void main(String args[]){
System.out.println("Hello World");
System.out.println("Hello World--001");
System.out.println("Hello World--002");
System.out.println("Hello World--003");
}
}
之后我们将其添加到暂存区:
git add .
然后再次修改此文件:
public class Hello{
public static void main(String args[]){
System.out.println("Hello World");
System.out.println("Hello World--001");
System.out.println("Hello World--002");
System.out.println("Hello World--003");
System.out.println("Hello World--004");
}
}
但是这次修改我们不进行添加,此时我们直接进行提交:
git commit -m "change--003"
可以此时只是提交了第一次修改,而第二次修改并没有被提交。
可以看到我们提交之后再此查看仓库状态,发现第二次修改并没有被提交。我们将最新的代码和工作区中的代码进行比较:
git diff HEAD Hello.java
可以很明显的看到第二次修改并没有提交。
这就表明如果一个文件修改多次之后就需要多次的进行添加操作,否则在添加之前的修改是不会被提交的。
八、撤销修改
有这样一种情况即代码改动一半之后发现不需要修改,想要撤销。当然这也两种情况。
8.1 未添加&提交
- 这种情况就是说有一次修改还没有进行添加,然后我们进行恢复。
- 如果在工作区中的代码并没有增加到暂存区中,如果要恢复到原始状态是很容易的,我们在上一次操作中最后那次修改没有进行添加,此时我们进行恢复。
git checkout -- Hello.java
此时不会有任何提示信息,但是我们会发现工作区中的文件恢复到了原始状态:
public class Hello{
public static void main(String args[]){
System.out.println("Hello World");
System.out.println("Hello World--001");
System.out.println("Hello World--002");
System.out.println("Hello World--003");
}
}
8.2 添加&未提交
这种情况就是我们已经进行添加了,但是还没有提交到master之中。修改Hello.java
:
public class Hello{
public static void main(String args[]){
System.out.println("Hello World");
System.out.println("Hello World--001");
System.out.println("Hello World--002");
System.out.println("Hello World--003");
System.out.println("Hello World--004");
}
}
然后进行添加
git add .
这里我们看到其实已经给出了恢复的提示信息:
git reset HEAD Hello.java
注意:此时只是将代码从暂存区中推出,并没有将工作区文件恢复,我们可以再次查看仓库状态:
我们看到显示有个文件被修改了,需要进行添加。
当然此时我们可以很简单的恢复到原始状态了。这里我们最好养成良好的习惯,即在提交前将所有代码进行添加。
九、删除文件
这里我们删除Demo.java
文件,但是在git中删除也是一个修改操作。
- 1.从硬盘上删除
Demo.java
文件; -
2.查看仓库状态:
此时文件是从工作区中删除了,但是在主分支上还是存在的,我们提交更新来进行删除:
git commit -a -m "delete Demo.java"
- 3.如果此时又发现文件删除错了,那么就应该进行恢复:
git checkout -- Demo.java
可以发现这样我们是恢复不了的,于是我们需要使用提交号进行恢复
git reset --hard 13e7f88
此时我们就可以发现
Demo.java
在我们的本地仓库中恢复了。
最后:以上操作我们都是在本地进行的,当然我们也可以在远程操作中使用,这里要特别注意git的存储结构。