前言
本文对指令按照使用场景(建库,查看,修改,分支)进行分类归纳,介绍指令基本含义和用法,方便查阅。
工作区、版本库和暂存区
- 工作区:就是你在电脑里能看到的目录,比如我的learngit文件夹就是一个工作区。
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
- 暂存区:Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
我们把文件往Git版本库里添加的时候,是分两步执行的:
- 第一步是用
git add
把文件添加进去,实际上就是把文件修改添加到暂存区; - 第二步是用
git commit
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在git commit就是往master分支上提交更改。
简单理解:需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
本地库和远程库
新建仓库
- 建立远程库(为空,不要加
README.md
,不然后面会push
不上去) - 本地新建文件夹
git init
初始化仓库,可以发现当前目录下多了一个.git
的目录,这个目录是Git来跟踪管理版本库的。勿人为瞎改- 远程库的名字就是origin,这是Git默认的叫法
git remote add origin git@github.com:michaelliao/learngit.git
这个命令是在本地的learngit
仓库下执行的。这两个地方的仓库名不需要相同,因为会通过在本地的仓库目录下执行这条命令(命令中包含远程库的名字)已经将两者建立了联系git push -u origin master
把本地库的所有内容推送到远程库上。把本地库的内容推送到远程,用git push
命令,实际上是把当前分支master推送到远程。由于远程库是空的,我们第一次推送master分支时,加上了-u参数(推送和关联),Git不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。git push origin master
每次本地提交后,推送最新修改到远程库
从远程库克隆
假设github上面已经有一个远程库,但是本地没有,需要克隆到本地,远程库的名字叫gitskills
git clone git@github.com:michaelliao/gitskills.git
克隆一个本地库,则在当前文件夹下会多一个gitskills
的文件夹cd gitskills
进入克隆下来的本地库,默认的名字是和github上的一样的git push origin master
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上
常用查看指令
git status
查看仓库当前的状态git diff 文件名
查看对文件做什么修改git diff 版本号1 版本号2 --stat
查看两个版本的差异的文件列表,包括被修改行数和增删图。参数改为--name-status
前面显示修改说明字母(A,M等),无行数git log
显示从最近到最远的提交日志git log --pretty=oneline
简化日志输出的显示信息,commit id
很长git reflog
记录你的每一次命令,最先显示的是这个命令执行之后的版本的版本号的前七位,这样就算你清屏了或者重启了,也能找到某个版本的版本号,就可以轻松回退到那个版本git branch
查看当前所在的分支。git branch
命令会列出所有分支,当前分支前面会标一个*号git log --graph --pretty=oneline --abbrev-commit
用带参数的git log
可以看到分支的合并情况。用git log --graph
命令可以看到分支合并图git remote
查看远程库的信息git remote -v
显示更为详细的信息
常用修改指令
git add readme.txt
添加,但是不提交git commit -m "提交描述"
提交,只有add
后提交才有效。“改文件->add文件->再改->提交”
,则第二次修改无效,不会被提交,只会成功提交第一次的修改。
修改commit版本中的注释
修改已经commit版本里面的注释1
2
3
4
5
6
7
8
9//如果你的注释写错了
$ git commit --amend
//如果需要修改当前版本的倒数第二次状态
$ git rebase --i HEAD~2
//会出现pick:***的几行,将你要改的那行的pick改成edit然后退出
//这时使用$ git log你会发现最上面的版本已经变成了你想改的那个
$ git commit --amend
//修改版本提交注释之后执行下面的就成功了
$ git rebase --continue
撤销修改和版本回退
git checkout -- 文件名
把没暂存(即没add)的干掉,或者说,丢弃工作区,回到到暂存状态git reset HEAD 文件名
把暂存的状态取消,工作区内容不变,但状态变为“未暂存”。
简单来说,没有add过的修改,只需要git checkout -- 文件名
即可撤销;add 过的修改,先git reset HEAD 文件名
变成没add 过的修改,再git checkout -- 文件名
撤销。git reset --hard HEAD^
会回退到上一个版本git reset --hard 某版本号前几位
通过命令行上的历史信息(假如你没清屏的话),找到某版本 的版本号回到指定版本。不一定要全部的版本号,就像这个命令的例子,只要前面的约7、8位这样就可以。
分支管理
创建和合并分支
git checkout -b dev
创建一个新的分支:dev
,并且会切换到dev分支。所以这条命令有两个作用。git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:git branch dev
和git checkout dev
git branch dev
,新建分支是新建指针,指向当前commitgit checkout dev
切换到dev分支git checkout master
dev分支的工作完成,我们就可以切换回master分支(此时在dev分支的修改在master上是看不到的)git merge dev
这是在master分支上执行的命令,作用是:把dev分支上的工作成果合并到master分支上git branch -d dev
删除已合并的分支。删除分支就是删除指针git branch -D dev
Git友情提醒,dev分支还没有被合并,如果删除,将丢失掉修改,如果要强行删除,需要使用git branch -D dev
命令