Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 [1] Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
常用操作指令
git add [file1] [file2] ... # 添加指定文件到暂存区
git add [dir] # 添加指定目录到暂存区,包括子目录
git add . # 添加当前目录的所有文件到暂存区
git add -p # 添加每个变化,都要求确认
git rm [file1] [file2] ... # 删除工作区文件,并且将这次删除放入暂存区
git rm --cached [file] # 停止追踪指定文件,但该文件会保留在工作区
git mv [file-original] [file-renamed] # 改变文件,并且将这个改名放入暂存区
一:创建git版本仓库
创建git版本仓库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:
第二步,通过git init命令把这个目录变成Git可以管理的仓库:
$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/
瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。
1:建立目录
[root@server1 ~]# mkdir demo
[root@server1 ~]# ls
ansible demo index.html test.sql
2:安装git
[root@server1 demo]# yum install git -y
3:初始化
[root@server1 demo]# git init
Initialized empty Git repository in /root/demo/.git/
4:此时在用户组目录里面可以查看到
[root@server1 demo]# l.
. .. .git
5:查看状态
[root@server1 demo]# git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)
6:建立文件并导入数据
[root@server1 demo]# touch file1
[root@server1 demo]# echo westos > file1
[root@server1 demo]# ls
file1
7:查看状态:
[root@server1 demo]# git status
# On branch master
#
# Initial commit
#
# Untracked files:
# (use "git add <file>..." to include in what will be committed)
#
# file1
nothing added to commit but untracked files present (use "git add" to track)
8:加-s,显示文件的状态
[root@server1 demo]# git status -s
?? file1 ??表示文件还没有提交
9:添加file1到暂存区
[root@server1 demo]# git add file1
10:查看状态
[root@server1 demo]# git status -s
A file1 A表示文件此时被添加到暂存区
11:提交到版本库,第一次提交需要进行一些操作
[root@server1 demo]# git commit -m "add file1"
*** Please tell me who you are.
Run
git config --global user.email "[email protected]"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: unable to auto-detect email address (got 'root@server4.(none)')
[root@server1 demo]# git config --global user.email "[email protected]"
[root@server1 demo]# git config --global user.name yz
12:再次提交到版本库
[root@server1 demo]# git status -s
A file1
[root@server1 demo]# git commit -m "add file1" ##提交到版本库
[master (root-commit) 0e2a289] add file1
1 file changed, 1 insertion(+)
create mode 100644 file1
[root@server1 demo]# git status -s ##此时就无法看到文件的状态了
新添加的未跟踪文件前面有 ?? 标记,新添加到暂存区中的文件前面有 A 标记,修改过的文件前面有 M 标记。 你可能注意到了 M有两个可以出现的位置,出现在右边的 M 表示该文件被修改了但是还没放入暂存区,出现在靠左边的 M 表示该文件被修改了并放入了暂存区。
例如, README 文件在工作区被修改了但是还没有将修改后的文件放入暂存区,lib/simplegit.rb文件被修改了并将修改后的文件放入了暂存区。 而 Rakefile在工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录。
二:暂存已修改文件
1:在工作区修改文件
[root@server1 demo]# cat file1
westos
[root@server1 demo]# echo westos >> file1
[root@server1 demo]# git status -s
M file1 ###该文件被修改了但是还没有被放进暂存区
[root@server1 demo]# cat file1
westos
westos
2:将文件添加到暂存区并修改
[root@server1 demo]# git add file1
[root@server1 demo]# git status -s
M file1 ###该文件被修改了并放在了暂存区
3:工作区被修改并提交到暂存区后又在工作区中被修改了,所以在暂存区和工作区都有该文件被修改了的记录
[root@server1 demo]# echo westos >> file1
[root@server1 demo]# cat file1
westos
westos
westos
[root@server1 demo]# git status -s
MM file1 在暂存区和工作区都有该文件被修改了的记录
4:重新将文件放到暂存区
[root@server1 demo]# git add file1
[root@server1 demo]# git status -s
M file1
5:修改版本库中的file1
[root@server1 demo]# git commit -m "change file1"
[master e600422] change file1
1 file changed, 2 insertions(+)
三:忽略文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。
Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的.
Git 忽略所有以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本
[root@server1 ~]# l.
. .. .bash_logout .bash_profile .bashrc .cshrc .gitconfig .tcshrc
[root@server1 ~]# ls
demo
[root@server1 ~]# cd demo/
[root@server1 demo]# ls
file1
[root@server1 demo]# l.
. .. .bashrc .git
[root@server1 demo]# ls
file1
[root@server1 demo]# vim .gitignore
.* #忽略所有文件
[root@server1 demo]# git status -s
[root@server1 demo]# ls
file1
[root@server1 demo]# l.
. .. .git .gitignore
[root@server1 demo]# git status -s #看不到任何文件的状态
四:版本回退
一:此时在工作区对文件进行了修改还没有添加到缓存区中
(1):查看file1
[root@server1 demo]# cat file1
westos
westos
westos
(2):在工作区修改文件file1
[root@server1 demo]# echo westos >> file1
(3):查看状态
[root@server1 demo]# 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: file1 ###提示用git checkout来改变在工作区的文件
#
no changes added to commit (use "git add" and/or "git commit -a")
(4)执行 git checkout
[root@server1 demo]# git checkout -- file1
(5)查看状态,查看file1,发现恢复到原来的版本
[root@server1 demo]# git status
# On branch master
nothing to commit, working directory clean
[root@server1 demo]# cat file1 ###恢复原来的3个westos
westos
westos
westos
在修改完文件之后没有没有提交到没有暂存区中,想倒退版本和iashi很简单的,就是下面的两步
[root@server1 demo]# echo westos >> file1
[root@server1 demo]# cat file1
westos
westos
westos
westos
[root@server1 demo]# git checkout -- file1
[root@server1 demo]# cat file1
westos
westos
westos
(6) git log中可以很清楚的看到具体的操作信息
[root@server1 demo]# git log
commit e6004229ae82d828f4f9b251e478af8adf3d1602
Author: yz <[email protected]>
Date: Tue Apr 9 18:41:14 2019 +0800
change file1
commit 4e44801419198548545d2adc2773352a2b4ecdca
Author: yz <[email protected]>
Date: Tue Apr 9 18:19:42 2019 +0800
add file1
二:修改完文件后,并且提交到版本库中,如何做版本回退
(1):修改文件
[root@server1 demo]# echo westos > file1
[root@server1 demo]# cat file1
westos
(2):提交到版本库中
[root@server1 demo]# git status -s
M file1
[root@server1 demo]# git add file1
[root@server1 demo]# git commit -m "v3" ###提交到版本库
[master c1aab78] v3
1 file changed, 2 deletions(-)
[root@server1 demo]# git log ####查看对版本库具体的操作
commit c1aab785f4a8124e5d28bca54c9fe104d8c45570
Author: yz <[email protected]>
Date: Tue Apr 9 19:04:50 2019 +0800
v3
commit e6004229ae82d828f4f9b251e478af8adf3d1602
Author: yz <[email protected]>
Date: Tue Apr 9 18:41:14 2019 +0800
change file1
commit 4e44801419198548545d2adc2773352a2b4ecdca
Author: yz <[email protected]>
Date: Tue Apr 9 18:19:42 2019 +0800
add file1
(3)显示完整的commit id
[root@server1 demo]# git log --pretty=oneline
c1aab785f4a8124e5d28bca54c9fe104d8c45570 v3
e6004229ae82d828f4f9b251e478af8adf3d1602 change file1
4e44801419198548545d2adc2773352a2b4ecdca add file1
(4)git-reflog是用来恢复本地错误操作很重要的一个命令bi
[root@server1 demo]# git reflog
c1aab78 HEAD@{0}: commit: v3
e600422 HEAD@{1}: commit: change file1
4e44801 HEAD@{2}: commit (initial): add file1
(5)恢复之前的版本
[root@server1 demo]# cat file1
westos
[root@server1 demo]# git reset --hard HEAD^ ###有几个^表示退回到第几层
HEAD is now at e600422 change file1
[root@server1 demo]# cat file1
westos
westos
westos
(6)已经退回到之前的版本,所以后来对版本库的文件的修改没有了
[root@server1 demo]# git log --pretty=oneline
e6004229ae82d828f4f9b251e478af8adf3d1602 change file1
4e44801419198548545d2adc2773352a2b4ecdca add file1
(7)使用git reflog可以查看到进行的操作
[root@server1 demo]# git reflog
e600422 HEAD@{0}: reset: moving to HEAD^
c1aab78 HEAD@{1}: commit: v3
e600422 HEAD@{2}: commit: change file1
4e44801 HEAD@{3}: commit (initial): add file1
(8)也可以前面加版本的id,退回到任意的版本
[root@server1 demo]# git reset --hard c1aab78
HEAD is now at c1aab78 v3
[root@server1 demo]# cat file1
westos
(9)使用git reflog可以查看到每一步操作
[root@server1 demo]# git reflog
c1aab78 HEAD@{0}: reset: moving to c1aab78
e600422 HEAD@{1}: reset: moving to HEAD^
c1aab78 HEAD@{2}: commit: v3
e600422 HEAD@{3}: commit: change file1
4e44801 HEAD@{4}: commit (initial): add file1
三:在工作区将文件被删除了,如何返回
[root@server1 demo]# rm -rf file1
[root@server1 demo]# ls
[root@server1 demo]# git status
# On branch master
# Changes not staged for commit:
# (use "git add/rm <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# deleted: file1
#
no changes added to commit (use "git add" and/or "git commit -a")
[root@server1 demo]# git checkout -- file1
[root@server1 demo]# ls
file1
[root@server1 demo]# cat file1
westos
四:删除文件,并且已经提交到版本库中
[root@server1 demo]# git rm file1 ###删除工作区文件
rm 'file1'
[root@server1 demo]# git status ##查看状态
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: file1
#
[root@server1 demo]# git commit -m "del file1" ###git commit -m + 此次操作的目的
[master b6625d0] del file1
1 file changed, 1 deletion(-)
delete mode 100644 file1
[root@server1 demo]# ls
[root@server1 demo]# git reflog ###查看对版本库的操作
b6625d0 HEAD@{0}: commit: del file1
c1aab78 HEAD@{1}: reset: moving to c1aab78
e600422 HEAD@{2}: reset: moving to HEAD^
c1aab78 HEAD@{3}: commit: v3
e600422 HEAD@{4}: commit: change file1
4e44801 HEAD@{5}: commit (initial): add file1
[root@server1 demo]# git reset --hard c1aab78 ###返回到任意版本
HEAD is now at c1aab78 v3
[root@server1 demo]# ls
file1