常用命令:
- git init
初始化目录为git管理的仓库,增添.git目录,可以是非空目录
- git log
显示日志信息,包括时间和提交者等信息
显示当前的HEAD和它的祖先的,递归是沿着当前指针的父亲,父亲的父亲…这样的原则。
- git log --pretty=oneline
显示单行日志,版本号与注释
- git log --graph --pretty=oneline --abbrev-commit
单行显示日志,以及提交校验码缩略,分支合并图
- git status
检查当前状态,是否存在修改未提交
- git add 文件
将修改添加到暂存区
- git commit -m "注释"
将暂存区中的修改提交到版本库中,加上注释
- git commit -amend
修改上一版本的提交信息,如:注释
- git reset --hard HEAD^
commit之后对版本的回推,HEAD^表示上一版本,HEAD^^表示上上一版本,HEAD^100表示往前数第100版本
- git reflog
检查所有提交过的版本
帮助你恢复你误操作的数据,例如你错误地reset了一个旧的提交,或者rebase(把本地未push的分叉提交历史整理成直线),…,可以使用reflog去查看在误操作之前的信息,并且使用git reset --hard 去恢复之前的状态。
其中,HEAD@{2}表示HEAD指针在两次移动之前的情况,HEAD与分支有关。
- git reset --hard 版本号
(git reset是git commit的反向命令)
commit之后对版本的回推,按照版本号回推
与其他分支内的提交合并的修改可以被回推回来,已经删除的分支无法回推
- git checkout -- 文件名
(git checkout是git add的反向命令)
撤销暂存区(撤销修改就回到添加暂存区后的状态)或工作区(还没有放到暂存区,撤销回到和版本库一模一样的状态)对文件的修改
git checkout接受分支名称和文件(路径)名称,因此可以使用--强制git将--之后的任何内容解释为文件名,即使它本来是有效的分支名称。
- git checkout .
用暂存区全部文件替换工作区的文件
这两个操作很危险,会清除工作区中未添加到暂存区中的改动。
- git checkout HEAD .与git checkout HEAD 文件名
会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。
这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
- git reset HEAD 文件名
将文件移出暂存区(再使用 git checkout -- 文件名 就能恢复为最原始状态)
git reset HEAD 暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
- git branch
查看分支,当前分支标记*号
- git checkout -b 分支名称
创建并切换分支,相当于git branch 分支名(创建)与git checkout 分支名(切换)两条命令
- 创建并切换分支,相当于git branch 分支名(创建)与git checkout 分支名两条命令
切换分支,在merge过程未结束时无法切换
- git merge 分支名称
合并分支到当前分支,冲突部分会出现由>>>,===,<<<标记的文件中分支间不同的信息
注意merge中的冲突解决后,需要进行add和commit进行提交,才能真正解决冲突
- git merge –no-ff -m “注释” 分支名称
保留分支信息,在log中,分支commit的版本保留可见
- git branch -d 分支名称
删除分支
- git stash
隐藏当前分支的修改(工作区和暂存区未提交内容),否则无法转换到其他分支,而分支commit后不用保存
- git stash list
查看隐藏历史列表
- git stash apply
将最新隐藏的修改恢复;
如果在其他分支恢复,就会将修改自动merge到该分支;
如果本分支有本地修改,就需要add,再apply进行auto-merge的冲突处理,提交一个新的版本
- git stash drop
删除最新的隐藏历史
- git stash pop
从隐藏历史列表中取出最新内容并删除
- git remote –v
查看远程库的详细信息
- git remote add <short name><remote URL>
例如:git remote add origin 远程库地址
给本地库添加远程仓库,名称定为short name
远程主机的默认名称是origin
- git remote rm <destination>
从存储库中删除远程连接
- git remote rename <old name><new name>
给远程仓库重命名(short name)
- git push 远程主机名 本地分支名:远程分支名
将本地分支修改推送给远程库分支
如果本地分支名与远程分支名相同,则可以省略绿色的部分
- git pull 远程主机名 远程分支名:本地分支名
将远程库的分支与本地分支同步(git pull是相当于从远程仓库获取最新版本,然后再与本地分支merge)
如果远程分支是与当前分支合并,省略绿色的部分
git pull = git fetch + git merge
- git fetch
更安全也更符合实际要求,因为可以在merge前,查看更新情况,根据实际情况再决定是否合并。
FETCH_HEAD: 某个branch在服务器上的最新状态。
- git clone 远程库地址
将其他仓库克隆到本地,包括被clone仓库的版本变化
(本地无需git init, .git文件夹里存放着与远程仓库一模一样的版本库记录)
- git diff
查看工作区和暂存区差异
- git diff --cached
查看暂存区和版本库差异
基本知识:
工作区,版本库与暂存区(stage):
工作区:指的是在电脑里能看到的目录
版本库(Repository):是.git目录,Git的版本库里存了很多东西,其中最重要的就是称为stage(.git目录的index文件)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD(HEAD 指向最近一次commit里的所有snapshot)。
与Git的最主要的区别?
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,干活的时候,用的都是自己的电脑,必须联网才能工作。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,工作的时候就不需要联网,多个人协作时,只需把各自的修改推送给对方,就可以互相看到对方的修改了。
git比svn优秀:git跟踪并管理的是修改,而不是文件
分支管理:
通常合并分支时,git一般使用”Fast forward”模式,在这种模式下,删除分支后,会丢掉分支信息,现在我们来使用带参数 –no-ff来禁用”Fast forward”模式。
首先master主分支应该是非常稳定的,也就是用来发布新版本,一般情况下不允许在上面干活,干活一般情况下在新建的dev分支上干活,干完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。
bug分支(临时分支):
在开发中,会经常碰到bug问题,那么有了bug就需要修复,在Git中,分支是很强大的,每个bug都可以通过一个临时分支来修复,修复完成后,合并分支,然后将临时的分支删除掉。
Git还提供了一个stash功能,可以把当前工作现场dev隐藏起来,等以后恢复现场后继续工作。
一般情况下,要推送的分支有:
- master分支是主分支,因此要时刻与远程同步。
- 一些修复bug分支不需要推送到远程去,可以先合并到主分支上,然后把主分支master推送到远程去。