Git分支管理多人合作
创建版本库
1 | $ git init //不可以手动修改.git目录$ vim readme //新建一个readme文件$ git add readme.md //把文件添加到暂缓区$ git commit -m "wrote a readme file" //把文件提交到仓库 |
在github仓库,第一次创建
1 | echo "# React-Node" >> README.md |
查看仓库状态
1 | $ git status //查看仓库的当前状态$ git diff //查看difference, 没问题则 add-->commit$ git log //最近到最远的提交日志 信息太多可以加--pretty=oneline |
回退机制
1 | $ git reflog //历史日志,可以查看所有操作,如果在回退以后又想再次回到之前的版本$ git reset --hard d020e0c //跳转到指定的commit |
工作区 暂缓区 分支
1 | $ git add //从工作区添加到暂缓区$ git commit //从暂缓区添加到分支 |
撤销修改
1 | $ git checkout -- resetTest.txt //让工作区恢复到最近一次commit或者add时的状态$ git reset HEAD resetTest.txt //当已经add的文件, 回退到工作区, 然后使用checkout可以撤销修改 |
删除文件
1 | $ rm resetTest.txt //删除本地文件$ git checkout -- resetTest.txt //不想删除, 检出 保持工作区和仓库一致$ git rm resetTest.txt //从仓库中删除$ git commit -m "rm test" //并且commit |
远程仓库 SSH
创建SSH Key
1 | $ ssh-keygen -t rsa -C "youremail@example.com" |
登陆GitHub 点“Add SSH Key” 填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容
在github上创建仓库
1 | $ git remote add origin git@github.com:michaelliao/learngit.git //连接远程仓库 origin是远程仓库名字$ git push -u origin master //把本地仓库内容推送到远程库上/*推送报错, 以下解决方法 :可以通过如下命令进行代码合并【注:pull=fetch+merge]git pull --rebase origin master此时再执行语句 git push -u origin master即可完成代码上传到github*/ |
SSH警告
第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告, 这是因为Git使用SSH连接,而SSH连接在第一次验证GitHub服务器的Key时,需要你确认GitHub的Key的指纹信息是否真的来自GitHub的服务器,输入yes回车即可。
从远程库克隆
1 | $ git clone git@github.com:michaelliao/gitskills.git |
分支管理
创建分支
1 | $ git branch dev$ git checkout dev/* 也可以一条命令 git checkout -b dev //创建并切换*/ $ git branch //列出所有分支,当前分支前面会标一个*号 |
合并分支
1 | $ git merge dev //合并指定分支到当前分支 |
删除分支
1 | $ git branch -d dev //Git鼓励大量使用分支 合并后删除 |
解决冲突
新建一个分支, 并且commit , 当新建分支内容和master分支没有冲突的时候, 可以用自动合并分支处理.当出现冲突时, 自动合并失效, 需要手动处理冲突 . 解决完之后, commit版本 删除新建分支
1 | /*Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容*/$ git log --graph --pretty=oneline --abbrev-commit //查看合并分支的情况$ git log --graph //查看分支合并图 |
分支管理策略
1 | /* 强制禁用Fast forward模式,Git就会在merge时生成一个新的commit*/$ git merge --no-ff -m "merge with no-ff" dev |
建议使用的分支管理策略
1 | 在实际开发中,我们应该按照几个基本原则进行分支管理:首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。 |
BUG分支
1 | 软件开发中,BUG 就像家常便饭一样。BUG 就需要修复,在Git中,由于分支是如此的强大,所以,BUG 都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除 |
1 | /* 概览:master合并merge解决好的bug后,不要先把dev解印,先合并master,获取里面的bug方案后,在解印。解印时会有提示冲突,需手动改一次文件。 1:在 dev 下正常开发中,说有1个bug要解决,首先我需要把dev分支封存stash 2:在master下新建一个issue-101分支,解决bug,成功后 3:在master下合并issue-101 4:在 dev 下合并master, 这样才同步了里面的bug解决方案 5:解开dev封印stash pop,系统自动合并 & 提示有冲突,因为封存前dev写了东西,此时去文件里手动改冲突 6:继续开发dev,最后add,commit 7:在master下合并最后完成的dev 代码过程如下:*/1: $ git stash2: $ git checkout master $ git checkout -b issue-101 //去文件里修bug $ git add README.md $ git commit -m "fix-issue-101"3: $ git checkout master $ git merge --no-ff -m "m-merge-issue-101" issue-101 $ git branch -d issue-1014: $ git checkout dev $ git merge --no-ff -m "dev-merge-m" master5: $ git stash list //查看冻结列表,以便恢复 $ git stash pop //提示冲突,去文件手动改正 Auto-merging README.md CONFLICT (content): Merge conflict in README.md6: //继续开发 ... ... ,完成后一并提交 $ git add README.md $ git commit -m "fixconflict & append something"7: $ git checkout master $ git merge --no-ff -m "m-merge-dev" dev $ git branch -d dev |
冻结与解冻
1 | $ git stash //冻结当前为提交,但是已经add的工作状态$ git stash pop //解冻, 并在状态列表中删除$ git stash list //列出所有的状态$ git stash apply //解冻, 但并不删除状态$ git stash drop //删除状态 |
Feature分支
1 | 开发新功能也是在dev的基础上, 新建一个Feature分支, 完成之后, 切换回dev分支, 进行合并,解决冲突等, 如果开发完的Feature分支buxuyaole, 可以使用 git branch -D 去删除没有合并的分支 |
多人合作
推送分支
1 | 并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?master分支是主分支,因此要时刻与远程同步;dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;bug 分支只用于在本地修复bug ,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。 |
抓取分支
1 | $ git push origin --delete remote_branch //删除远程分支$ git remote -v //查看远程仓库信息$ git checkout -b dev origin/dev //创建远程origin的dev分支到本地 |
1 | /*多人协作的工作模式通常是这样:首先,可以试图用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。*/ |
标签
1 | 发布一个版本时,我们通常先在版本库中打一个标签(tag),这样,就唯一确定了打标签时刻的版本。将来无论什么时候,取某个标签的版本,就是把那个打标签的时刻的历史版本取出来 |
创建标签
1 | /*切换到需要发布版本的分支*/$ git tag v1.0 //创建标签$ git tag //显示标签$ git log --pretty=oneline --abbrev-commit //定位到历史commit 然后打标签$ git tag v0.9 60f96c3 $ git tag -a v0.1 -m "version 0.1 released" 3628164 //-a指定标签名,-m指定说明文字$ git tag -d v0.1 //删除标签$ git push origin v1.0 //推送标签到远程$ git push origin --tags //一次性推送所有标签 /*如果标签已经推送到远程那么*/$ git tag -d v0.9 //先删除本地$ git push origin :refs/tags/v0.9 //在删除远程 |