git基本操作
温馨提示
此博客用于记录git常用的命令参数使用方法
遗忘或想不起来了可以来看一眼
所以写的并不详细、不适合初学者学习
环境说明
[root@Check1 ~]# cat /etc/redhat-release CentOS release 6.10 (Final) [root@Check1 ~]# uname -a Linux Check1.net 2.6.32-754.2.1.el6.x86_64 #1 SMP Fri Jul 13 12:50:12 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
git的安装
[root@Check1 ~]# yum -y install git
创建版本仓库
[root@Check1 ~]# mkdir -p /usr/local/git/test [root@Check1 ~]# cd /usr/local/git/test/ [root@Check1 test]# git init Initialized empty Git repository in /usr/local/git/test/.git/
创建版本库后会在目录内生成一个隐藏目录.git 初始化一个空版本
[root@Check1 test]# ls -al 总用量 12 drwxr-xr-x 3 root root 4096 12月 16 20:51 . drwxr-xr-x 3 root root 4096 12月 16 20:51 .. drwxr-xr-x 7 root root 4096 12月 16 20:51 .git [root@Check1 test]# cd .git/ [root@Check1 .git]# ls branches config description HEAD hooks info objects refs
版本创建
[root@Check1 test]# pwd /usr/local/git/test [root@Check1 test]# echo "version 1.0" >> code.txt 编辑一个文件或目录,在里面添加内容 [root@Check1 test]# git add code.txt 将此文件添加到缓存区 [root@Check1 test]# git commit -m "版本1.0" 提交此文件创建版本记录 -m "版本说明信息" [master (root-commit) 0367a6a] 版本1.0 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 code.txt
再创建几个版本
[root@Check1 test]# echo "version 2.0" >> code.txt [root@Check1 test]# git add code.txt [root@Check1 test]# git commit -m "版本2.0" [master c94bcab] 版本2.0 1 files changed, 1 insertions(+), 0 deletions(-) [root@Check1 test]# echo "version 3.0" >> code.txt [root@Check1 test]# git add code.txt [root@Check1 test]# git commit -m "版本3.0" [master 9f98991] 版本3.0 1 files changed, 1 insertions(+), 0 deletions(-)
在git中创建版本记录只是记录一个修改后面的版本是依赖于前面的版本的
查看版本记录
[root@Check1 test]# git log commit 9f9899114fdb0f59b8cd0cb3e009f33f2b7702e5 Author: wcy <goodmoodwjl@163.com> Date: Sun Dec 16 21:02:31 2018 +0800 版本3.0 commit c94bcab611218e72f9d806ee347dcfb1d12e73a3 Author: wcy <goodmoodwjl@163.com> Date: Sun Dec 16 21:01:58 2018 +0800 版本2.0 commit 0367a6a3bd901309e282dc630e6562b7f270e39b Author: wcy <goodmoodwjl@163.com> Date: Sun Dec 16 20:55:10 2018 +0800 版本1.0
版本回退
根据HEAD指针回退
HEAD指向当前版本
[root@Check1 test]# git reset --hard HEAD^ 回退至上一个版本 HEAD is now at c94bcab 版本2.0
HEAD^指的是上一个版本 HEAD^^指的是上两个版本
上100个版本可以用 HEAD~100
上200个版本可以用 HEAD~200表示
根据版本序列号回退
[root@Check1 test]# git reset --hard 9f9899114f HEAD is now at 9f98991 版本3.0
版本序列号在上面git log中查看git commit对应的字符串就是 回退的时候不用填写全部版本序列号,前几位即可
如果Git的版本号通过git log查看不到了可以通过git reflog查看操作记录
比如回退到版本3.0
[root@Check1 test]# git reset --hard HEAD^ HEAD is now at c94bcab 版本2.0 [root@Check1 test]# git log commit c94bcab611218e72f9d806ee347dcfb1d12e73a3 Author: wcy <goodmoodwjl@163.com> Date: Sun Dec 16 21:01:58 2018 +0800 版本2.0 commit 0367a6a3bd901309e282dc630e6562b7f270e39b Author: wcy <goodmoodwjl@163.com> Date: Sun Dec 16 20:55:10 2018 +0800 版本1.0
查看操作记录
[root@Check1 test]# git reflog c94bcab HEAD@{0}: HEAD^: updating HEAD 9f98991 HEAD@{1}: 9f9899114f: updating HEAD c94bcab HEAD@{2}: HEAD^: updating HEAD 9f98991 HEAD@{3}: commit: 版本3.0 c94bcab HEAD@{4}: commit: 版本2.0 0367a6a HEAD@{5}: commit (initial): 版本1.0 [root@Check1 test]# git reset --hard 9f98991 回退到版本3.0 HEAD is now at 9f98991 版本3.0
可以看到上面版本3.0 最前面的就是之前版本序列号的前几位,然后再跟进这个序列号进行其他操作
9f98991 HEAD@{3}: commit: 版本3.0 序列号即:9f98991
工作区、暂存区和版本库
git是管理版本的修改
git commit时只是会把暂存区的修改提交到版本记录中(也就是创建一个版本记录)
撤销修改
丢弃工作区的改动
在工作区修改 code.txt 使用git status查看一下状态
[root@Check1 test]# echo "version 4.0" >> code.txt [root@Check1 test]# git status # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: code.txt # no changes added to commit (use "git add" and/or "git commit -a")
可以看到已修改文件 code.txt
可以操作的选项是
1、git add 提交至暂存区
2、git checkout -- 删除工作区的修改
[root@Check1 test]# git checkout -- code.txt [root@Check1 test]# cat code.txt version 1.0 version 2.0 version 3.0
删除工作区的修改后 发现刚才添加的version 4.0 已经没有了
已经添加至暂存区未commit
[root@Check1 test]# echo "version 4.0" >> code.txt [root@Check1 test]# git add code.txt [root@Check1 test]# git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: code.txt #
把暂存区的文件拉回工作区
[root@Check1 test]# git reset HEAD code.txt
Unstaged changes after reset:
M code.txt
再把文件从工作区中checkout出去 丢弃工作区的改动
[root@Check1 test]# git status # On branch master # Changed but not updated: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: code.txt # no changes added to commit (use "git add" and/or "git commit -a") [root@Check1 test]# git checkout -- code.txt [root@Check1 test]# git status # On branch master nothing to commit (working directory clean)
已经commit
[root@Check1 test]# echo "version 4.0" >> code.txt [root@Check1 test]# cat code.txt version 1.0 version 2.0 version 3.0 version 4.0 [root@Check1 test]# git add code.txt [root@Check1 test]# git commit -m "版本4.0" [master d61d2f2] 版本4.0 1 files changed, 1 insertions(+), 0 deletions(-)
进行版本回退
[root@Check1 test]# git log --pretty=oneline d61d2f2cfdf2e2feb0dec63227315fcb7c004ff9 版本4.0 9f9899114fdb0f59b8cd0cb3e009f33f2b7702e5 版本3.0 c94bcab611218e72f9d806ee347dcfb1d12e73a3 版本2.0 0367a6a3bd901309e282dc630e6562b7f270e39b 版本1.0 [root@Check1 test]# git reset --hard 9f9899114fdb0f59b8cd0cb3e009f33f2b7702e5 HEAD is now at 9f98991 版本3.0 [root@Check1 test]# cat code.txt version 1.0 version 2.0 version 3.0
对比文件的不同
对比工作区和版本库的某个文件
[root@Check1 test]# git diff HEAD^ -- code.txt diff --git a/code.txt b/code.txt index d1f9bad..69afb9a 100644 --- a/code.txt +++ b/code.txt @@ -1,2 +1,3 @@ version 1.0 version 2.0 +version 3.0
---为三个版本 HEAD^
+++为工作区的版本
结果为+version 3.0 也就是工作区比上个版本多这一行
对比两个版本库中文件
[root@Check1 test]# git diff HEAD~1 HEAD~2 -- code.txt diff --git a/code.txt b/code.txt index d1f9bad..7c8de03 100644 --- a/code.txt +++ b/code.txt @@ -1,2 +1 @@ version 1.0 -version 2.0
由此可以看出---为前者 +++为后者
可看出 上个版本比上上个版本多一行 version 2.0
删除文件
新建一个测试文件code2.txt
[root@Check1 test]# echo "version 1.0" >> code2.txt [root@Check1 test]# git status # On branch master # Untracked files: # (use "git add <file>..." to include in what will be committed) # # code2.txt nothing added to commit but untracked files present (use "git add" to track) [root@Check1 test]# git add code2.txt [root@Check1 test]# git commit -m "new code" [master e39c2ef] new code 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 code2.txt
rm直接删除工作区文件
[root@Check1 test]# ls code2.txt code.txt [root@Check1 test]# rm code2.txt rm:是否删除普通文件 "code2.txt"?y [root@Check1 test]# git status # On branch master # Changed but not updated: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # deleted: code2.txt # no changes added to commit (use "git add" and/or "git commit -a")
删除后可以通过git checkout -- 撤回删除
[root@Check1 test]# git checkout -- code2.txt
[root@Check1 test]# ls
code2.txt code.txt
git rm删除暂存区文件
[root@Check1 test]# rm code2.txt rm:是否删除普通文件 "code2.txt"?y [root@Check1 test]# git status # On branch master # Changed but not updated: # (use "git add/rm <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # deleted: code2.txt # no changes added to commit (use "git add" and/or "git commit -a") [root@Check1 test]# git rm code2.txt rm 'code2.txt' [root@Check1 test]# git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # deleted: code2.txt #
删除后可以通过
1、git reset HEAD <file>...
2、git checkout -- <file>...
进行恢复
[root@Check1 test]# git reset HEAD code2.txt Unstaged changes after reset: M code2.txt [root@Check1 test]# git checkout -- code2.txt [root@Check1 test]# ls code2.txt code.txt
git commit提交删除
[root@Check1 test]# rm code2.txt rm:是否删除普通文件 "code2.txt"?y [root@Check1 test]# git rm code2.txt rm 'code2.txt' [root@Check1 test]# git commit -m "DEL code2.txt" [master c88df5f] DEL code2.txt 1 files changed, 0 insertions(+), 1 deletions(-) delete mode 100644 code2.txt
恢复只能版本回退
[root@Check1 test]# git reflog c88df5f HEAD@{0}: commit: DEL code2.txt e39c2ef HEAD@{1}: commit: new code 9f98991 HEAD@{2}: 9f9899114fdb0f59b8cd0cb3e009f33f2b7702e5: updating HEAD d61d2f2 HEAD@{3}: commit: 版本4.0 9f98991 HEAD@{4}: 9f98991: updating HEAD c94bcab HEAD@{5}: HEAD^: updating HEAD 9f98991 HEAD@{6}: 9f9899114f: updating HEAD c94bcab HEAD@{7}: HEAD^: updating HEAD 9f98991 HEAD@{8}: commit: 版本3.0 c94bcab HEAD@{9}: commit: 版本2.0 0367a6a HEAD@{10}: commit (initial): 版本1.0 [root@Check1 test]# git reset --hard e39c2ef HEAD is now at e39c2ef new code [root@Check1 test]# ls code2.txt code.txt