本笔记主要参考廖雪峰的git教程:
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/
本笔记对主要内容进行了总结,方便日后进行查阅。若进行全面系统的学习可以去上面的网站学习,讲的很基础,也有实例。
下载安装
- 直接去官网下载,是免费的
设置用户名邮箱
- git config –global user.name “Your Name”
- git config –global user.email “email@example.com”
初始化
- cd到文件夹,用git init
提交到仓库(两个步骤)
- 首先git add filename,将文件放到暂存区stage或者叫index
- 然后使用git commit -m “” 提交,将所有暂存区的内容提交到当前分支,默认是master分支
查看当前仓库的状态
- git status
查看对文件作了什么修改
- git diff filename
重新提交文件
- 查看修改之后,确认没问题了,把文件再提交一下,即add和commit命令
查看修改了什么
- git log,可以查看每次commit的id和修改内容
版本回退
- HEAD表示当前版本,HEAD^表示上一个版本,HEAD^^表示上上个版本,HEAD~100表示往上100个版本
- head其实是一个指针,指向当前版本
- git reset –hard HEAD^,表示回退到上一个版本,回退到其他版本改HEAD^即可
- 如果记得commit id,也可以用git reseet –hard COMMITID, id不用写全,只要不冲突就行
git reflog,记录你的每一个命令,如果忘记commit id,可以通过这个命令查看,最前面的一列就是id
撤销修改
- 使用git checkout – filename,丢弃工作区的修改,实质上是用版本库的文件替换
- 如果还没有add到暂存区,使用git checkout – filename, 可以撤销修改到和版本库一样的状态
- 如果已经add到暂存区,但是还没commit,使用git checkout – filename, 撤回到刚add后的状态
- 如果已经add到暂存区,但是还没commit,又想丢弃add之后的操作,用git reset HEAD filename, 可以把暂存区的内容放回工作区,然后用checkout命令撤销修改
删除文件
- git rm filename命令,在版本库中删除文件,实际上没有删除
- git checkout – filename,用版本库的备份中取出,但是只能恢复到最新版本
协议
- git支持多种协议,包括https、ssh等,建议使用ssh,速度快,不用每次都输入口令
- ssh-keygen -t rsa -C “youremail@example.com”,如果是windows,在C:\Users\Dell下找到.ssh文件夹,里面有一个公钥一个私钥,带.pub的是公钥,把公钥复制到github的account
- 如果是mac系统或者Linux系统,直接cd ~/.ssh,即可找到公钥所在目录
分支管理
- 查看分支:git branch
- 创建分支:git branch
- 切换分支:git checkout ,切换到分支后可以commit,不会影响master的内容
- 创建+切换分支:git checkout -b
- 合并某分支到当前分支:git merge ,合并之后才会更新分支更改的内容
- 删除分支:git branch -d
- 强制删除分支:git branch -D ,如果分支更改了之后merge之前,突然不想要该分支的内容,用上面的删除命令会提示分支尚未合并。所以用这个命令强制删除
- 分支的操作非常快,建议现在分支上操作,再merge到master上
分支冲突
- 当创建了一个分支并提交了修改之后,如果切回master后也对同一个文件提交了修改,那么在merge的时候就会有冲突,需要修改冲突内容才能提交
使用git log –graph可以查看分支的合并图
分支管理策略
- 默认是Fast forward模式,删除分支后,会丢失分支信息
- 如果要强制禁用ff模式,git会在merge时生成一个新的commit,这样,可以从分支历史上看出分支信息。git merge –no-ff -m “merge with no-ff” dev
- 使用master作为正式发布版本,平时在分支以及分支的分支干活以及merge
保存工作现场
- 目前在一个分支如dev工作,还没有到commit的时候。突然有bug或者其他紧急工作要立马完成,需要先把当前工作保存一下。不然的话,修复bug,也会创建一个分支,如bug,还是会看到dev尚未commit的状态,也就是工作区有dev分支的信息,这是我们在bug分区不想看到的
- 在dev分区上使用git stash命令保存工作现场,工作区就很干净了
- 使用git stash list可以查看工作现场
- 使用git stash apply stash@{0}命令可以恢复制定的stash
- 使用git stash apply,恢复工作现场,并且恢复之后stash内容还在,可以用git stash drop删除
- 使用git stash pop在恢复的同时删除工作现场
把本地库和远程库
- 创建远程库,可以再github上创建
- 在本地库运行:git remote add origin git@github.com:username/yourgit.git,username是github账户名,远程库默认为origin,yourgit是远程的不是本地的,这个命令会把当前所在位置的本地库推到远程
- 把本地库的内容推送到远程库:git push -u origin master。第一次推按master分支,加了-u,git会把本地master分支和远程master分支关联。
- 以后只要本地作业提交了,就可以通过命令:git push origin master将本地master分支的最新修改推送到github
- remote origin already exists问题解决:根本原因是你在一个本地仓库提交到了不同的远程仓库,这个时候可以在本地另外选择目录,重新作为本地仓库,再提交
- 本地仓库提交到远程仓库内容没有更新问题解决:提交到远程仓库时,只有本地commit之后,才会有更新
- 本地仓库push到远程仓库的时候,提示updates were rejected because the tip of your current branch is behind问题解决:是小伙伴的提交和你的提交有冲突。可以先用git pull把最新的提交从origin抓取下来,然后再本地合并并解决冲突,再推送
- 使用git pull时,There is no tracking information for the current branch问题解决:原因是没有指定本地分支与origin下分支的链接,使用git branch –set-upstream dev origin/dev,然后再pull
从远程仓库克隆clone
- 查看远程库信息:git remote -v
- git clone git@github.com:username/yourgit.git,会把yourgit克隆到当前所在的本地位置
- 其他小伙伴使用clone命令只能看到master分支,如果大家都用dev作为开发分支,需要创建远程origin的dev分支到本地:git checkout -b dev origin/dev,然后就可以修改,并把dev分支push到远程的dev分支,两个名字最好一致,比如都叫dev
多人使用git开发项目的工作模式:
- 首先,可以试图用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
标签
- 标签是指向某个commit的指针,但是不能移动。主要为了方便区分版本,commit id一大串,不方便看
- 到相关分支,使用git tag 即可对最新提交打标签
- 对历史提交打标签,使用git tag
- 指定标签名和说明,使用git tag -a -m
- 查看说明文字,使用git show
- 查看所有标签,使用git tag
- 删除本地标签,使用git tag -d
- 推送某个本地标签到远程,使用git push origin
- 一次性推送全部尚未推送的本地标签,git push origin –tags
- 删除远程标签,git push origin :refs/tags/
操作github
- 需要从官方仓库fork一下,到自己的远程仓库,然后再clone到本地,然后再pull request。直接克隆官方仓库到本地仓库是没有权限推送的