git介绍
git 学习参考lainxuefeng
1. 创建版本库
- git init
- git add xx
- git commit -m “xxx”
- git status
- git diff
- git log
如果嫌输出信息太多,看得眼花缭乱的,可以试试加上–pretty=oneline参数:
git log --pretty=oneline
需要友情提示的是,你看到的一大串类似db3976…的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示
2. 回退版本
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交1094adb…(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD,上上一个版本就是HEAD,当然往上100个版本写100个比较容易数不过来,所以写成HEAD~100。
- git reset
回退到上一个版本,使用命令为:
git reset --hard HEAD^
想要回到 “command git checkout”
需要执行
git reset --hard 5730
回退到刚才被删除的节点
详解请参考廖雪峰版本回退 - 2.2 git reflog
查看操作记录
现在总结一下:
- HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令
git reset --hard commit_id
。 - 穿梭前,用
git log
可以查看提交历史,以便确定要回退到哪个版本。 - 要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本
3. 工作区和暂存区
- 工作区(Working Directory):本地能看到的目录
- 版本库(Repository)
工作区有一个隐藏目录.git
,这个不算工作区,而是Git的版本库。 - 暂存区(statge):Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向
master
的一个指针叫HEAD
。
我们把文件往Git版本库里添加的时候,是分两步执行的:
- 第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区; - 第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
4.管理修改
Git跟踪并管理的是修改,而非文件。
- 涉及到
git diff
git diff命令比较的是工作目录中当前文件与暂存区快照之间的差异,也就是修改之后还没有暂存起来的变化内容。
分为两种情况,一种是当暂存区中有文件时,另一种是暂存区中没有文件。
-
(1)当暂存区中没有文件时,git diff比较的是,工作区中的文件与上次提交到版本库中的文件。
-
(2)当暂存区中有文件时,git diff则比较的是,当前工作区中的文件与暂存区中的文件。
而 git diff HEAD -- file
,比较的是工作区中的文件与版本库中文件的差异。HEAD指向的是版本库中的当前版本,而file指的是当前工作区中的文件。
注意:git diff本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。所以,有时候你一下子暂存了所有更新过的文件后,运行git diff后却什么也没有,就是这个原因。
如果要查看已暂存的将要添加到下次提交里的内容,可以使用git diff --cached
或者git diff --staged
。
5.撤销修改
撤销修改的三个场景
-
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file
。 -
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。 -
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节:
git reset --hard commit_id
,不过前提是没有推送到远程库。 -
场景4:已经提交修改版本库,回退到之前的某个节点,但是像保留修改。(将修改撤回到暂存区)
git reset --soft commit_id
git reset –-soft:回退到某个版本,只回退了commit的信息,不会恢复到index file一级。如果还要提交,直接commit即可;
git reset HEAD file
将修改撤回到工作区
6.删除文件
在Git中,删除也是一个修改操作.
- 一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了
$ rm test.txt
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status
命令会立刻告诉你哪些文件被删除了:
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm file
删掉,并且git commit
提交:
小提示:先手动删除文件,然后使用git rm <file>
和git add<file>
效果是一样的
- 另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
git checkout – test.txt
git checkout file
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以"一键还原"。
7.远程仓库
7.1 添加远程库
- 注册github账号,并创建远程仓,具体参照廖雪峰远程仓创建
在GitHub上的这个learngit仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。 - 添加远程仓:
根据GitHub的提示,在本地的learngit仓库下运行命令
git remote add origin git@github.com:songpfei/learngit.git
添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
更多远程仓操作见link
查看关联的远程仓库
git remote -v
- 就可以把本地库的所有内容推送到远程库上:
$
git push -u origin master
由于github创建的默认仓已经在初始化的时候commit 了read.me文件,报错,解决方案见lin’k
git仓库中已经有一部分代码,所以它不允许你直接把你的代码覆盖上去。于是你有2个选择方式:
1,强推,即利用强覆盖方式用你本地的代码替代git仓库内的内容
git push -f
2,先把git的东西fetch到你本地然后merge后再push
$
git fetch
$git merge
这2句命令等价于
$
git pull
再次执行:git push -u origin master
,将本地仓内容推送至远程仓
7.2 从远程库克隆
获取远程仓的地址,用命令git clone
克隆一个本地库
Git支持多种协议,包括https
,但通过ssh
支持的原生git协议速度最快
有序列表:Ctrl/Command + Shift + O
无序列表:Ctrl/Command + Shift + U
插入链接:Ctrl/Command + Shift + L