首先理解几个概念:
1.工作区:在当前仓库中,新增,更改,删除文件这些动作,都发生在工作区里面。
2.暂存区(stage/index):在版本库.git目录下,有一个index文件。它实际上就是一个包含文件索引的目录树,像是一个虚拟的工作区。在这个虚拟工作区的目录树中,记录了文件名、文件的状态信息(时间戳、文件长度等),文件的内容并不存储其中,而是保存在Git对象库(.git/objects)中,文件索引建立了文件和对象库中对象实体之间的对应。如果当前仓库,有文件更新,并且使用git add命令,那么这些更新就会出现在暂存区中。
3.版本库: 当前仓库下,如果没有任何的提交,那么版本库就是对应上次提交后的内容。"HEAD" 实际是指向master分支的一个“游标”。
当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
一. git配置
1.配置用户名 git config --global user.name "ternence"
2.配置邮箱 git config --global user.email ternence@leomaster.com
3.配置编辑器 git config --global core.editor emacs,缺省情况下会使用vi编辑器
4.获取所有设置 git config --list
5.获取帮助 git help
二.初始化
1.如果已有一个远程的git版本库,克隆一份即可 git clone [url]
2.当有了工作记录,可以先进入工作目录,初始化git仓库 git init ,添加文件 git add .,之后将本地代码添加到远程服务器中, git remote add origin git://github.com/someone/another_project.git
三.仓库
1.查看远程仓库 git remote -v
2.添加远程仓库 git remote add [name] [url]
3.删除远程仓库 git remote rm [name]
4.修改远程仓库 git remote set-url --push [name] [newUrl]
5.拉取远程仓库git pull [remoteName] [localBranchName]
6.推送远程仓库git push [remoteName] [localBranchName]
7.查看远程服务器仓库状态git remote show origin
四.分支
1.新建分支 git branch branchName
2.切换分支 git checkout branchName
3.查看本地分支 git branch
4.查看远程分支 git branch -r
5.查看所有分支 git branch -a
6.删除本地分支 git branch -d branchName(强制删除用-D)
7.删除远程分支 git push origin :branchName
8.合并分支 git merge branchName
9.从主分支master创建branch_1.0分支 git branch branch_1.0 master
10.将分支branch_1.0重命名为branch_2.0 git branch –m branch_1.0 branch_2.0
五.提交更改
1.添加文件到暂存区 git add fileName
2.添加所有文件 git add .
3.提交更改 git commit -am “”
4.拉取服务器代码 git pull
git pull <远程主机名> <远程分支名>:<本地分支名>
取回origin主机的next分支与本地master分支合并 git pull origin next:master
取回origin主机的next分支与本地next分支合并 git pull origin next
在git clone的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也可以手动建立追踪关系,指定master分支追踪next分支:git branch --set-upstream master origin/next。如果当前分支与远程分支存在追踪关系,可以省略远程分支名:git pull origin。如果当前分支只有一个追踪分支,则主机名也可以省略:git pull
5.本地代码提交到服务器 git push
git push <远程主机名> <本地分支名>:<远程分支名>
git push origin master:develop_1.0 将本地master代码推送到远程origin仓库的develop_1.0分支
将本地master分支代码推送到与之存在追踪关系的远程分支 git push origin master,如果远程没有master分支,master分支会被创建。
省略本地分支,相当于删除指定远程分支,相当于推送一个空的本地分支到远程分支git push origin :master.
如果当前分支与远程分支存在追踪关系,则git push origin即可,如果当前分支只有一个追踪分支,可以省略主机名: git push 。
如果当前分支与多个主机存在追踪关系,则也可以指定一个默认主机,git push –u origin master将本地master分支推送到origin主机,并指定origin为默认主机。
git push 只会推送当前分支,即simple方式,默认为simple方式。matching模式会推送所有有对应远程分支的本地分支,可以自己更改模式: git config --global push.default matching/git config --global push.default simple.也可以不管远程有无对应分支,把本地的所有分支都推送到远程分支:git push –all origin
6.查看提交记录 git log
7.查看提交的细节 git show cbe1249b140dad24b2c35b15cc7e26a6f02d2277
7.查看文件状态 git status
8.删除一个文件 git rm filename
9.比较工作区和暂存区的差别 git diff
10.比较暂存区与版本库之间的差异 git diff --cached/git diff --staged
11.比较两次提交提交之间的差异 git diff tag1 tag2
12.比较两个分支之间的差异 git diff branch1 branch2
13.比较工作区和版本库的差异 git diff HEAD
六.回退
这部分内容理解起来不是很容易,我只是列出了我们工作中可能会遇到的几个场景,几个常用的命令,想要深入理解的话自己再找找资料,使用的时候也要慎重。
1.将最近的一次提交抹除掉,git reset --hard HEAD~1(工作区,暂存区,版本库都没了)
2.将最近的一次commit回退到工作区git reset --soft HEAD~1(暂存区和工作区中的内容不作任何改变,仅仅把HEAD指向<commit>。这个模式的效果是,执行完毕后,自从<commit>以来的所有改变都会显示在git status的"Changes to be committed"中)
3.回滚add操作:
场景:编辑了一些文件,执行了git add。但此时需要你pull,则可以使用git reset。这个命令只是撤销了git add操作,但你原来编辑的东西都还在工作区。
4.回滚最近一次commit:
场景:commit之后发现没有提交完整,比如没有执行添加操作,图片没有添加进去,或者comment写的不好想改一下,则可以使用git reset --soft HEAD^.HEAD^指向HEAD之前最近的一次commit
5.回滚最近几次commit:
场景:提交了一些commit,但发现这些提交还不是很成熟,不能push到当前分支,希望新开一个分支继续工作,则可以使用git branch improvement在当前分支的基础上新建优化分支,然后使用 git reset --hard HEAD~3回滚优化分支上的最近三次提交。
6.永久删除最后几个commit:
git reset --hard HEAD~3
7.回滚merge和pull操作:
场景:pull下来一些更新,但是产生了很多冲突,暂时不想去解决这些冲突,想回退回去。则可以使用git reset --hard 以清除暂存区和工作区被破坏的东西。
Pull下来并merger后发现此时merger时机不对,想要回退回去,则可以使用git reset --hard ORIG_HEAD.但这样会清空你的工作区,尚未add的改变会丢失,使用git reset --merge ORIG_HEAD命令可以避免这个问题。
8.工作被中断:
场景:你正在develop分支工作,突然间有一个bug需要在master分支修复,则可以先git commit,切换到master分支,解bug,解完后切换到develop分支,使用git reset --soft HEAD^和git reset两个命令帮你回到之前的状态。
9.reset单独一个文件:
场景:你已经添加了一个文件,之后又不打算把这个文件提交,使用git reset text.h即可
10.保留工作区并丢失一些之前的commit:
场景:你正在master分支编辑一些文件,并且已经提交,但你发现你这些东西应该在develop分支,则可以先commit,切换到develop分支,执行git reset --keep tag命令,可以把tag之后的commit清除掉,但不会改变工作区。(tag可以使用git log找到)