虽说经常要上传代码到github上,但是还是会忘记一些git的一些基本操作。
之前找一些入门资料,感觉都不是特别理想,直到找到了廖雪峰的git教程。
这个教程对于初学者来说比较好的一点是上面通过很简单的例子循序渐进地教你一些git的基础用法,通过Copy-Run-Modify大法走一遍教程就会对git有一个直观的了解了。
以下算是对git学习的笔记与总结吧:
安装完git后,第一步需要一些设置
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
git config命令的--global参数,表示你的机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
创建版本库###
创建一个版本库,也就是repository。在github上创建一个repository时就会有指导:
- 在本地新建一个目录,并进入
$ mkdir myDemo
$ cd myDemo
- 接着初始化git,在命令行中输入git init后,该目录下会多一个.git文件,虽然我们正常情况下看不见它
$ git init
Initialized empty Git repository in /Users/decolo/Test-Demo/myDemo/.git/
- 然后可以在目录下新建一个README.md,然后在里面写点东西,比如
$ touch README.md
$ echo "Git是一个版本控制系统" >> README.md
$ cat README.md
Git是一个版本控制系统
- 接着继续照着github上的提示做,命令行在上传完毕后反馈的一段文字中,有“done”、“100%”等字眼,那么肯定是上传成功,新建版本库完成!
git add README.md
git commit -m "first commit"
git remote add origin [email protected]:Decolo/myDemo.git
git push -u origin master
查看每一次修改###
- 完成版本库的新建之后,我们就可以不断的修改本地目录中的内容,然后git add、git commit,最后git push到远程仓库里去了。
- 每次修改版本库中的内容后可以用
git diff
,来查看修改的内容,或者也可以上传完成后在github上看,毕竟感觉网页上看起来会舒服一点点,比如
$ git diff
diff --git a/README.md b/README.md
index ab1fd20..f7e531f 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,3 @@
Git是一个版本控制系统
Git是一个分布式的版本控制系统
+Git是一个分布式的版本控制软件
- 要是想看版本库的状态则使用
git status
,虽然它不能显示具体修改的内容,但是可以看到目录下发生的一些文件变化。比如
$ git status
modified: README.md
版本退回###
- 当我们想退回到某个版本的改动时该怎么办呢?廖雪峰的教程里用了玩RPG游戏时玩家经常会选择“保存-》游戏-》失败-》退出-》重新独挡”的例子来解释了这种情况。具体操作举例
1.命令行中输入git log
,可以查看每一次commit的版本,为了让信息简单一些可以输入git log --pretty=oneline
参数
$git log
commit 1faffcf5e038e1b2eb71df8de7159f704c1a838f
Author: decolo
Date: Wed Jun 28 20:36:43 2017 +0800
third commit
commit 8fda785b1305218bb644acdb9de1ba43b8daa4a0
Author: decolo
Date: Wed Jun 28 20:33:08 2017 +0800
second commit
commit d5a4a53cd8e4f82d47161f244224fcf112d8b4cd
Author: decolo
Date: Wed Jun 28 20:22:54 2017 +0800
first commit
2.在Git中,用HEAD表示当前版本,上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。现在我们退回到上一个版本,可以这样:
$ git reset --hard HEAD^
HEAD is now at 8fda785 second commit
这个时候,你又返回了怎么办?可以用git reflog
来看你的每一次git命令
$git reflog
8fda785 HEAD@{2}: reset: moving to Head^
1faffcf HEAD@{3}: commit: third commit
8fda785 HEAD@{4}: commit: second commit
d5a4a53 HEAD@{5}: commit (initial): first commit
找到第三次commit对应的id:1faffcf,然后再次
git reset--hard 1faffcf
,就能回到第三次commit时的版本库了。命令行中反馈是HEAD is now at 1faffcf third commit
工作区与暂存区###
工作区:我们的本地目录就可以看作是一个工作区,工作区中有一个隐藏目录.git,它不算工作区,而是Git的版本库。里头里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
暂存区:当我们git add,就是把修改后的文件给到了暂存区。
分支:当我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,git commit就是往master分支上提交更改。
通过教程的例子我们可以知道,git add就是把所有的修改提交给暂存区,而git commit则是一次性把暂存区的所有修改提交到分支。
这个时候再去git status
,我们会发现反回的信息如下
# On branch master
nothing to commit (working directory clean)
值得注意的是:假如第一次修改完git add添加到暂存区,接着第二次修改完,未git add,而是直接git commit提交,那么第二次修改就没有被提交,毕竟它都没进入过暂存区。从工作区到暂存区再到分支这一个流程是必须要走,不能跳的。
撤销修改###
情况一:当你完成一次修改后突然反悔,这个时候你还没有把修改推到暂存区。这个时候git status
后我们发现反回的信息是这样的
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: README.md
no changes added to commit (use "git add" and/or "git commit -a")
我们可以看到(use "git checkout --
已经说得很清楚了,利用'git checkout --
注意:这个‘--’一定不要忘了加,不然就是“切换到另一个分支”的命令
情况二:要是你的修改已经推到暂存区去了怎么办?git status
后我们依旧可以发现答案
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: README.md
回复的信息告诉我们,用git reset Head
的办法去将文件移除stage(暂存区),那么我们照做好了
$ git reset HEAD README.md
Unstaged changes after reset:
M README.md
情况三:如果已经通过git commit提交到了分支,参考之前的版本退回,退回到上一个版本。
所以我们在每次commit之前要慎重啊。
删除文件###
引用命令git rm用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。
后面的内容将是远程仓库、分支管理等,这次就到这儿了。