创建版本库
版本库又名仓库,可以简单的理解为一个目录,目录里所有的文件都可以被管理起来,每个文件的修改删除,git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还原
第一步,选择一个合适的地方,创建一个空目录
$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit
pwd用于显示当前目录
第二步,通过git init把目录变成git可以管理的仓库
$ git init Initialized empty Git repository in /Users/michael/learngit/.git/
把文件添加到版本库
第一步,用git add告诉Git,把文件添加到仓库
git add readme.txt
第二步,用git commit告诉Git,把文件提交到仓库。-m输入的是本次提交的说明,可以方便的从历史记录找到改动记录。commit可以一次提交很多文件
git commit -m "wrote a readme file"
时光穿梭机
修改readme.txt文件。
运行git status查看结果。git status命令可以让我们时刻掌握工作区的状态。
git status告诉你文件有没有被修改过,git diff查看修改内容
版本回退
HEAD指向的版本就是当前版本,HEAD^指向的是当前版本的上一个版本,HEAD^^当前版本的上上个版本……上100个版本写成HEAD~100
版本穿梭使用命令 git reset --hard commit_id, commit_id是版本号
穿梭前,使用git log查看提交历史,以便确定退回哪个版本
要重返未来,用 git reflog 查看命令历史,以便确定回到未来哪个版本
工作区和暂存区
工作区电脑里能看到的目录,比如learning文件夹就是一个工作区
版本库(Repository)
Git版本库存了很多东西,最重要的就是stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针HEAD
第一步,git add把修改及新增的文件添加到暂存区
第二步,git commit提交更改,把暂存区的内容提交到当前分支
在没有自己创建分支的情况下,git commit就是往master分支提交更改
管理修改
git diff HEAD -- readme.txt 查看工作区和版本库最新版本的区别
撤销修改
场景一,修改了工作区的内容,丢弃工作区的修改,使用 git checkout -- file
场景二,修改了工作区的内容,还添加到了暂存区。分两步 git reset HEAD <file>,然后按照场景一继续操作
场景三,已经提交不合适的修改到版本库时,使用 版本回退 ,前提是没有推送到远程仓库
删除文件
方式一,rm file然后 git rm <file> 或者git add <file>,再git commit
方式二,git rm <file> ,再git commit
如果是工作区误删,可以运行 git checkout -- <file>,git checkout是用版本库里的版本替换工作区的版本,无论是修改还是删除,都可以还原
远程仓库
添加远程仓库
关联远程仓库,使用 git remote add origin git@server-name:path/repo-name.git
关联后,使用 git push -u origin master 第一次推送master分支的所有内容,-u不但会把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来
此后,每次提交直接 git push origin master 推送最新修改
从远程仓库克隆
要克隆一个仓库,首先需要知道仓库的地址,然后使用git clone命令克隆
Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快
查看,删除,重命名远程分支
查看远程分支 git branch -a
本地分支push到远程 git push origin <branch-name>:<branch-name>
删除远程分支 git push origin --delete <branch-name> 或者 git push origin :<branch-name> (推送一个空分支到远程分支,其实就是相当于删除远程分支)
删除远程tag git push origin --delete tage <tag-name> 或者 git tag -d <tag-name> & git push origin :refs/tags/<tag-name>
分支管理
创建与合并分支
第一步,在本地创建dev分支,然后切换到dev分支 git checkout -b dev
git checkout 加上-b参数表示创建并切换,相当于以下两条命令
git branch dev
git checkout dev
第二步,git branch 会列出所有分支,当前分支前会标一个*号
第三步,切换回master分支,git checkout master
第四步,合并某分支到当前分支 git merge <name>
第五步,删除分支 git branch -d <name>
解决冲突
Git无法自动合并分支时,必须首先解决冲突,再提交,合并完成。
解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
git log查看分支历史,git log --graph命令可以看到分支合并图, 后面加上 --pretty=oneline 单行显示历史提交--abbrev-commit
分支管理策略
合并分支时,加上--no-ff参数就可以使用普通合并模式,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来做过合并
Bug分支
修复bug时,会通过创建新的bug分支进行修复,然后合并,最后删除
步骤一,当手头工作没有完成时,先把工作现场 git stash
步骤二,然后切回master分支,从master拉出一个issue分支,修复bug
步骤三,切回工作分支git stash list查看stash内容
步骤四,git stash pop恢复(或者git stash apply恢复,然后git stash drop删除,因为git stash apply不删除stash内容,如果有很多次stash可以使用git stash apply@{0})
Feature分支
开发一个新feature,最好创建一个新分支
如果要丢弃一个没有被合并过的分支,可以通过 git branch -D <name>强行删除
多人协作
查看远程库信息,使用git remote -v
本地新建的分支如果不推送到远程,对其他人就是不可见的
本地推送分支,使用 git push origin branch-name,如果推送失败,先用 git pull抓取远程新的提交
在本地创建和远程分支对应的分支,使用 git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致
建立本地分支和远程分支的关联,使用 git branch --set-upstream branch-name origin/branch-name git branch --set-upstream-to=<remote-branch-name> <local-branch-name>
从远程抓取分支,使用 git pull,如果有冲突先处理冲突