git命令的使用
1、git由来
2、安装:
https://git-scm.com/downloads 下载对应操作系统的Git客户端
3、不同平台:
Linux
从RHEL上安装非常简单
# yum install git
windows
下载对应版本,点击安装
$ git --version 查看版本号
3、概念
Repository仓库,版本库
git初始化后,会在当前目录生成一个 .git 目录,这就是版本库
Workspace工作空间,工作区
.git 所在目录就是工作区, 一般是项目的根目录
index索引
介于工作区和版本库之间,暂存修改的
remote 远程版本库
网络上的另一个版本库,可以和本地库交互
4、使用
初始化一个版本库。
$ git init (如果在windows上,也是一样,先创建文件夹,在文件夹中执行)
在当前目录中增加了一个 .git 目录, 不要自行修改这个目录里面的文件。
当前目录一般是项目的根目录。
.git/ 如下
添加文件
$ echo '<html><title>test</title><body>My Web</body></html>' > index.html
$ git add index.html
单个文件添加
这一步是把文件的当前变化添加到索引中,也就是有这个文件需要版本库来跟踪管理,注意这不是提交。
此时,文件还可以继续修改,还可以添加新的被跟踪文件,一定要add才能把这些改变加入到索引中。
批量添加:
$ git add .
. 号,代表当前目录,这条命令将递归添加当前目录及其子目录的所有文件,只要是目录,就会递归添加盖木璐下的文件和子目录。
查看状态:
git status [ -s] 短格式 [ --short] 长格式
测试:
1 [git@node1 git_test]$ ls -a 2 . .. .git index.html 3 [git@node1 git_test]$ cat index.html 4 <html><title>test</title><body>My Web</body></html> 5 [git@node1 git_test]$ echo 'this is a test html' >> index.html 6 [git@node1 git_test]$ ls 7 index.html 8 [git@node1 git_test]$ cat index.html 9 <html><title>test</title><body>My Web</body></html> 10 this is a test html 11 [git@node1 git_test]$ git status 12 # On branch master 13 # 14 # Initial commit 15 # 16 # Changes to be committed: 17 # (use "git rm --cached <file>..." to unstage) 18 # 19 # new file: index.html 20 # 21 # Changed but not updated: 22 # (use "git add <file>..." to update what will be committed) 23 # (use "git checkout -- <file>..." to discard changes in working directory) 24 # 25 # modified: index.html 26 # 27 [git@node1 git_test]$ git add index.html 28 [git@node1 git_test]$ git status 29 # On branch master 30 # 31 # Initial commit 32 # 33 # Changes to be committed: 34 # (use "git rm --cached <file>..." to unstage) 35 # 36 # new file: index.html 37 # 38 [git@node1 git_test]$ git status -s 39 A index.html 40 [git@node1 git_test]$ git status --short 41 A index.html
Git的文件分类:
-
- 追踪的Tracked , 已经加入版本库的文件
- 未追踪的Untacked, 未加入到版本库的未被管理的文件。
- 忽略的Ignored, git不再关注 的文件,例如一下临时文件
- .gitignore 文件中,目录以 / 结尾,行起始的 !是取反
- .gitignore内容如下:
- 忽略文件不需要自己写,Python的已经有了https://github.com/github/gitignore/blob/master/Python.gitignore#L1
- 其他语言的在这找https://github.com/github/gitignore
测试:index.html add 到暂存区,index2.html 新文件,没有add ,此时查看 status
1 [git@node1 git_test]$ git status 2 # On branch master 3 # 4 # Initial commit 5 # 6 # Changes to be committed: 7 # (use "git rm --cached <file>..." to unstage) 8 # 9 # new file: index.html 10 # 11 # Untracked files: 12 # (use "git add <file>..." to include in what will be committed) 13 # 14 # index2.html
提交代码:
$ git commit --help
$ git commit -m ' First-*-*-1-*-*- commit
再看状态:
commit 提交更改到版本库
-m 填写本次日志消息,必须写,工作中,程序员应该对每一次提交写明做了什么改动。
测试:修改后,如果不add到暂存区,就无法commit到版本管理库
1 [git@node1 git_test]$ echo 'welcome' > index.html 2 [git@node1 git_test]$ git status 3 # On branch master 4 # Changed but not updated: 5 # (use "git add <file>..." to update what will be committed) 6 # (use "git checkout -- <file>..." to discard changes in working directory) 7 # 8 # modified: index.html 9 # 10 no changes added to commit (use "git add" and/or "git commit -a") 11 [git@node1 git_test]$ git commit -m 'Second_*_*_2_*_*_ commit' 12 # On branch master 13 # Changed but not updated: 14 # (use "git add <file>..." to update what will be committed) 15 # (use "git checkout -- <file>..." to discard changes in working directory) 16 # 17 # modified: index.html 18 # 19 no changes added to commit (use "git add" and/or "git commit -a") 20 [git@node1 git_test]$
提交成功:
文件生命周期:
文件add 后,就成为可追踪文件的 未修改状态unmodified,修改后,文件就变为modified状态,再次add偶,将变化提交到索引,状态变为staged,这才能提交。提交成功,文件状态从staged变回unmodified。
git的提交:
git的提交分为两个步骤:
-
- 暂存变更:add作用是把新文件或者文件新的改动添加到一个暂存区stage,也就是加入到index
- 提交变更:commit 提交的是暂存区中的改动,而不是物理文件目前的改动,提交到当前分支,默认是master分支。
- 也可以使用下面的命令,将两步一起执行:
- $ git commit index.html
如果改动了一批文件,一个个写名字很麻烦,使用下面的命令
$ git commit -a
-a --all 会把所有跟踪的文件的改动自动暂存,然后commit,上面命令为提交message,会出现一个类似vi命令的操作界面,需要编写message后,才行。手动写,就可以。
增补:
提交之后,忘记加入一个文件,about.html (也可以使用 -m 省的进入vi 修改)
git log 查看一下版本库里面提交的历史记录
diff比较:
查看各种差异:
git diff 查看被跟踪文件为暂存的修改,比较暂存区和工作区
git diff --cached 查看被跟踪文件暂存的修改,比较暂存区和上一次commit的差异
git diff HEAD 查看被跟踪文件,比较工作区和上一次commit的差异,HEAD指代最后一次commit
测试1:modified状态
1 [git@node1 git_test]$ clear 2 [git@node1 git_test]$ ls 3 about.html index2.html index.html 4 [git@node1 git_test]$ echo 'welcom--' > about.html 5 [git@node1 git_test]$ git diff 6 diff --git a/about.html b/about.html 7 index e69de29..4be6f59 100644 8 --- a/about.html 9 +++ b/about.html 10 @@ -0,0 +1 @@ 11 +welcom--
测试2:staged状态
1 [git@node1 git_test]$ git add about.html 2 [git@node1 git_test]$ git diff 3 [git@node1 git_test]$ git diff --cached 4 diff --git a/about.html b/about.html 5 index e69de29..4be6f59 100644 6 --- a/about.html 7 +++ b/about.html 8 @@ -0,0 +1 @@ 9 +welcom--
测试3:修改about.html 在diff HEAD
1 [git@node1 git_test]$ git diff HEAD 2 diff --git a/about.html b/about.html 3 index 4be6f59..5c379dd 100644 4 --- a/about.html 5 +++ b/about.html 6 @@ -1 +1 @@ 7 -welcom-- 8 +ewqweqweqwewqq
HEAD
- HEAD 可以看做是一个游标,指定当前分支最后一次提交
- HEAD的值存储在 .git/HEAD中
- HEAD 指代最后一次提交
- HEAD^, 指代上一次提交
- HEAD^^ , 指代上上一次提交
- 上n次提交,表示HEAF~n
检出和重置:
checkout 用于切换分支,或恢复工作区文件。
注意,checkout 会重写工作区,这个命令还是比较危险的
测试:注意
测试:
测试:
测试:
删除和移动:
git mv src dest 改名,直接把改名的改动放入暂存区
git rm file 会同时在版本库 和 工作目录中删除文件,真删除
git rm --cached file 将文件从暂存转成未暂存,从版本库中删除,但不删除工作目录的该文件,即文件恢复层不追踪的状态。
以上都算是改动,必须commit才算真改动。
测试:
push到服务器
本地搭建一个github私服模拟github
配置本地用户名和邮箱。
从远程库克隆
这一次使用git协议连接远程库。
使用windows,跨平台测试: