diff --git a/Git和Github入门-简易版.pptx b/Git和Github入门-简易版.pptx new file mode 100644 index 0000000..b7cb9fb Binary files /dev/null and b/Git和Github入门-简易版.pptx differ diff --git a/Git教程1-Git初级主题和入门.md b/Git教程1-Git初级主题和入门.md index 97f1f6f..c632c1a 100644 --- a/Git教程1-Git初级主题和入门.md +++ b/Git教程1-Git初级主题和入门.md @@ -1,29 +1,20 @@ -# git 教程1--- git 初级主题和入门 +# git 初级主题和入门 -本教程面向初学者,没有接触过版本控制概念的读者也可以轻松入门。 +这篇文章的目的是,教会初学者轻松掌握Git,理解Git的设计理念。 -本教程的特点是边学边练,一点也不觉得枯燥。而且,你所学的Git命令是“充分且必要”的,掌握了这些东西,你就可以通过Git轻松地完成你的工作。 +这篇文章的目的是,教会**常用的、简单的、高频的**Git命令。 -同时,本教程的目标是快速教会你Git的基本操作,后续的高级操作和原理,会在后面的教程详细解释。 - -学习本教程的方法是,跟着做,一边做一边思考和理解。光看不练只会转头就忘。 - -另外说明:本篇教程演绎自廖雪峰的 git教程,我在此基础上增加了一些细节的东西,并且会进一步深入的探究 git 的一些原理,这个系列教程会比廖雪峰的更加深入一些,可能会关于一些更有趣的内容,并且注重讲透某些命令的本质原理。 - - - -## 目录和知识点 - -- ssh和https -- git的权限管理 +这篇文章的目的是,不仅理解Git的操作,还能大概理解其背后的原理。 +学习这篇文章最好的方法是,跟着做,一边做一边思考和理解。 +本篇教程演绎自廖雪峰的 git教程,我在此基础上增加了一些细节的东西,并且会进一步深入的探究 git 的一些原理,这个系列教程会比廖雪峰的更加深入一些,可能会关于一些更有趣的内容,并且注重讲透某些命令的本质原理。 ## 为什么要用版本管理工具? -在进入本教程之前,首先说明一下为什么需要使用版本管理工具。 +首先说明一下为什么需要使用版本管理工具。 如果只有一个文件,那么每次修改后保存一下就可以。 @@ -70,7 +61,7 @@ $ git init Initialized empty Git repository in /Users/liaoxuefeng/learngit/.git/ ``` -瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个`.git`的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。 +瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个`.git`的目录,这个目录是Git来跟踪管理版本库的。不要手动修改这个目录里面的文件,我也从来不曾修改过里面的文件。 如果你没有看到`.git`目录,那是因为这个目录默认是隐藏的,用`ls -ah`命令就可以看见。(MacOS用户可以使用 `command + shift + . `在 finder 下查看隐藏文件) @@ -78,11 +69,19 @@ Initialized empty Git repository in /Users/liaoxuefeng/learngit/.git/ 当然,也可以在别人的仓库上修改,使用到 git clone 命令,我们后续会讲到。 + + ## 把文件添加到版本库 -首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。 +首先这里再明确一下,现在的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序源代码等等,Git也不例外。 -如果要真正使用版本控制系统,就要以纯文本方式编写文件。比如记事本文件 *.txt,或者markdown文本,或者各种代码文件,比如 *.c, *.java, *.py, *.html 。 +版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。 + +而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。 + +原因是,文本文件的基本单位是行,Git可以清楚的看到一行的变化,而二进制文件的格式则是不同的,由产生这个文件的程序规定,所以管理起来非常的麻烦和复杂。 + +所以,如果要使用版本控制系统,就要以纯文本方式编写文件。比如记事本文件 *.txt,或者markdown文本,或者各种代码文件,比如 *.c, *.java, *.py, *.html 。 现在我们编写一个`readme.txt`文件,内容如下: @@ -103,7 +102,11 @@ $ git add readme.txt 执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。 -第二步,用命令`git commit`告诉Git,把文件提交到仓库: +> “没有消息就是好消息”并不是一个放之四海而皆准的道理,有的时候需要消息。 +> +> 因为有的时候人们渴望看到提示和反馈,比如你从自己的银行账户里存了一笔钱,你肯定希望银行给你发个消息确认一下的对吧。不要迷信什么Unix哲学。这个哲学的前提是,人们确信这是一个可靠的系统,所以不需要提示,提示了肯定是坏消息。 + +第二步,用命令 `git commit` 告诉Git,把文件提交到仓库: ``` $ git commit -m "wrote a readme file" @@ -112,11 +115,17 @@ $ git commit -m "wrote a readme file" create mode 100644 readme.txt ``` +> 当你commit 的时候,Git 会给我们提示,因为它知道提示是必须的。可以让人确信自己的操作是对的。曾经有一个人总爱跟我强调没有消息就是好消息,一昧的不给提示和模仿Unix的行为,这是错误的! + 简单解释一下`git commit`命令,`-m`后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。 `git commit`命令执行成功后会告诉你,`1 file changed`:1个文件被改动(我们新添加的readme.txt文件);`2 insertions`:插入了两行内容(readme.txt有两行内容)。 -为什么Git添加文件需要`add`,`commit`一共两步呢?因为`commit`可以一次提交很多文件,所以你可以多次`add`不同的文件,比如: +> 如何写一个好的消息呢?这个值得大书特书,现在先简单的提一下,这个消息应该是让人印象深刻,容易回忆起自己干了什么的。这个是最重要的原则,至于中文,英文,动宾结构,那都是次要的。 + +为什么Git添加文件需要`add`,`commit`一共两步呢?先这么记住,这确实有点烦,我们后面会解释。 + +因为`commit`可以一次提交很多文件,所以你可以多次`add`不同的文件,比如: ``` $ git add file1.txt @@ -161,7 +170,38 @@ index 46d49bf..9247db6 100644 Git is free software. ``` -`git diff`顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个`distributed`单词。 +`git diff`顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到,我们在第一行添加了一个`distributed`单词。关于diff 命令的格式,我们简单介绍一下,它有一个漫长的发展史,有兴趣的可以查阅资料,但是我们现在直奔主题,来看看它到底是什么意思。 + +还记得我们上一次修改的文件是什么样子吗? + +``` +Git is a version control system. +Git is free software. +``` + +改成了 + +``` +Git is a distributed version control system. +Git is free software. +``` + +所以, 我们来看看,Git diff怎么阅读。 + +@@ -1,2 +1,2 @@ + +`-` 表示第一个文件,`+`表示第二个文件,`-1,2`表示下面展示的是,第一个文件第1行开始,连续2行的内容。 + +-表示第一个文件的内容,+表示第二个文件的内容,没有+、-的表示没有变动的内容。 + +``` +@@ -1,2 +1,2 @@ +-Git is a version control system. ++Git is a distributed version control system. + Git is free software. +``` + + 知道了对`readme.txt`作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是`git add`: @@ -198,7 +238,7 @@ nothing to commit, working tree clean Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的。 - +> 补充一下, **总结一下:** diff --git a/Git考试.md b/Git考试.md index c78cd23..3d8b6d4 100644 --- a/Git考试.md +++ b/Git考试.md @@ -1,49 +1,32 @@ - +# 简答题 # 入门版 1. 什么是Git? 2. Git的发明者是谁? -3. Git和SVN有什么区别? +3. Git和Github有什么区别? 4. 在一个新电脑上使用Git的第一步是做什么? 5. 一个合格的程序员应该使用图形化界面还是命令行界面的Git? 6. 请列举5到10个常用的Git命令? 7. 如果你对Git不懂,你应该去什么地方找答案?或者阅读哪里的教程? + + # 进阶版 + 1. 什么是索引区?工作区?版本区? +2. git diff 命令如何使用? +3. # Git应用场景考试 + 问题1. 假设一个仓库中很多次提交,在某次提交中有加入a.txt这个文件,后来在另一个提交中a.txt被改名为a2.txt并且从此保持不变。 如何查找a.txt第一次出现的提交?请列出使用到的命令. + 问题2. 如果有两个已经分叉的分支branchX和branchY, 如何查看branchX有而branchY没有的分支?写出用到的命令 问题3: 如果branchX和branchY指向同一个提交, 现在工作目录有东西没有提交, 请问可以正常切换分支吗? -问题3.1 如果如果branchX和branchY没有指向同一个提交, 现在工作目录有东西没有提交, 请问可以正常切换分支吗? +问题3.1 如果如果branchX和branchY没有指向同一个提交, 现在工作目录有东西没有提交, 请问可以正常切换分支吗? + + - - - - -# 入门版 - -1. 什么是Git? -2. Git的发明者是谁? -3. Git和SVN有什么区别? -4. 在一个新电脑上使用Git的第一步是做什么? -5. 一个合格的程序员应该使用图形化界面还是命令行界面的Git? -6. 请列举5到10个常用的Git命令? -7. 如果你对Git不懂,你应该去什么地方找答案?或者阅读哪里的教程? - -# 进阶版 - -1. 什么是索引区?工作区?版本区? - -# Git应用场景考试 - -1. 假设一个仓库中很多次提交,在某次提交中有加入a.txt这个文件,后来在另一个提交中a.txt被改名为a2.txt并且从此保持不变。 - 如何查找a.txt第一次出现的提交?请列出使用到的命令。 -2. 如果有两个已经分叉的分支branchX和branchY, 如何查看branchX有而branchY没有的分支?写出用到的命令 - git log branchY..branchX - note: 两个点不是三个点。 - diff --git a/gitignore.md b/gitignore.md new file mode 100644 index 0000000..f15efd0 --- /dev/null +++ b/gitignore.md @@ -0,0 +1,10 @@ +``` +* + +!*.md +!*.jpg +!*.png + +!*/ # 深层忽略,放到后面 +``` +