Git的使用
概述
Git是一个分布式版本控制工具, 通常用来管理项目中的源代码文件(Java类、xml文件、html页面等)
进行管理,在软件开发过程中被广泛使用
- Git可以记录文件修改的历史记录并形成备份从而实现代码回溯, 版本切换, 多人协作, 远程备份的功能
- Git具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、CVS、Perforce 和 ClearCase 等版本控制工具
Git仓库专门用来存储项目中的文件(实际可以存储任何文件),大体分为本地仓库和远程仓库
两种
本地仓库
:开发人员自己电脑上的Git仓库远程仓库(代码托管中心)
: 局域网远程库GitLab和互联网远程库GitHub(国外托管平台),Gitee(国内平台),BitBucket
工作区、暂存区、本地版本库概念
工作目录(工作区)
: 包含.git
文件夹的目录就是工作目录,主要用于存放开发的代码暂存区
: 一个临时保存修改文件的地方,.git
文件夹内的名为index
的文件就是暂存区(stage)本地版本库
: 在执行git init
命令后会在当前文件夹创建一个隐藏文件.git(版本库)
,这个文件中存储了很多的配置信息、日志信息和文件版本信息等
Git工作目录下的文件存在未跟踪和已跟踪
两种状态,这些文件的状态会随着我们执行Git的命令发生变化,最后形成一个历史版本
**对于文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着我们执行Git的命令而发生变化 **
untracked
: 未跟踪(未被纳入版本控制)即新创建的文件tracked
: 已跟踪(被纳入版本控制),具体又分为Unmodified
未修改状态,Modified
已修改状态,Staged
已暂存状态
Git常用命令
命令名称 | 作用 |
---|---|
git config --global user.name 用户名 | 设置用户签名 |
git config --global user.email 邮箱 | 设置用户邮箱(不会验证是否存在,最好用自己创建GitHub时的邮箱,不然提交没有小绿点) |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 或 * |
添加文件到暂存区 , * 表示添加所有的文件 |
git rm --cached 文件名 | 删除暂存区的文件,但不会删除工作区的文件,工作区的文件会处于未追踪状态(红色警示) |
git reset 文件名称 | 将暂存区的文件取消暂存 |
git commit -m "提交文件时的日志描述信息" 文件名 或 * |
将暂存区的文件提交到本地库,日志信息必须要写(可以在日志文件中查看),* 表示提交所有文件 |
git reflog | 查看提交的历史版本信息(包含提交的日志信息和精简版本号) |
git log | 查看提交的历史版本的详细信息(含提交作者和提交时间以及完整版本号) |
git reset --hard 要穿越到的版本号 | 切换到指定版本 |
全局范围的签名设置
: 用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的
- 签名的作用是区分不同操作者身份 , Git 首次安装必须设置一下用户签名否则无法提交代码
- 这里设置的用户签名和将来登录GitHub或其他代码托管中心的账号没有任何关系
bash
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git config --global user.name Layne
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git config --global user.email Layne@atguigu.com
# 查看.gitconfig配置文件(在用户的家目录下)
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ cat ~/.gitconfig
[user]
name = Layne
email = Layne@atguigu.com
#查看配置信息命令
git config --list
git init
: 在项目目录下右键打开Git bash窗口然后执行该命令就可以让Git获取项目目录的管理权, 初始化后会在该目录下生成.git
隐藏文件夹
bash
# 假设/d/Git-Space/SH0720就是我们的项目目录(工作区)
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720
$ git init
Initialized empty Git repository in D:/Git-Space/SH0720/.git/
#(ll -a查看当前目录下的隐藏目录)
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ ll -a
total 4
drwxr-xr-x 1 Layne 197609 0 11 月 25 14:07 ./
drwxr-xr-x 1 Layne 197609 0 11 月 25 14:07 ../
drwxr-xr-x 1 Layne 197609 0 11 月 25 14:07 .git/
git status 参数(-s参数可以使输出信息更加简洁)
:查看本地版本库状态,未追踪的文件将会红色显示,追踪后的文件将会绿色显示
bash
#首次查看(工作区没有任何文件)
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git status
On branch master#当前本地库在master分支(默认)
No commits yet#还没有提交过东西
nothing to commit#没有东西可以提交 (create/copy files and use "git add" to track)
#在项目目录下新增hello.txt文件
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ vim hello.txt
hello git! hello atguigu!
##再次查看(检测到未追踪的文件)
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git status
On branch master
No commits yet
Untracked files:#Git还未追踪文件,文件此时在工作区
(use "git add <file>..." to include in what will be committed)
hello.txt
nothing added to commit but untracked files present (use "git add" to track)
**git add/git rm --cached 文件/*
: 将工作区的文件添加到暂存区或者删除暂存区的文件
(表示所有的文件),追踪后的文件将会绿色显示*
- 暂存区的文件可以删除掉,但是工作区的文件并不会删除
gie reset
: 将暂存区的文件取消暂存
bash
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
#将工作区的文件添加到暂存区
$ git add hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory.
#查看状态(检测到暂存区有新文件)
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git status
On branch master
No commits yet#还没有提交
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: hello.txt#Git已经追踪到该文件,文件此时在暂存区,但是还没有提交到本地库
#删除暂存区的文件
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git rm --cached hello.txt
rm 'hello.txt'
git commit -m "提交的日志描述信息" 文件/*
: 将暂存区的文件提交到本地版本库,形成文件的历史版本,*
表示提交所有的文件
bash
# 将暂存区的文件提交到本地库
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git commit -m "my first commit" hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory.
[master (root-commit) 087a1a7] my first commit#087a1a7是提交的精简版本号
1 file changed, 16 insertions(+)
create mode 100644 hello.txt
# 查看本地库的状态(没有文件需要提交)
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git status
On branch master
nothing to commit, working tree clean# 工作区已经空,没有东西可以提交
git reflog/log
: 查看版本的提交记录以及当前分支和其指向的版本(默认是最新版本) , reflog表示精简版信息 , log表示详细信息 ,从下往上看
bash
#将暂存区的文件提交到本地库后可以查看文件的版本信息
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git reflog
087a1a7 (HEAD -> master) HEAD@{0}: commit: my first commit#HEAD执向master分支的my first版本
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git log
commit 087a1a747382978(HEAD -> master) #完整的版本号
Author: #用户名
Date: #提交文件的日期
my first commit#提交时的版本信息
版本切换
修改工作区中已提交到暂存区的文件后并不会自动添加到暂存区需要重新手动提交,此时master分支指向的版本包含的是文件最后提交的版本
bash
#修改工作区的文件(hello.txt)
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ vim hello.txt
hello git! hello atguigu! 2222222222222
hello git! hello atguigu!
#查看状态(检测到工作区有文件被修改)
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: hello.txt#文件以及被修改,并且没有提交到暂存区
no changes added to commit (use "git add" and/or "git commit -a")
#将修改的文件再次添加暂存区
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git add hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory.
#再次查看状态(工作区的修改文件已经添加到了暂存区)
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: hello.txt
#提交修改后的文件到本地库,形成文件的历史版本my second commit
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git commit -m "my second commit" hello.txt
warning: LF will be replaced by CRLF in hello.txt.
The file will have its original line endings in your working directory.
#查看本地库的状态(没有文件需要提交)
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git status
On branch master
nothing to commit, working tree clean
git reflog(详细) 或 git log
: 查看提交的历史版本信息
bash
#查看版本信息,此时HEAD执向master分支的second版本
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git reflog
ca8ded6 (HEAD -> master) HEAD@{0}: commit: my second commit
087a1a7 HEAD@{1}: commit: my first commit
git reset --hard commitID
: 根据切换当前分支的版本, 底层其实是移动的HEAD指针
commitID
: 提交的历史版本的精简版本号.git下的HEAD文件或refs/heads/master文件
: 查看HEAD指针指向当前分支的版本
bash
# 切换到我们第一次提交的first版本
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git reset --hard 087a1a7
HEAD is now at 087a1a7 my first commit
#切换完毕之后再查看历史版本的记录
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git reflog
087a1a7 (HEAD -> master) HEAD@{0}: reset: moving to 087a1a7#记录指针移动的日志信息
ca8ded6 HEAD@{1}: commit: my second commit
087a1a7 (HEAD -> master) HEAD@{2}: commit: my first commit
#然后查看文件hello.txt,发现文件是第一次提交时的内容
$ cat hello.txt
hello git! hello atguigu!