Git 简学


一、基本操作

创建仓库:

1
mkdir learngit

打开仓库:

1
cd learngit

查看仓库所在目录:

1
pwd

将该目录变成Git可管理:

1
git init

此时提示 已初始化空的 Git 仓库于 /home/hahaha/Code/learngit/.git/ , 表示仓库已经建好。

在该文件夹中新建 testgit.txt ,添加内容:

1
2
Git is a version control system.
Git is free software.

执行添加命令:

1
git add testgit.txt

执行提交命令:

1
git commit -m "add testgit.txt"

-m 代表一个说明。

二、修改操作

修改 testgit.txt 内容为:

1
2
Git is a distributed version control system.
Git is free software.

输入 git status 查看仓库当前的状态:

1
2
3
4
5
6
7
8
9
ha@haha:~/Code/learngit$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)

修改: readme.txt

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")

输入 git diff readme.txt 查看具体做了什么修改:

1
2
3
4
5
6
7
8
9
ha@haha:~/Code/learngit$ git diff testgit.txt
diff --git a/readme.txt b/readme.txt
index d8036c1..013b5bc 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.

输入 git add testgit.txt 添加。

输入 git status 查看仓库当前的状态:

1
2
3
4
5
6
ha@haha:~/Code/learngit$ git status
位于分支 master
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)

修改: testgit.txt

提交:

1
2
3
ha@haha:~/Code/learngit$ git commit -m "add distributed"
[master 96f9e99] add distributed
1 file changed, 1 insertion(+), 1 deletion(-)

三、回滚操作

再次熟悉一下修改操作,这次修改第二行为:

1
2
Git is a distributed version control system.
Git is good free software.

添加、提交:

1
2
git add testgit.txt
git commit -m "add good"

我门进行了两次修改:

原文件:

1
2
Git is a version control system.
Git is free software.

第一次修改:

1
2
Git is a distributed version control system.
Git is free software.

第二次修改:

1
2
Git is a distributed version control system.
Git is good free software.

经过n次的修改后,使用 git log 查看修改记录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ha@haha:~/Code/learngit$ git log
commit 5c521fd2e0da79649d0dbcc0f0125e443cb46ac9 (HEAD -> master)
Author: onebigcabbage <zhongxiangcai17@gmail.com>
Date: Mon May 28 19:55:16 2018 +0800

add good

commit 96f9e997ce0a5ead8d852c15d34247823b358263
Author: onebigcabbage <zhongxiangcai17@gmail.com>
Date: Mon May 28 17:17:05 2018 +0800

add distributed

commit 0a75a380a3d155a717d0ab9e67e665d623304665
Author: onebigcabbage <zhongxiangcai17@gmail.com>
Date: Mon May 28 17:13:51 2018 +0800

write a readme file

还可以通过 git log --pretty=oneline 以每行查看修改记录:

1
2
3
4
ha@haha:~/Code/learngit$ git log --pretty=oneline
5c521fd2e0da79649d0dbcc0f0125e443cb46ac9 (HEAD -> master) add good
96f9e997ce0a5ead8d852c15d34247823b358263 add distributed
0a75a380a3d155a717d0ab9e67e665d623304665 write a readme file

如果想回到修改前一次的文件,使用 git set --hard HEAD^ 命令:

1
2
ha@haha:~/Code/learngit$ git reset --hard HEAD^
HEAD 现在位于 96f9e99 add distributed

输入 cat testgit.txt 查看一下,已经回到最后一次修改的内容:

1
2
Git is a distributed version control system.
Git is free software.

如果想回到n次修改前,通过 git reflog 找到想要回到修改的那条记录号:

1
2
3
4
5
6
7
ha@haha:~/Code/learngit$ git reflog
96f9e99 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
5c521fd HEAD@{1}: commit: add good
96f9e99 (HEAD -> master) HEAD@{2}: reset: moving to 96f9e99
0a75a38 HEAD@{3}: reset: moving to HEAD^
96f9e99 (HEAD -> master) HEAD@{4}: commit: add distributed
0a75a38 HEAD@{5}: commit (initial): write a readme file

假如我们想回到文本根本没有被修改的时候,看上面最后一行信息,表示刚开始添加文件的信息,其中需要的是前面的 0a75a38 记录号,输入进行回滚:

