Motang的网络日志

目录

GIT安装

window: msysgit linux: yum install git 企业级GIT服务端: Stash

GIT介绍

git定下一种分支模型,在这种模型中,分支有两类,五种

永久性分支

临时性分支

master:主分支从项目一开始便存在,它用于存放经过测试,已经完全稳定代码;在项目开发以后的任何时刻当中,master存放的代码应该是可作为产品供用户使用的代码。所以,应该随时保持master仓库代码的清洁和稳定,确保入库之前是通过完全测试和代码reivew的。master分支是所有分支中最不活跃的,大概每个月或每两个月更新一次,每一次master更新的时候都应该用git打上tag,说明你的产品有新版本发布了。

develop:开发分支,一开始从master分支中分离出来,用于开发者存放基本稳定代码。之前说过,每个开发者的仓库相当于源仓库的一个镜像,每个开发者自己的仓库上也有master和develop。开发者把功能做好以后,是存放到自己的develop中,当测试完以后,可以向管理者发起一个pull request,请求把自己仓库的develop分支合并到源仓库的develop中。所有开发者开发好的功能会在源仓库的develop分支中进行汇总,当develop中的代码经过不断的测试,已经逐渐趋于稳定了,接近产品目标了。这时候,我们就可以把develop分支合并到master分支中,发布一个新版本。

feature:功能性分支,是用于开发项目的功能的分支,是开发者主要战斗阵地。开发者在本地仓库从develop分支分出功能分支,在该分支上进行功能的开发,开发完成以后再合并到develop分支上,这时候功能性分支已经完成任务,可以删除。功能性分支的命名一般为feature-为需要开发的功能的名称。

release:预发布分支,当产品即将发布的时候,要进行最后的调整和测试,这时候就可以分出一个预发布分支,进行最后的bug fix。测试完全以后,发布新版本,就可以把预发布分支删除。预发布分支一般命名为release-*。

hotfix:修复bug分支,当产品已经发布了,突然出现了重大的bug。这时候就要新建一个hotfix分支,继续紧急的bug修复工作,当bug修复完以后,把该分支合并到master和develop以后,就可以把该分支删除。修复bug分支命名一般为hotfix-*

GIT常用命令

从现有仓库克隆: git clone https://github.com/Motang/webside.git newFolderName

检查当前文件状态: git status

暂存已修改文件: git add 把目标文件快照放入暂存区域

忽略某些文件: cat .gitignore *.[oa] *~ 第一行告诉 Git 忽略所有以 .o 或 .a 结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的,我们用不着跟踪它们的版本。第二行告诉 Git 忽略所有以波浪符(~)结尾的文件

查看已暂存和未暂存的更新: git diff 不过是显示还没有暂存起来的改动,而不是这次工作和上次提交之间的差异 git diff –cached 看已经暂存起来的文件和上次提交时的快照之间的差异

git status查看一下状态

提交更新 git commit -m “just for testing” -m 参数后跟提交说明的方式, 默认提交暂存区域已经准备妥当的更改 git commit -a -m “just for testing” 加上-a 选项,Git 就会自动把所有已经跟踪过的文件和暂存起来的一并提交

我们把文件往Git版本库里添加的时候,是分两步执行的: 第一步是用“git add”把文件添加进去,实际上就是把文件修改添加到暂存区; 第二步是用“git commit”提交更改,实际上就是把暂存区的所有内容提交到当前分支。

回到规定的版本 git reset –hard commit_id 用来回到规定的版本 HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭 在Git中,用HEAD表示当前版本,也就是最新的提交“ 3628164…882e1e0”(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。 git reset –hard HEAD~

移除文件 git rm 从已跟踪文件清单中移除(确切地说,是从暂存区域移除) git rm –cached readme.txt 把文件从暂存区域移除中删除

移动文件 git mv file_from file_to 当于运行了下面三条命令: $ mv README.txt README $ git rm README.txt $ git add README

查看提交历史 git log -p 选项-p展开显示每次提交的内容差异 git log –graph 用git log可以查看提交历史,以便确定要回退到哪个版本。git log –pretty=oneline 用git reflog查看命令历史,以便确定要回到未来的哪个版本

撤消操作 git reset HEAD benchmarks.rb 现在 benchmarks.rb 文件又回到了之前已修改未暂存的状态 git commit –amend 相当于git commit -m ‘initial commit’ $ git add forgotten_file $ git commit –amend

git checkout – file 慎用,该文件已经恢复到修改前的版本。你可能已经意识到了,这条命令有些危险,所有对文件的修改都没有了,因为我们刚刚把之前版本的文件复制过 来重写了此文件 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout – file。 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。

从远程仓库抓取数据 git fetch [remote-name] 此命令会到远程仓库中拉取所有你本地仓库中还没有的数据 git fetch origin 会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)。有一点很重要,需要记住,fetch 命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。

git branch 列出本地分支 git branch -r 列出远程的分支

分支删除 git branch -d name git branch -D name 强行删除

