Git基础入门

Git分支管理多人合作

创建版本库

1
$ git init  //不可以手动修改.git目录$ vim readme   //新建一个readme文件$ git add readme.md  //把文件添加到暂缓区$ git commit -m "wrote a readme file" //把文件提交到仓库

在github仓库,第一次创建

1
2
3
4
5
6
echo "# React-Node" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/lyctea/React-Node.git
git push -u origin master

查看仓库状态

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  //在删除远程