· git 官方文档推荐 https://git-scm.com/book/zh/v1/%E8%B5%B7%E6%AD%A5
一、创建版本库
1创建一个版本库,
1.1
第一步选择一个合适的地方,创建一个空目录
$ mkdir learngit
$ cd learngit
$ pwd
代码说明: mkdir 用于创建目录
cd 切换工作目录到指定目录
pwd 用于显示当前目录路径
1.2
第二步通过git init命令把这个目录变成Git可以管理的仓库:
$ git init
反馈为:
Initialized empty Git repository in /User/michael/learngit/.git
会告诉你这个一个空目录,仓库就建好了。
2把文件添加到版本库
先编写一个readme.rtf文件,内容如下:
Git is a version control system.
Git is free software.
2.1
第一步,用命令git add 告诉Git,把文件添加到仓库
$ git add redme.rtf
执行尚明的命令,没有任何显示就对的了
2.2
第二步,用命令git commit告诉Git,把文件提交到仓库
$ git commit -m "wrote a readme file"
代码说明:-m 后面输入的是本次提交的说明,可以输入任意内容
git commit 命令执行成功会告诉你,一个文件被改动,插入了行的内容
为什么Git添加文件需要add,commit两步?
因为commit可以一次提交很多文件,所以可以多次add不同的文件
二、时光机穿梭
1.修改文件内容并上传
我们已经成功并且添加了一个readme.rdf文件,修改文件内容。
现在,运行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")
代码说明:git status命令可以让我们时刻掌握仓库当前的状态,上面的命令告诉我们,readme.rdf被修改过了,但还没有准备提交的修改。
$ git diff readme.rdf
反馈为:
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.
代码说明:git diff 就是查看difference ,查看不同.我们可以看到我们在第一排添加了一个单词。
知道了对文件做了什么修改后,在提交到仓库,提交修改和提交新文件是一样的两步,第一步是git add:
$ git add readme.rdf
同样没有任何输出。在执行第二步git commit之前,我们在运行git status查看仓库状态
$ git status
git status告诉我们,将要被提交的修改包括readme.rdf,下一步就可以放心提交了
$ git commit -m "add distributed"
就成功提交了
然后我们在使用git status命令查看仓库的当前状态:
git status
反馈为:
# On branch master
nothing to commit (working directory clean)
Git告诉我们当前没有需要提交的修改,而且,工作目录是干净的(working directory clean)
2.版本回退
输入代码:
$ git log
反馈
commit 9b4e64a05be468ecaf4bedc1deb18b365079d72c (HEAD -> master)
Author: 赵航翊 <zhaohangyi@zhaohangyideMacBook-Pro.local>
Date: Wed Jul 18 11:35:44 2018 +0800
append GRL
commit cec15c8aaf4f1b83e60e4457bf91cbe64b49468a
Author: 赵航翊 <zhaohangyi@zhaohangyideMacBook-Pro.local>
Date: Wed Jul 18 09:19:26 2018 +0800
wrote a readme file
代码说明:git log 命令显示从最近到最远的提交日志。如果嫌输出信息太多,加上参数--pretty=oneline
$ git log --pretty=oneline
9b4e64a05be468ecaf4bedc1deb18b365079d72c (HEAD -> master) append GRL
cec15c8aaf4f1b83e60e4457bf91cbe64b49468a wrote a readme file
代码说明:前面的类似9b4e64a的是commit id (版本号)
退回上一个版本:
$ git reset --hard HEAD^
退回到指定版本:
$ git reset --hard (commit id)
commit id 不需要写全,前几位就行,Git会自动去寻找。
$ git reflog
Git提供一个命令git reflog用来记录每一次命令。
穿梭前,用git log 命令查看提交历史,以便确定要回退到哪个版本
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本
部分Git命令总结
命令 | 作用 | 备注 |
---|---|---|
mkdir | 创建目录 | |
cd | 切换工作目录当指定目录 | |
pwd | 显示当前工作目录路径 | |
git init | 把当前目录变成Git可以管理的仓库 | |
git add | 把文件添加到仓库 | |
git commit -m"" | 把文件提交到仓库 | -m后面输出的是本次提交的说明 |
git status | 查看仓库当前的状态 | |
git diff | 查看修改的不同 | |
git log | 查看历史记录 | |
git log --pretty=oneline | 查看历史记录 | 简化版 |
git reset --hard HEAD^ | 回退到上一个版本 | |
git reset --hard commit_id | 回退到指定版本 | |
cat | 打开指定文件 |
三 Git名词解释
1.工作区:就是在电脑里能看到的目录,比如说learngit文件夹就是一个工作区
2.版本库:工作区有个隐藏目录“.git”,这个不算工作区,而是Git的版本
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分子master,以及指向master的一个指针叫HEAD
前面讲我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步用git add把文件添加进去,实际上就是把文件修改添加到暂存区
第二步用git commit 提交更改,实际上就是把暂存区的所有内容提交到当前分支
可以简单理解为:需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有文件修改
四 撤销修改
4.1未上传到暂存区
命令:
$ git checkout --readme.rtf
代码说明:撤销在工作区的修改。
两种情况,一种是文件修改后还没有上传在暂存区,
一种是修改过的文件已经上传到暂存区区,又做了修改,现在撤销修改就回到添加到暂存区的暂态
4.2上传到暂存区
命令
git reset HEAD readme.rtf
代码说明:把暂存区的修改撤销掉,重新放回工作区。
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们使用HEAD时,表示最新的版本。
小结:
场景1:当你改乱了⼯工作区某个⽂文件的内容,想直接丢弃⼯工作区的修改时,⽤用命令git checkout -- file。
场景2:当你不但改乱了⼯工作区某个⽂文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第⼀一步⽤用命令git reset HEAD file,就回到了场景1,第⼆二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退⼀一节,不 过前提是没有推送到远程库
五 删除文件
在Git中,删除也是一个修改操作。一般情况下,用rm命令删除:
rm test.rtf
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一样了,git status命令会立刻告诉你哪些文件被删除了。
$ git status
deleted: test.txt
5.1确认删除该文件
用命令git rm删除掉,并且commit
git rm test.rtf
git commit -m "remove"
这样文件就从版本库中删除了
5.2取消删除
因为版本库中还有,恢复到最新版本就好。
$ git checkout -- test.rtf
六 远程仓库
6.1关联远程仓库GitHub
首先请自行注册GitHub账号。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以请先设置一点东西。
第一步 创建SSH Key。
在用户主目录下,看有没有.SSH目录,.文件默认情况下是隐藏的,具体方法请自行百度。如果有,看下文件夹里面有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,就直接一下步,如果没有就打开Shell,创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
PS:在这里你需要把邮件地址换成你自己的邮件地址,然后一路回车,密码也无需设置。
如果一切顺利,就可以在用户主目录里面找到.ssh目录,里面有上面提到的两个文件,这两个是SSH Key的密匙对,id_rsa是私匙,不能泄露出去。另外一个id_rsa.pub是公钥,可以告诉别人
第二步 登陆GitHub
点击右上角的头像,选择“settings”,“SSH and GPG keys”页面。然后点“Add SSH Key”,填上任意title ,然后在下面的KEY文本框里粘贴上id_rsa.pub⽂文件的内容。
完成后点击ADD KEY ,你就可以看到已经添加到的KEY.
6.2 添加远程库
现在你已经在本机创建了一个Git仓库,又想在GitHub上创建一个仓库并且使两个仓库进行远程同步。
第一步
登陆GitHub,然后在右上角头像的左边找到➕按钮,选择 New repository,创建一个新仓库。在name处填入仓库的名字,其他保持默认,点击 create repository按钮创建一个新的Git仓库
PS:务必保持两个仓库的名字一样
第二步
在本地的learngit仓库下运行命令:
$ git remote add origin git@github.com:Fizzyi/learngit.git
把上面的Fizzyi换成你的GitHub账户名。
添加后,远程库的名字就是origin,这是Git的默认叫法。
第三步
把本地库的所有内容推送到远程库上:
$ git push -u origin master
用git命令,实际上是把当前分支master推送到远程库。
由于这是第一次推送,我们加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支利和远程的master分支关联起来,在以后的推送中就可以简化命令。
成功后,就可以在GitHub上面看到和本地一模一样的文件。
从此之后,只要本地add,commit后,就可以通过这个命令把本地master分支的最新修改推送到github中。
$ git push origin master
6.3从远程库克隆
现在,假设我们从零开发,那么最好的方法是先创建远程库,然后,从远程库克隆。
命令:
$git clone git@github.com:Fizzyi/JS.git
Fizzyi替换成你的GitHub账号,JS换成你需要克隆的文件夹名称
分支总结
查看分支:git branch
创建分支:git branch name
切换分支:git checkout name
创建+切换分⽀=支:git checkout -b name
合并某分支到当前分支:git merge name
删除分支:git branch -d name
7更新文件
第一步:
git add 更新文件名
第二步:
git commit -m '更新说明'
第三步:
拉取当前分支最新代码
git pull
第四步:
push到远程分支master
git push origin master
这样就成功更新了文件