git 学习随笔
git 学习
第二步,使用命令
穿梭前,用
要重返未来,用
1.初始化
初始化一个Git仓库,使用
git init
命令。 添加文件到Git仓库,分两步:
第一步,使用命令git add <file>
,注意,可反复多次使用,添加多个文件;第二步,使用命令
git commit
,完成。 2.查看状态
要随时掌握工作区的状态,使用
git status
命令。 如果
git status
告诉你有文件被修改过,用git diff
可以查看修改内容 3.版本回退
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。git log
可以查看提交历史,以便确定要回退到哪个版本。要重返未来,用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。 4.暂存区
5.撤销操作
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file
。 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD file
,就回到了场景1,第二步按场景1操作。 6.删除
命令
git rm
用于删除一个文件。如果一个文件已经被提交到版本库,那么你永远不用担心误删,但是要小心,你只能恢复文件到最新版本,你会丢失最近一次提交后你修改的内容。 7.远程仓库
要关联一个远程库,使用命令
git remote add origin git@server-name:path/repo-name.git
; 关联后,使用命令
git push -u origin master
第一次推送master分支的所有内容; 此后,每次本地提交后,只要有必要,就可以使用命令
git push origin master
推送最新修改; 8.从远程仓库中克隆
git clone 项目地址
git 支持多种协议,默认的git:// 使用ssh,但是也可以使用https 等协议。
使用https 除了速度慢之外,还有一个最大的麻烦就是每次推送都必须输入口令,但是某些只开放HTTP端口的公司内部就无法使用ssh 协议而只能使用https。
9.创建分支与合并分支
在版本回退里,每次提交,GIt 都把他们串成一条时间线,这条时间线就是一个分支。如果只有一条分支就是master 分支,HEAD 严格来说不是指向提交而是指向master,master 才是指向提交的,所以HEAD 指向的就是当前分支。
每次提交,master 分支都会向前移动异步,这样随着不断调教,master 分支就会越来越长。
当我们创建新的分支,例如是dev ,git 创建一个新的指针叫做dev,指向master 相同的提交,再把HEAD 指向dev 就表示当前的分支在dev上。
Git创建一个分支很快,因为除了增加一个
dev
指针,改改HEAD
的指向,工作区的文件都没有任何变化!不过,从现在开始,对工作区的修改和提交就是针对dev
分支了,比如新提交一次后,dev
指针往前移动一步,而master
指针不变: 假如我们在
dev
上的工作完成了,就可以把dev
合并到master
上。Git怎么合并呢?最简单的方法,就是直接把master
指向dev
的当前提交,就完成了合并 合并完成以后甚至于可以删除dev 分支。
10.解决冲突
冲突产生的原因是在于不同的分支修改了相同的文件,以至于合并的时候会有冲突的产生,所以解决冲突就是把这些不同的分支上相同的修改进行人工整合。
11.分支管理策略
通常,合并分支时,如果可能,git 会用Fast forward 模式,但是这种模式下,删除分支后,会丢掉分支的信息。如果要强制禁用
Fast forward
模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。 不使用fast forward 模式,merge后就是这样:
在实际开发中,我们应该按照几个基本原则进行分支管理:
首先,
master
分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
那在哪干活呢?干活都在dev
分支上,也就是说,dev
分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev
分支合并到master
上,在master
分支发布1.0版本;
你和你的小伙伴们每个人都在dev
分支上干活,每个人都有自己的分支,时不时地往dev
分支上合并就可以了。
所以,团队合作的分支看起来就像这样:
![](http://images0.cnblogs.com/blog/582632/201411/101010383819882.png)
Git分支十分强大,在团队开发中应该充分应用。合并分支时,加上
--no-ff
参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward
合并就看不出来曾经做过合并。
我是一只狂奔的小蜗牛