Git学习笔记
初学git,参考廖雪峰老师的Git教程学习。
一、本地版本库的管理
1. 创建版本库
$ mkdir learngit 创建一个空目录(learngit)
$ cd learngit 进入目录(learngit)
$ pwd 显示当前目录
2. 把目录变成Git可以管理的仓库
$ git init 注:目录默认是隐藏的,用ls -ah
命令就可以看见
3. 把文件添加到版本库
$ git add <filename> 把文件添加到仓库,注:不能使用Word和记事本编辑文本,推荐notepad
$ commit -m "instruction" 把文件提交到仓库
4. 修改文档,查看仓库状态并提交修改后的文档
$ git status 查看仓库当前状态
$ git diff <filename> 查看修改的具体信息
$ git add <filename> 添加
$ commit -m "instruction" 提交
5. 快照(commit)
$ git log 显示时间由近到远的提交日志
$ git log --pretty=oneline 显示较少信息的提交日志
$ git reset --hard HEAD^ 把当前版本回退到上一个版本(HEAD^,上上个版本是HEAD^)
$ git reset --hard xxxxx 把版本退回“未来”的版本,xxxxx为未来版本的前几位版本号
$ git reflog 记录每一次命令,可以帮助找回丢失的版本号
6. 工作区和暂存区
git add 命令将文件添加到暂存区;git commit 命令将暂存区的所有文件提交到当前分支
7. 管理修改
$ cat 将某个文档内容显示出来
$ git checkout --<filename> 撤销修改回到最近一次git add或git commit的状态,本质是用版本库里的版本替换工作区的版本
$ git reset HEAD <filename> 将暂存区的修改退回到工作区,然后用git checkout --<filename>
撤销工作区的修改;如果已经提交到了版本库,可以回退版本,前提是没有将本地版本推送到远程
8. 删除文件
$ rm <filename> 删除文件
$ git rm <filename> 从版本库删除文件,之后需要用git commit提交
二、远程仓库
Github是一个提供Git仓库托管服务的网站。
$ ssh-keygen -t rsa -C "youremailaddress@example.com" 创建SSH Key
$ git remote add <仓库名> git@server-name:path/repo-name.git 关联远程库
$ git push origin master 把本地的最新修改推送至GitHub,第一次要在origin之前加-u
$ git clone git@github.com:username/gitskills.git 把远程库克隆到本地
三、创建和合并分支
$ git checkout -b dev 创建dev分支,切换到dev分支
$ git branch dev 创建dev分支
$ git checkout dev 切换到dev分支
$ git branch 查看当前分支
$ git merge dev 合并指定分支到当前分支
$ git branch -d dev 删除dev分支
廖雪峰老师在这里用漫画的形式较为清晰的讲解了创建分支和合并分支的过程。
四、解决冲突
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。
用git log --graph
命令可以看到分支合并图。
$ vi <filename> 打开并编辑文件
五、分支管理策略
$ git merge --no-ff -m "merge with no-ff" dev --no-ff参数表示禁用Fast forward,因为本次合并要创建一个新的commit,所以加上-m
参数,把commit描述写进去。
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
合并分支时,加上--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
六、Bug分支
$ git stash 储存现场
$ git stash list 查看现场
$ git stash apply 恢复现场,但stash中内容不删除
$ git stash drop 删除satsh内容
$ git stash pop 恢复现场同时删除stash内容
后面+stash@{0}(例子)可以对指定内容操作
七、Feature分支
$ git branch -D feature-vulcan(分支名) 强行删除分支
八、多人协作
$ git remote 查看远程库信息
$ git remote-v 查看更详细的信息
$ git push <仓库名> <分支名> 把该分支上的所有本地提交推送到远程库
$ git checkout b dev origin/dev 创建远程origin的dev分支到本地
$ git branch --set-upstream dev origin/dev 指定本地dev分支与远程origin/dev分支的链接
$ git pull 把最新提交抓取下来
多人协作的工作模式通常是这样:
-
首先,可以试图用
git push origin branch-name
推送自己的修改; -
如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull
试图合并; -
如果合并有冲突,则解决冲突,并在本地提交;
-
没有冲突或者解决掉冲突后,再用
git push origin branch-name
推送就能成功!
如果git pull
提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
。
九、标签管理
标签是版本库的一个快照
$ git tag <tagname> 在最新提交的commit上打标签
$ git tag <tagname> <commit id> 在某次commit上打标签
$ git tag 查看标签
$ git show <tagname> 查看标签信息
$ git tag -a <tagname> -m "instruction" <commit id> 创建带有说明的标签
$ git tag -d <tagname> 删除标签
$ git push origin <tagname> 将标签推送到远程
$ git push origin --tags 推送全部尚未推送的本地标签
$ git push origin :refs/tags/<tagname> 删除远程标签,前提:删除本地标签
十、使用GitHub
十一、使用码云
$ git remote rm origin 删除已有的远程库
十二、自定义Git
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
$ git config --global color.ui true
十三、忽略特殊文件
在Git工作区的根目录下创建一个特殊的.gitignore
文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
$ git add -f <filename> 强制添加文件
$ git check-ignore -v <filename> 检查
十四、配置别名
$ git config --global alias.<别名> <命令名>
e.g.
$ git config --global alias.co checkout
$ git config --global alias.unstage 'reset HEAD'
$ git config --global alias.last 'log -1' 显示最后一次提交信息
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
配置Git的时候,加上--global
是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。每个仓库的Git配置文件都放在.git/config
文件中。当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig
中。
十五、搭建Git服务器