一些git的常用命令,记在这里方便查找(懒得去翻help)
创建版本库 & 提交上传
# 将一个文件夹初始化成版本库
git init
初始化之后会在目录下新生成一个.git目录,是git用于跟踪管理版本库的,可以通过ls -ah命令查看
# 添加到暂存区
git add <filename>
# 报告当前状况
git status
# 提交到版本库并留下本次提交说明
git commit -m <message>
# 未add前查看本次修改的内容
git diff <filename>
# 查看修改记录(见化输出至一行)
git log (--pretty=oneline)
git版本回退
git中版本号是SHA1计算出的一个大数,避免了分布控制时版本号冲突
# 版本回退
git reset --hard HEAD^
HEAD:表示当前版本,上一个版本就是HEAD^,上上个就是HEAD^^
回退之后在版本信息中就无法找到在回退之后的内容了,但是可以通过版本号回到指定版本,可以通过只打出前几位,通过缺省进行补全。原因是git的链表式存储方式。
如果在关闭窗口后还想回到新的版本,可以通过以下找到对应版本号,完成回退
# 查看执行过的每一个命令
git reflog
工作区 & 暂存区
电脑上的文件夹learngit就是一个工作区,工作区指电脑里能看到的目录。
而该文件夹下的.git隐藏目录就是git的版本库,其中最重要的是stage(index)暂存区,以及master分支,还有指向master的一个指针HEAD。
git add是提交到暂存区,git commit是从暂存区提交到当前分支。
管理修改
git管理的是修改,不是文件,修改如果不add到暂存区,那么最后commit的时候也不会提交上去
# 查看工作区和版本库里面最新版本的区别
git diff HEAD -- readme.txt
撤销修改
提交前发现错误
git checkout -- readme.txt
# 注意"--",如果没有的话就是切换到另一个分支了,分支管理中将再次使用。
把readme.txt文件在工作区的修改全部撤销,如果该文件还没有add到暂存区,撤销就是回到版本库中上一个状态;如果是add之后做了修改,撤销就回到暂存区中的状态。总之就是回退到上一次add或者commit的状态。
add后发现错误
git reset HEAD <filename>
可以把暂存中的修改撤销掉(unstage),重新放回工作区,也就是说,git reset既可以回退版本,还可以把暂存区的修改回退到工作区,HEAD的意思是,回退到最新的commit的版本。
重新放回工作区之后,可以通过上一节的命令来处理工作区的问题。
commit之后发现错误
- 如果git还没有把本地版本推送到远程,那么可以通过版本回退处理
- 如果已经退送到远程,git分布式就决定了,一旦推送到远程版本库,没救了,这次修改就该不动了……吧?
删除文件
# Linux系统中从工作区删除文件
rm test.txt
当git的版本库和工作区不一样的时候,git status就会返回差异,但是此时版本库中的文件还没有删除,可以通过
git rm test.txt
git commit -m "remove test.txt"
如果误删除文件,还把这个变动添加到了暂存区,那就需要先进行一步
git reset HEAD <filename>
如果只是在工作区里误操作误删除了,可以通过
git checkout -- test.txt
把误删除文件返回到最新版本,如果commit之后,还可以通过回退版本号来回退。
远程仓库
分布式管理,每台机器上的版本库都是一样的,没有主次之分。
github是提供git仓库托管服务的,可以通过注册账号白嫖,本地仓库与github远程仓库是通过SSH加密的,需要一些设置。
# 创建SSH Key(先看看主目录下有无ssh目录
ssh-keygen -t rsa -C "m15265723639@163.com"
# 然后后续设置使用默认值(一路回车
# 登录github,添加上刚才生成的公钥is_rsa.pub,随便起一个title就好了
# 这样就做到了把这台电脑的Key添加到github了
在Github上托管的免费仓库,只有自己能修改,但是所有人都能看到。
可以通过私有化仓库(付费,或者自己搭一个git服务器来做到
添加远程库
在Github上获取一个远程库之后,可以通过提示的SSH方式把本地内容推送到远程库
# 把本地关联到远程库
git remote add origin git@github.com:Uniqsy/learngit.git
# 把本地库所有内容推送到远程库
git push -u origin master
本质上是把本地的master分支推送到远程
-u:Git不但会把本地的master分支内容推送到远程master分支,还会把本地master分支和远程master分支关联起来,这样可以简化以后的推送,后续推送就只需
git push origin master
第一次使用Git的clone或者push命令时,会有警告去确认是否连接到了正确的Github服务器,可以通过检查网站上给出的信息来进行比对确认,以后的push或者clone里就不会有了。
从远程库克隆
git clone git@github.com:Uniqsy/gitskills.git
Git支持多种协议,包括https但是通过ssh支持的原生git协议速度最快。
分支管理
Git中的分支管理都是基于类似于链表的东西,所以切换分支以及合并分支都十分迅速。
# 查看分支
git branch
# 创建分支
git branch <branchname>
# 切换分支
git checkout <branchname>
# 创建切换分支
git checkout -b <branchname>
合并某分支到当前分支
git merge <branchname>
删除分支
git branch -d <branchname>
解决冲突(两条分支都存在修改
两条分支上对于同一个文件进行了修改,产生文件上的冲突还得手动解决
合并产生冲突后手动修改文件使之一样酒醒,可以通过
git log --graph --pretty=oneline --abbrev-commit
查看像是个图的合并结果
分支管理策略
git merge --no-ff -m "merge with no-ff" dev
# 在合并分支时添加参数,禁用fast forward可以创建一个commit然后以后查看本次合并的信息,否则看不出分支曾经合并过
一般来说,在dev分支上开发,然后等需要的时候再合并回master分支
bug分支_切换分支需要保存现场
# 保存当前工作进度
git stash
#查看保存的工作进度
git stash list
# 恢复
git stash apply
# 删除
git stash drop
# 一步完成
git stash pop
假设当前在master上发现了bug并通过分支fix_bug进行了修改,但是目前的dev也存在bug所以需要将master上进行的修改复制到dev上进行再进行修改
在dev分支下,可以将操作复制执行一遍,也可以从dev修改,然后在master进行cherry-pick
git cherry-pick <版本号>
Feature分支
开发一个新feature,最好新建一个分支
git branch -D <name>
# 强行删除没有合并过的分支
多人协作
# 查看远程库信息,显示可以抓取和推送的origin的地址
git remote -v
# 推送一个分支到远程库对应的远程分支
git push origin <分支名>
不是所有的分支都一定需要推送到远程
- master分支是主分支,此要时刻与远程同步;
- dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
- bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
- feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
多人协作模式:
- 首先,可以试图用git push origin 推送自己的修改;
- 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
- 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用git push origin 推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令
git branch --set-upstream-to <branch-name> origin/<branch-name>