安装
Debain系统使用sudo apt install git
命令安装
安装完成后使用下列命令设置用户名及邮箱:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
创建版本库
建立新目录:
$ mkdir learngit
$ cd learngit
$ pwd
/Users/XXX/learngit
设置当前目录为仓库:
$ git init
Initialized empty Git repository in /Users/XXX/learngit/.git/
添加文件到版本库
新建一个readme.txt
文件,内容如下:
Git is a version control system.
Git is free software.
把一个文件放到GIt仓库共两步。
第一步,添加文件:
$ git add readme.txt
第二步,递交文件及说明:
$ git commit -m "wrote a readme file"
版本控制
修改readme.txt
文件并提交:
Git is a distributed version control system.
Git is free software.
使用git status
命令查看仓库状态
使用git diff
比较各版本差异
版本回退
再次修改readme.txt
并提交:
Git is a distributed version control system.
Git is free software distributed under the GPL.
使用git log
查看提交日志
使用git reset
回退版本(HEAD表示当前版本,HEAD^表示上一版本,以此类推)
$ git reset --hard HEAD^
要回到append GPL
这一版本,可以通过git reflog
查找commit id
,并通过git reset
命令回退,如:
$ git reflog
ac816fd HEAD@{2}: reset: moving to HEAD^
6440cfb HEAD@{3}: commit: append GPL
ac816fd HEAD@{4}: commit: add distributed
7e84cca HEAD@{5}: commit (initial): wrote a readme file
此处得到commit id: 6440cfb
$ git reset --hard 6440cfb
HEAD 现在位于 6440cfb append GPL
完成回退
工作区与暂存区
再次修改readme.txt
:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
并在工作区新建LINCESE
文件。
使用两次git add
命令将readme.txt
和LINCESE
都添加后,暂存区就会变成以下状态:
git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit
就可以一次性把暂存区的所有修改提交到分支。一旦提交后,如果又没有对工作区做任何修改,那么工作区就是“干净”的。现在版本库变成了这样,暂存区就没有任何内容了:
管理修改
与其他版本控制系统不同,Git跟踪并管理的是修改,而非文件。
第一步,对readme.txt做一个修改,比如加一行内容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes.
然后,添加到暂存区。
$ git add readme.txt
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: readme.txt
#
然后,再修改readme.txt:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
提交:
$ git commit -m "git tracks changes"
[master bbbc32b] git tracks changes
1 file changed, 1 insertion(+)
提交后,再看看状态:
$ 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: readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
发现第二次的修改未被提交。理由如下:
第一次修改 -> git add -> 第二次修改 -> git commit
Git管理的是修改,当使用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
提交后,用git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别:
$ git diff HEAD -- readme.txt
diff --git a/readme.txt b/readme.txt
index 76d770f..a9c5755 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,4 +1,4 @@
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
-Git tracks changes.
+Git tracks changes of files.
可见,第二次修改确实没有被提交。
如要提交则应该先添加到暂存区,再提交。
撤销修改
如果需要修改的内容还未被添加到暂存区,git checkout -- file
可以丢弃工作区的修改。命令git checkout -- readme.txt
意思就是,把readme.txt
文件在工作区的修改全部撤销,这里有两种情况:
一种是
readme.txt
自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是
readme.txt
已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次
git commit
或git add
时的状态。
如果需要修改的内容已经被添加到暂存区,但是还未被提交,可以用命令git reset HEAD file
可以把暂存区的修改撤销掉(unstage),重新放回工作区。
git reset
命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD
时,表示最新的版本。
如果要修改的内容已被提交,则参考版本回退章节内容。
删除文件
在Git中,删除也是一个修改操作。
如果要删除版本库中文件的,使用git rm
并git commit
。
如果要恢复本地误删文件的,则使用git checkout -- <file>
来恢复到上次提交的状态。