欢迎移步我的个人博客
由于之前对于git工具以及GitHub的使用只是停留在掌握了一些简单的命令,于是便想系统地从头学习一下~
本文参考廖雪峰的Git教程。
设置签名
- 形式:
- 用户名:xxx
- Email: xxx@xxx.com
- 作业:区分不同工作人员
- 注意:此处的签名与登录远程库的账号密码无关
- 命令:
- 项目/仓库级别:仅在当前本地库范围有效,信息保存在./.git/config文件
- git config
- git config user.name xxx
- git config user.email xxx@xx.com
- 系统用户级别:登陆当前操作系统的用户范围,信息保存在~/.gitconfig文件
- git config --global
- 同上
- 级别优先级:
- 就近原则:项目界别优先于系统用户级别,二者都存在时,采用项目级别
- 只有系统用户级别则以系统用户级别签名为准
- 不允许都没有
- 项目/仓库级别:仅在当前本地库范围有效,信息保存在./.git/config文件
创建版本库/仓库/repository
-
选择一个合适位置,创建一个空目录,路径上不含中文。
$ mkdir learngit $ cd learngit $ pwd /Users/michael/learngit
-
使用
git init
初始化该目录为git可以管理的仓库。$ git init Initialized empty Git repository in /Users/michael/learngit/.git/
随后目录下多出一个
.git
目录,用来跟踪管理repository。使用
ls -ah
可查看隐藏目录。
把文件添加到仓库
-
在前面创建的
learngit
目录/子目录下,新建一个readme.txt
文件,内容为:Git is a version control system. Git is free software.
-
使用命令
git add
把文件添加到仓库,执行后无显示即为成功。$ git add readme.txt
-
使用命令
git commit
把文件提交到仓库。$ git commit -m "wrote a readme file" [master (root-commit) eaadf4e] wrote a readme file 1 file changed, 2 insertions(+) create mode 100644 readme.txt
git commit
命令:-m
后输入本次提交的说明,便于日后找到改动记录。执行成功后显示:
1 file changed; 2 insertions
几个文件被改动,插入了几行内容。 -
git add <file>
一次可以添加一个命令,而git commit -m <message>
一次可以提交多个文件。
git status
查看仓库状态
-
继续修改
readme.txt
文件为:Git is a distributed version control system. Git is free software.
-
使用
git status
查看结果$ 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")
可以看出,
readme.txt
被修改了,却没有准备提交的修改。 -
使用
git diff
命令查看具体修改了什么内容。$ git diff readme.txt diff --git a/readme.txt b/readme.txt index 46d49bf..9247db6 100644 --- a/readme.txt +++ b/readme.txt @@ -1,2 +1,2 @@ -Git is a version control system. +Git is a distributed version control system. Git is free software.
可以看出,我们在
readme.txt
第一行添加了distributed
单词 -
知道对文件做了什么修改后就可以提交到仓库了,按照前面的
git add <file>
和git commit -m <message>
命令操作。-
git add readme.txt
无任何输出,成功。
-
再使用
git status
瞅一眼仓库当前状态。$ git status On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: readme.txt
可以看到,将要被提交的修改包括
readme.txt
。 -
随后便可以继续提交了。
$ git commit -m "add distributed" [master e475afc] add distributed 1 file changed, 1 insertion(+), 1 deletion(-)
-
提交后,再使用
git status
查看仓库状态。$ git status On branch master nothing to commit, working tree clean
可以看出,没有需要提交的修改,工作目录是干净的。
-
版本回退
修改文件后,把修改提交到git仓库的完整步骤如下:
修改readme.txt
文件如下:
Git is a distributed version control system.
Git is free software distributed under the GPL.
进行提交
$ git add readme.txt
$ git commit -m "append GPL"
[master 1094adb] append GPL
1 file changed, 1 insertion(+), 1 deletion(-)
在文件修改到一定程度后,可以保存一个“快照”,这个在Git中被称为commit
。在文件被改乱,或误删文件后,可以从最近的一个commit
中进行恢复。
-
使用
git log
命令查看共有多少个版本被提交到仓库中。$ git log commit 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) Author: Michael Liao <askxuefeng@gmail.com> Date: Fri May 18 21:06:15 2018 +0800 append GPL commit e475afc93c209a690c39c13a46716e8fa000c366 Author: Michael Liao <askxuefeng@gmail.com> Date: Fri May 18 21:03:36 2018 +0800 add distributed commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 Author: Michael Liao <askxuefeng@gmail.com> Date: Fri May 18 20:59:18 2018 +0800 wrote a readme file
git log
命令显示从近到远的提交日志。可以看到,最近的一次为append GPL
,上一次是add distributed
,最早的一次则是wrote a readme file
。 -
若觉得输出信息过多,可以添加
--pretty=oneline
参数$ git log --pretty=oneline 1094adb7b9b3807259d8cb349e7df1d4d6477073 (HEAD -> master) append GPL e475afc93c209a690c39c13a46716e8fa000c366 add distributed eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0 wrote a readme file
前面的一大串乱码一样的数字是
commit id
(版本号),是由SHA1计算出来的很大的数字,用十六进制表示。原因是分布式版本控制系统,需要多人在同一个仓库工作,避免冲突。注:每次提交一个新的版本,Git都会将他们自动串成一个时间线。
-
若将
readme.txt
回退到上一个版本(add distributed
版本)。在Git中,HEAD
表示当前版本,上个版本就是HEAD^
,上上个版本就是HEAD^^
,往前100个版本就是HEAD~100
。使用
git reset
命令,回退到上一个版本。$ git reset --hard HEAD^ HEAD is now at e475afc add distributed
查看
readme.txt
内容,发现已经被还原为add distributed
版本。$ cat readme.txt Git is a distributed version control system. Git is free software.
-
此时,使用
git log
查看仓库状态,发现之前最新的append GPL
已经看不到了,但是,只要命令行窗口没有被关掉,就还是可以找回的:向上翻,找到append GPL
版本的commit id
是1094adb...
,就可以通过git reset
命令回到指定版本。版本号没必要写全,但是要足够让Git找得到唯一的那个版本。$ git reset --hard 1094a HEAD is now at 83b0afe append GPL
注:Git版本回退很快,在Git内部由一个指向当前版本的
HEAD
指针,在回退版本的时候,Git仅仅是把HEAD指针从指向append GPL
改为指向add distributed
,顺便把工作区的文件更新了。所以,让HEAD
指向哪个版本号,当前的版本就是哪个。┌────┐ ┌────┐ │HEAD│ │HEAD│ └────┘ └────┘ │ │ └──> ○ append GPL │ ○ append GPL │ │ │ ○ add distributed ==> └──> ○ add distributed │ │ ○ wrote a readme file ○ wrote a readme file
-
当你使用了
git reset --hard HEAD^
回退到add distributed
版本后,想要再恢复回append GPL
版本时,必须要找到append GPL
的commit id
。但是若你已经把命令行窗口关闭,并且关闭了电脑,该如何恢复到新版本?
可以使用
git reflog
命令来显示Git记录下来的你的每一次命令。$ git reflog e475afc HEAD@{1}: reset: moving to HEAD^ 1094adb (HEAD -> master) HEAD@{2}: commit: append GPL e475afc HEAD@{3}: commit: add distributed eaadf4e HEAD@{4}: commit (initial): wrote a readme file
To Summarize:
-
初始化一个Git仓库,使用
git init
命令。添加文件到Git仓库,分两步:
使用命令
git add
,注意,可反复多次使用,添加多个文件;使用命令
git commit -m
,完成。 -
要随时掌握工作区的状态,使用
git status
命令。如果
git status
告诉你有文件被修改过,用git diff
可以查看修改内容。 -
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。