首先推荐
廖雪峰的 Git 教程
图解 Git
Git 官网
Git 重要概念与常用命令
Git 命令行使用,不是 desktop
1 | 1. git init |
总结
安装 Git
win 上直接下
创建 Git 仓库
- 创建一个文件夹
<filename>
cd 进入后用git init
初始化一个 Git 仓库,会有个.git
文件,用来跟踪管理版本。其实想让哪个文件夹成为仓库都是用这个命令- 添加文件到仓库
- 第一步,使用
git add <filename>
,可以反复添加多个- 第二步,使用命令
git commit -m "<some defination>"
,来提交到工作区
(如果 commit 不成功应该要先配置
1 | git config --global user.name "" |
我是用 git add *
git add * git 会自动把你当前目录所有修改过的文件添加
git add . Git 会递归地将你执行命令时所在的目录中的所有文件添加上去,所以如果你将当前的工作目录作为参数,它就会追踪那儿的所有文件
- git add . :他会监控工作区的状态树,使用它会把工作时的所有变化提交到暂存区,包括文件内容修改(modified)以及新文件(new),但不包括被删除的文件。
- git add -u :他仅监控已经被 add 的文件(即 tracked file),他会将被修改的文件提交到暂存区。add -u 不会提交新文件(untracked file)。(git add —update 的缩写)
git add -A :是上面两个功能的合集(git add —all 的缩写)
删除就是
git rm <filename>
当然先得删掉本地文件夹中的
工作区,暂存区
- 工作区(working directory)就是你的文件夹
- 版本库(repository) 里面有 stage 暂存区 和 第一个分支 master
工作区的用git add
加到库中 stage,git commit
到当前分支 master
第一步是用 git add 把文件添加进去,实际上就是把文件修改添加
到暂存区(working directory 没空哦);
第二步是用 git commit 提交更改,实际上就是把暂存区的所有内容提交
到当前分支(暂存区也没空,不然怎么 git diff)。
文件状态
untracked unmodified / tracked modified staged committed
git 指跟踪 tracked 的文件,也就是 git add filename 之后的,在 staged 状态,changes to be committed
modified 之后 git status 看到 Changes not staged for commit
git status
查看
.gitignore 文件
文件 .gitignore 的格式规范如下:
- 所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配。
- 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
例子
1 | # 此为注释 – 将被 Git 忽略 |
查看已暂存未暂存的更新
回顾下
git diff
3 个地方 2 种比较git diff
#是工作区(work dict)和暂存区(stage)的比较git diff --cached
#是暂存区(stage)和分支(master)的比较
以可以在 add 前看一个 diff,在 commit 之前也看一次 diff
1 | git diff |
移动文件或改名
git mv file_from file_to
分解为下面三条
1 | $ mv README.txt README |
穿越版本
修改文件 (掌握 working tree 状态)
- 随时掌握 working tree 状态用
git status
- 如果
git status
告诉你有文件被修改过,可以使用git diff <filename>
来查看不同
- 使用
git status
可以看目前状态,每次修改
文件后可以查看
要看文件具体修改了什么,用git diff <filename>
知道修改了什么后就可以放心用git add <filename>
添加到工作区
这里如果在使用git commit
之前用git status
看就是会提示 modified readme.md
1 | $ git status |
然后git commit
再用git status
。
1 | $ git status |
Git 告诉我们当前没有需要提交的修改(nothing to commit),而且,工作目录是干净(working tree clean)的
版本回退
- 手动存盘,就是这个
commit
的 - 用
git log
来查看用了哪些 commit,对应有-m “”的内容,作者 时间,所以这个-m 一定要写 - 加参数的
git log --pretty=oneline
1 | $ git log --pretty=oneline |
好长前面的是 hash 算出来的数
怎么知道当前版本呢用
HEAD
表示当前版本,上一个是HEAD^
,上上一个HEAD^^
,一次类推。简写HEAD~2
HEAD
可以看成是一个指针。- 知道了版本号,怎么回去用呢?用
git reset
1 | //这里表示回到上一个版本 |
- 但回到过去后再用
git log
就没有未来版本的HEAD
怎么办?
用git reflog
来查看
1 | $ git reflog |
HEAD
指向的是当前版本,允许我们用git reset --hard HEAD
来在不同版本之间穿梭
用git log
和git reflog
一个看过去,一个看未来 确保不会丢HEAD
管理修改
- 因为 Git 跟踪并管理的是修改,而非文件。
第一次修改 -> git add -> 第二次修改 -> git commit
你看,我们前面讲了,Git 管理的是修改,当你用 git add 命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit 只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
撤销修改 用版本库里的版本替换工作区的版本
命令git checkout -- readme.txt
(不是git checkout
有—)意思就是,把 readme.txt 文件在工作区的修改全部撤销,这里有两种情况:
一种是 readme.txt 自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库
一模一样的状态;
一种是 readme.txt 已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区
后的状态。
总之,就是让这个文件回到最近一次 git commit 或 git add 时的状态。就是stage暂存库
咯
- 一种是 add 添加到了 stage,用
git reset HEAD file
撤销修改 - commit 到了版本库了呢,用
git reset
场景 1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file
。场景 2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD file
,就回到了场景 1,第二步按场景 1 操作。场景 3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节
git reset --hard HEAD
,不过前提是没有推送到远程库。
删除文件 (删除也是修改哦)
- 首先自己在 working directory 中删了,但怎么把 stage repository 中也删了呢?
- 现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令
git rm
删掉,并且git commit
: - 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
git checkout -- test.txt
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
当然还能从版本库中删除,不顾版本库能 reset
远程仓库
添加到远程仓库
- 第 1 步:创建 SSH Key。在用户主目录下看有没有.ssh 目录,里面有没有 id_rsa 和 id_rsa.pub 这两个文件。没有就用命令创建。
1 | //使用默认值,一路回车 |
- 第 2 步:登录 github,点击头像,”setting”, “SSH and GPG keys”页面。点击”New SSH key”填好 title,复制 id_rsa.pub。这样就添加好了,用来使 github 识别这个推送是你发起的。
现在情况是我们只是在本地建立库,但没有在 github 上建立,为了保持同步,所以得现在 github 上手动建立一个同名的仓库,这步省不了
可以看到有提示,可以与本地已有的库关联,就 2 条命令
1 | //添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。 |
1 | //以后提交不需要加-u |
- 要关联一个远程库,使用命令 git remote add origin git@server-name:path/repo-name.git;
- 关联后,使用命令 git push -u origin master 第一次推送 master 分支的所有内容;
- 此后,每次本地提交后,只要有必要,就可以使用命令 git push origin master 推送最新修改;
上面是从本地到远程
当然也有从远程到本地咯,用git clone <这里加远程库的git地址git://开头的>
记住克隆不是关联 remote 哦,所以没事就是下载。
要推送得先关联,
push 过去还有个问题
1 | git remote add origin git@github.com:xuoutput/xuoutput.github.io.git |
还有个坑的, hexo d
之后首页没有变化
这个你要修改下配置文件才会发生变化,好气啊,不知道什么鬼设定
分支管理
还有关于 git 库的,不需要删了库中的内容重新提交,只要你直接提交,那个库就按你最新的文件内容更改。
比如原来库中是文件 abc,你要改成文件 456,不需要删了 abc,直接本地工作区删了 abc,commit 文件 456,库中就没有 abc 了,这个库中哦不是 append,
stash 存储和清理
1 | // 全部清空 |
参考
配置参考
1 | 1 [user] |
alias 用的多的是用 oh-my-zsh 的自带的 ~/.oh-my-zsh/plugins/git/git.plugin.zsh