1
2
ha@haha:~/Code/learngit$ git reset --hard 0a75a38
HEAD 现在位于 0a75a38 write a readme file

查看一下文件:

1
2
3
ha@haha:~/Code/learngit$ cat testgit.txt 
Git is a version control system.
Git is free software.

四、“救命” (撤回) 操作

当写文件时,不小心加了最后一句:

1
2
3
Git is a distributed version control system.
Git is free software.
I hate boss.

如果发现及时,还没有 git add 到仓库中,使用 git status 查看一下:

1
2
3
4
5
6
7
8
9
ha@haha:~/Code/learngit$ 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: testgit.txt

no changes added to commit (use "git add" and/or "git commit -a")

Git 提示使用 git checkout -- <file> 命令可以将刚才你在工作区添加的东西删掉,也就是回到上一次 git commitgit add的状态。

1
git checkout -- testgit.txt

使用 cat 命令查看文件,发现刚才的那句话已经没了:

1
2
3
ha@haha:~/Code/learngit$ cat testgit.txt 
Git is a version control system.
Git is free software.
1
2


继续刚才的话题,加入你没有发现错误,而且还将那句话 git add 到了仓库中,但是在 git commit 时发现了这个问题,使用 git status 查看一下:

1
2
3
4
5
6
ha@haha:~/Code/learngit$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: testgit.txt

Git 提示使用 git reset HEAD <file> 命令撤销你的 git add 操作。

1
git reset HEAD readme.txt

再使用 git status 查看一下:

1
2
3
4
5
6
7
8
9
ha@haha:~/Code/learngit$ 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: testgit.txt

no changes added to commit (use "git add" and/or "git commit -a")

这时已经撤回 git add 操作了, 只需要重复一下上面的 git checkout -- <file> 命令,就可以 将刚才添加的那句话删掉了:

1
git checkout -- testgit.txt

使用 cat 命令查看文件:

1
2
Git is a version control system.
Git is free software.

发现已经删掉让你丢掉奖金的那句话了。

五、删除操作

删除文件命令:

1
git rm testgit.txt

此时在文件夹下会发现 testgit.txt 文件也被删除了!


插播一句:如果此时发现误删了文件,请务必按照以下步骤操作:

1
2
git reset HEAD testgit.txt
git checkout -- testgit.txt

恭喜, testgit.txt 已经回到文件夹中了。


删除 testgit.txt 文件后还需要 commit 一下:

1
git commit -m "remove testgit.txt"

至此, testgit.txt 文件在仓库中已经被删除了。


再次插播一句:如果如果已经 commit 又发现误删了文件,怎么办?

请看第三个操作,回滚吧!

首先:

1
git reflog

会发现之前的一堆操作:

1
2
3
4
5
6
7
ha@haha:~/Code/learngit$ git reflog
2620989 (HEAD -> master) HEAD@{0}: commit: remove testgit.txt
56e9350 HEAD@{1}: commit: add testgit.txt
17fd25f HEAD@{2}: commit: rm testgit
.
.
.

找到添加 testgit.txt 的那一步操作,在我的日志上是第三行,记住最前边的编号:56e9350 。接下来 reset 一下:

1
git reset --hard 56e9350

赶紧看看文件夹中 testgit.txt 已经回来了!

博主真是操碎了心。

六、实践(与Github的互动)

请先参考建立本地Git仓库和Github的连接

Github 是基于 Git 的代码托管平台,上面我们都是建立的本地仓库,现在可以将这些仓库上传至 Github 网站,相当于将文件备份了一份。

首先,在 Github 上面新建一个仓库,New repository

new

然后在 Repository name 下填 learngit ,点击下面的确定,这样就建好仓库了:

creat

接下来,将我们本地的 learngit 仓库和网上的 learngit 仓库关联起来,务必把第一条命令中的 onebigcabbage 改成你的 Github 用户名:

1
2
git remote add origin https://github.com/onebigcabbage/learngit.git
git push -u origin master

接下来会提示Github 的用户名和密码。

刷新一下 Githublearngit 仓库,已经有了本地的所有文件。

因为是第一次将本地仓库推送到远程仓库,所以使用了 -u 参数,下一次再提交可省略:

1
git push origin master

如果本地仓库不小心没了或者换了台电脑,可以使用 git clone 命令从 Github 仓库重新下载一份:

首先要找到地址:

clone

接下来:

1
git clone https://github.com/.........