人生有时候就是这么奇妙,在我刚准备接触Git的时候,GitHub 官方文档推出中文版。
一、Git的安装
首先,你可以试着在Terminal输入git,看看系统有没有安装Git。
安装步骤:
1,安装homebrew
2,通过homebrew安装Git:brew install git
具体方法请参考homebrew的文档:http://brew.sh/
检测是否安装成功:git --version 显示git的当前版本
二、Git的使用
参考廖雪峰的课程,本着“把书读薄”的精神,此处对课程内容做了精简和顺序调整。有关终端的操作指令同Linux指令。好的,现在打开Terminal开始进行操作。
1,创建版本库
# 1,创建文件夹
$ pwd # 显示当前文件夹
$ mkdir LearnGit # 新建文件夹,LearnGit是自定义的文件夹名字
$ cd LearnGit # 打开新建的文件夹
# 2,创建git版本库
$ git init # 把当前目录变成Git可以管理的仓库, .git文件是Git来跟踪管理版本库的,尽量不要手动修改这个目录里面的文件,会破坏Git仓库。
2,文件的修改
Git版本库的工作原理:因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git add把文件修改添加到暂存区;git commit就是往master分支(当前分支)上提交更改:
暂存区提交后:
# 1,添加文件
# 假设现在已编写一个readme.txt文件,将其放入本地的版本库LearnGit里
# 注意,一定要放在LearnGit目录下(子目录也行)
# 两步:
$ git add readme.txt # 把文件添加到仓库
$ git commit -m "<massage>" # <massage>是本次提交的说明
$ cat readme.txt # 查看文件的内容
# 注意,每次修改,如果不用git add到暂存区,那就不会加入到commit中。
# 2,查看当前Git版本库的状态
$ git status
$ git diff "FileName" # 查看文件的修改内容
# 3,查看版本修改日志
$ git log # 显示详细的历史记录,HEAD是对应当前版本的指针
$ git log --pretty=oneline # 一行显示内容包括版本号(commit ID)和<massage>,所以<massage>很重要
# 4,返回旧版本
$ git reset --hard HEAD^ # 回到上一版本
$ git reset --hard "commit ID" # 返回到commit ID对应的版本,即阔以回到未来
$ git relog # 查看历史版本的commit ID
# 5,撤销修改
# 先查看当前版本库的状态
$ git status
# 情景1,未被放进暂存区,文件还在工作区
$ git checkout -- readme.txt
# 情景2,已放进暂存区,但未提交
$ git reset HEAD readme.txt # 返回情景1
$ git checkout -- readme.txt
# 情景3,已提交,但未推送到远程库
# 参考4,返回旧版本
$ git relog
$ git reset --hard "commot ID"
# 6,删除文件
$ rm readme.txt # 直接在文件管理器中把没用的文件删了
# 选择1,确实需要删除
$ git rm readme.txt
$ git commit -m "<massage>"
# 选择2,误删
$ git checkout -- readme.txt # 用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”
# 注意,从来没有被添加到版本库就被删除的文件,是无法恢复的!
3,分支的处理
Git的默认分支是master,指针HEAD严格来说是指向当前分支的。
3.1 基本操作
# 1,创建分支
$ git checkout -b 分支名
# 2,查看当前分支
$ git branch # 当前分支带*号
# 3,切换分支
$ git checkout 分支名
# 4,创建+切换分支
$ git checkout -b 分支名
# 5,合并某分支到当前分支
$ git merge 分支名
$ git merge --no-ff -m "<massage>" 分支名
# 该指令在合并同时创建一个新的commit,所以加上-m参数,把commit描述写进去
# 合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并
# 而fast forward合并就看不出来曾经做过合并
# 6,删除分支
$ git branch -d 分支名
3.2 分支冲突
Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容。
问题情景:
在分支上修改文件并提交,切换到master分支后再次修改文件并提交,然后在进行分支合并时,会出现冲突
解决方法:
把Git合并失败的文件手动编辑为希望的内容,再提交,最后删除分支。
# 用带参数的git log也可以看到分支的合并图
$ git log --graph --pretty=oneline --abbrev-commit
3.3 暂存当前分支任务
流程:
$ git stash # 暂存
$ git status # 查看当前状态
$ git checkout 分支名 # 切换到需要debug的分支
$ git checkout -b 临时分支名 # 在debug分支创建临时分支
$ git add 文件名 # debug完成,递交任务
$ git commit -m "<massage>"
$ git checkout 分支名# debug后,切回之前暂存的分支名
$ git merge --no-ff -m "<massage>" 临时分支名 # 合并,提交debug
$ git checkout 暂存分支名
$ git status # 查看当前状态
#工作现场的还原
# 法1,
$ git stash apply # 恢复后,stash内容并不删除
$ git stash drop # 删除stash内容
# 法2,
$ git stash pop # 恢复并删除stash内容
$ git stash list # 查看stash内容
3.4 就地销毁分支
丢弃一个没有被合并过的分支:
$ git branch -d 分支名 # 如果分支没有合并,会有提示
$ git branch -D 分支名 # 强行删除分支
3.5 多人协作
- 用git push origin <分支名> 推送自己的修改;
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并
- 如果合并有冲突,则解决冲突,并在本地提交
- 没有冲突或者解决掉冲突后,再用git push origin <分支名> 推送就能成功
# 1,查看远程库的信息
$ git remote
$ git remote -v # 详细信息
# 2,推送分支
$ git push origin 分支名 # master分支是主分支,因此要时刻与远程同步
# 3,抓取分支
$ git pull
$ git branch --set-upstream-to=origin/dev dev # 设置本地dev分支与远程origin/dev分支的链接
# 4,在本地创建和远程分支对应的分支
$ git checkout -b branch_name origin/branch_name # 本地和远程名称最好一致
# 5,建立本地分支和远程分支的关联
$ git branch --set-upstream branch-name origin/branch-name
4,Github的使用
4.1 本地Git与远程仓库GitHub的连接
先自行注册远程仓库GitHub账号。由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
step 1: 创建SSH Key。
打开Mac的Terminal,输入以下命令即可打开id_rsa和id_rsa.pub所在的文件夹。
$ open ~/.ssh
step 2: 登陆GitHub。
打开“Account settings”,“SSH Keys”页面,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。
4.2 添加远程库
在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步。
登陆GitHub,在右上角找到“Create a new repo”按钮,创建一个新的仓库LearnGit。然后在本地的LearnGit仓库下运行命令:
$ git remote add origin git@github.com:自己的GitHub账户名/LearnGit.git
把本地库的所有内容推送到远程库上:
$ git push -u origin master # 首次推送需要参数 -u
$ git push origin master
# 注意,首推存在SSH的警告,输入yes回车即可
将远程库拉到本地:
$ git clone git@github.com:自己的GitHub账户名/库名.git