服务器端创建仓库
[git@myw gitrepo]$ git init --bare gittest.git
初始化空的 Git 版本库于 /home/git/gitrepo/gittest.git/
客户端克隆项目
使用Git Bash Here打开一个终端
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces
$ git clone git@192.168.40.180:/home/git/gitrepo/gittest.git
Cloning into 'gittest'...
git@192.168.40.180's password:
warning: You appear to have cloned an empty repository.
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces
$ cd gittest/19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$
输入git用户密码;
我的是一个空的工程, 所有会有一行警告;
进入gittest目录;
默认只有一个master主干;
可以创建分支(branch), 里程碑(tag), 这个跟svn概念是一样的;
git提交流程
工作区 --> 缓存 --> 本地仓库 --> 远程仓库
git分为缓存,本地仓库和远程仓库;
提交流程:
先添加(add)到缓存, 然后提交(commit)到本地仓库, 最后提交(push)到远程仓库
工作区添加文件
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ touch data.txt19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ vim data.txt19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git status -s
?? data.txt19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$
创建一个文件data.txt;
git status 查看工作区代码相对于暂存区的差别;
data.txt前边有状态码:
?? 表示尚未添加到缓存的文件
D 表示删除的文件
M 表示修改的文件
A 表示已添加到缓存
添加到缓存
把当前目录提交到缓存
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git add .19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git status -s
A data.txt
add 用来把变更添加到缓存
A 表示缓存中添加的文件
问题:
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git add .
warning: LF will be replaced by CRLF in data.txt.
The file will have its original line endings in your working directory
git add . 会报错需要设置git
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git config --global core.autocrlf true
恢复缓存
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git reset19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git status -s
?? data.txt
git reset 缓存恢复到仓库版本;
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git rm --cached data.txt
rm 'data.txt'
git rm从缓存区中删除data.txt;
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git rm --f data.txt
rm 'data.txt'
git rm --f 从缓存区中删除data.txt, 同时也会从工作区中删除;
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git rm -r --cached .
rm 'data.txt'
删除缓存中当前目录(.)下所有人间;
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git rm -rf .
rm 'data.txt'
git rm -rf 从缓存区中删除当前目录, 同时也会从工作区中删除;
添加到本地仓库
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git commit -m '添加一个文件'
[master (root-commit) b103708] 添加一个文件
1 file changed, 6 insertions(+)
create mode 100644 data.txt19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git status -s19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$
提交data.txt到本地仓库;
这注意的是status已经跟工作区没有任何差别了;
查看提交日志
git log 命令用来查看提交日志历史;
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git log
commit b1037086e1cefeb67c70168fdddc185147c5b067 (HEAD -> master)
Author: mayuwei <mayuwei@ebupt.com>
Date: Fri Sep 6 19:34:29 2019 +0800添加一个文件
每次提交后都会生成一个唯一的commit ID标识;
b1037086e1cefeb67c70168fdddc185147c5b067 是git这次commit的版本ID;
HEAD -> master 表示当前是master主分支;
修改
修改data.txt文件
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git status -s
M data.txt19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git add .19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git status -s
M data.txt
M红色表示未添加到缓存区, 绿色表示已添加到缓存区;
再提交一次版本, 现在有两个commit版本 72834517dc525150d899856f2b6fe08a2f8bec3e 和 b1037086e1cefeb67c70168fdddc185147c5b067;
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git log
commit 72834517dc525150d899856f2b6fe08a2f8bec3e (HEAD -> master)
Author: mayuwei <mayuwei@ebupt.com>
Date: Fri Sep 6 19:55:13 2019 +0800修改一个文件
commit b1037086e1cefeb67c70168fdddc185147c5b067
Author: mayuwei <mayuwei@ebupt.com>
Date: Fri Sep 6 19:34:29 2019 +0800添加一个文件
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$
撤销修改
修改data.txt
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git status -s
M data.txt
如果不想修改了, 还原到修改之前的文件内容可以使用reset命令;
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git reset HEAD
Unstaged changes after reset:
M data.txt19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git status -s
M data.txt
会把缓存区恢复到HEAD指向的master主分支;
还可以同时还原缓存和工作区, 到一个commit版本
git reset --hard <commit_id>
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git reset --hard b1037086e1cefeb67c70168fdddc185147c5b067
HEAD is now at b103708 添加一个文件
同时这个版本之后的新版本会舍弃;
$ git log
commit b1037086e1cefeb67c70168fdddc185147c5b067 (HEAD -> master)
Author: mayuwei <mayuwei@ebupt.com>
Date: Fri Sep 6 19:34:29 2019 +0800添加一个文件
现在log中只有尾号是067的版本, 之前的c3e版本已经没有了;
除了--hard, 还有--mixed 和 --soft 方式
--hard : 回退commit log, 并还原缓存, 工作区;
--mixed : 回退commit log, 还原缓存区, 不还原工作区;
--soft : 只是回退commit log;
查看远程仓库
提交远程仓库之前可以先看下远程仓库信息;
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git remote show
origin
现在只有一个origin仓库, master分支
也可以通过git remote查看;
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git remote -v
origin git@192.168.40.180:/home/git/gitrepo/gittest.git (fetch)
origin git@192.168.40.180:/home/git/gitrepo/gittest.git (push)
提交远程仓库
通过push把本地仓库commit更新到远程仓库;
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git push origin master
git@192.168.40.180's password:
Enumerating objects: 6, done.
Counting objects: 100% (6/6), done.
Delta compression using up to 8 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 454 bytes | 151.00 KiB/s, done.
Total 6 (delta 0), reused 0 (delta 0)
To 192.168.40.180:/home/git/gitrepo/gittest.git
* [new branch] master -> master
show查看仓库信息
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git show -s
commit ac686bce37b31db955eb322def5aab24a4c7330b (HEAD -> master, origin/master)
Author: mayuwei <mayuwei@ebupt.com>
Date: Mon Sep 9 18:31:11 2019 +0800修改一个文件
更新远程仓库到本地
正常情况下push之前需要先同步下远程仓库代码到本地, 解决冲突问题;
在跟新之前先要了解git内部存储机制;
打开工作区目录, 会有一个.git隐藏文件夹;
里面有refs文件夹, 三个目录 heads, remotes,tags三个目录
remotes保存了远程分支的副本;
head是本地分支;
使用fetch进行更新;
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git fetch origin
git@192.168.40.180's password:
fetch origin会把远程最新的代码跟新到remotes副本, 不会影响head本地分支;
使用git pull目录更新
19941@LAPTOP-I79HMI93 MINGW64 ~/Desktop/ces/gittest (master)
$ git pull
git@192.168.40.180's password:
Already up to date.