查看分支:git branch 创建分支:git branch name 切换分支:git checkout name 创建+切换分支:git checkout -b name 合并某分支到当前分支:git merge name 删除分支:git branch -d name 创建分支: git branch 本地分支名 远程分支名 创建分支并切换到此分支: git checkout -b 本地分支名 远程分支名

git branch –set-upstream dev origin/dev master分支是主分支,因此要时刻与远程同步; dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步; bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug; feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

删除远程分支 git branch -r -d origin/branch-name git push origin :branch-name 冒号前面的空格不能少,原理是把一个空分支push到server上,相当于删除该分支

推送数据到远程仓库 git push remote-name branch-name 命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支 git push origin master 如果要把本地的master分支推送到origin服务器上(再次说明下,克隆操作会自动使用默认的master和origin名字

查看远程仓库信息 git remote show [remote-name] 查看某个远程仓库的详细信息 git remote -v显示更详细的信息

远程仓库的删除和重命名 git remote rename 命令修改某个远程仓库在本地的简短名称 git remote rename pb paul $git remote origin paul 把pb改成paul,接着重新获取

合并分支 git merge feature1 将分支feature1合并到当前分支 git merge –no-ff -m “merge with no-ff” dev 合并分支时,加上–no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并   合并操作将两条或多条分支合并到一起,实际上有好几种分支合并方法,下面介绍主要的三种:

合并1. 直接合并(straight merge):把两条分支上的历史轨迹合并,交汇到一起。   比如要把dev分支上的所有东东合并到master分支: 首先先到master分支:git checkout master 然后把dev给合并过来:git merge dev 注意没参数的情况下merge是fast-forward的,即Git将master分支的指针直接移到dev的最前方。   换句话说,如果顺着一个分支走下去可以到达另一个分支的话,那么Git在合并两者时,只会简单移动指针,所以这种合并成为快进式(Fast-forward)。

合并2. 压合合并(squashed commits):将一条分支上的若干个提交条目压合成一个提交条目,提交到另一条分支的末梢。把dev分支上的所有提交压合成主分支上的一个提交,即压合提交:   git checkout master   git merge –squash dev   此时,dev上的所有提交已经合并到当前工作区并暂存,但还没有作为一个提交,可以像其他提交一样,把这个改动提交到版本库中:   git commit –m “something from dev”  

合并3. 拣选合并(cherry-picking):拣选另一条分支上的某个提交条目的改动带到当前分支上。每一次提交都会产生一个全局唯一的提交名称,利用这个名称就可以进行拣选提交。   比如在dev上的某个提交叫:321d76f   把它合并到master中:   git checkout master   git cherry-pick 321d76f   要拣选多个提交,可以给git cherry-pick命令传递-n选项,比如:   git cherry-pick –n 321d76f   这样在拣选了这个改动之后,进行暂存而不立即提交,接着可以进行下一个拣选操作,一旦拣选完需要的各个提交,就可以一并提交。

冲突处理   当两条分支对同一个文件的同一个文本块进行了不同的修改,并试图合并时,Git不能自动合并的,称之为冲突(conflict)。解决冲突需要人工处理。   比如当前在master分支,想把dev分支merge过来,结果产生了一个冲突,打开文件内容可以看到这么一个冲突:

<<<<<<< HEAD
test in master
=======
test in dev
>>>>>>> dev

  «««<标记冲突开始,后面跟的是当前分支中的内容。   HEAD指向当前分支末梢的提交。   =======之后,»»»>之前是要merge过来的另一条分支上的代码。   »»»>之后的dev是该分支的名字。   对于简单的合并,手工编辑,然后去掉这些标记,最后像往常的提交一样先add再commit即可。

查看远程库信息,使用git remote -v; 本地新建的分支如果不推送到远程,对其他人就是不可见的; 从本地推送分支,使用git push origin branch-name,如果推送失败,先用git pull抓取远程的新提交; 在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称最好一致; 建立本地分支和远程分支的关联,使用git branch –set-upstream branch-name origin/branch-name; 从远程抓取分支,使用git pull,如果有冲突,要先处理冲突。

当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue -101来修复它,但是,等等,当前正在dev上进行的工作还没有提交,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作 git stash git stash list git stash pop 恢复的同时把stash内容也删了 git stash apply 恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除

标签 git tag 列显已有的标签 git tag v1.3 v1.4 用特定的搜索模式列出符合条件的标签 git show v1.4 命令查看相应标签的版本信息 git tag -a v1.4 -m ‘my version 1.4’ 新建含附注的标签,-a指定标签名字,-m选项则指定了对应的标签说明 git tag -s v1.5 -m ‘my signed 1.5 tag 新建签署标签,如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a 改为 -s git tag v1.4-lw 新建轻量级标签 git push origin [tagname] 新建分享标签,默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库,如果要一次推送所有本地新增的标签上去,可以使用 –tags 选项 git push origin –tags 一次推送所有本地新增的标签上去,可以使用 –tags 选项 git push origin :refs/tags/v0.9 远程删除 git tag -v [tag-name] 此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证 git tag -a v1.2 9fceb02 后期加注标签 git tag -d tag-name 删除标签

© 2015 Morly Tang. All Rights Reserved.

版权归属:寂寞的男人