远程分支
- 项目开发,需要使用版本控制器,来控制开发流程,一般有一台公用服务器用于存放远程分支
假设远程分支如下所示
A-->B-->C-->D-->E-->G(HEAD||master) \-->F-->H(asshole_branch)
这里有两个分支,一个是master分支,另一个则是asshole_branch分支,HEAD指代的是远程分支的默认分支,即远程仓库中当前所处的分支
git init:如果现在在服务器上,想直接自己建个仓库,比如在~/wuyinjie/myproject/greatfighter目录下建一个仓库,那么直接切换到这个目录下,并且打开git bash,输入git init即可创建一个仓库
本地分支
git clone:本机上现在什么都没有,需要从远程分支上clone分支下来,使用git clone url指令将远程分支clone到本地,注意,这里的url是一个地址,例如git@oa.ejoy.com/afc.git,clone以后,本地分支的表现形式为:
A-->B-->C-->D-->E-->G(origin/HEAD||origin/master||master) \-->F-->H(origin/asshole_branch)
在本地分支中,origin是clone后默认生成的,表示远程分支的标志,意味着上一次更新远程分支的状态,master则是当前的主干分支,本地HEAD指针目前指向master节点
git status:这个指令用来查看git目前的状态,会将unstage,stage,commit的信息输出
git add:我们在本地,新建一个文件,或者修改一个文件的时候,这个文件就是unstage状态的文件,unstage状态的文件是不能直接commit的,需要通过git add指令来将这些文件标记为stage状态
git commit:文件暂存起来以后,就能进行提交了,通过git commit -m comment的方式,将信息提交,比如在此过程中,我提交了三次,那么节点会变为
A-->B-->C-->D-->E-->G(origin/HEAD||origin/master||)-->I-->J-->K(master) \-->F-->H(origin/asshole_branch)
如果此时远程分支有人提交了两次,生成L,M节点那么远程分支就变为
A-->B-->C-->D-->E-->G-->L-->M(HEAD||master) \-->F-->H(origin/asshole_branch)
git stash save:更新前要保持本地分支干净,因此先进行statsh save操作,将本地所有的改动放到一个stack中
git fetch:从远程更新代码,可以用git pull指令,或者是git fetch指令,使用git pull指令,最后会将本地改动和远程改动全部merge到一个节点中,这样会导致项目线条非常复杂,而且所有的改动合并到一个节点内也不容易被回滚,因此这里主场使用fetch指令,fetch指令,会将远程分支考到本地,因为本地也有一个远程分支的索引,因此fetch以后,会改变本地的远程分支分布情况
A-->B-->C-->D-->E-->G-->I-->J-->K(HEAD||master) \ \-->L-->M(origin/HEAD||origin/master) \-->F-->H(origin/asshole_branch)
- 用法
- git fetch 直接把远程分支更新到本地
- git fetch origin branch_name 将远程指定分支更新到本地
- 用法
git rebase:因为git fetch只是把远程分支更新到本地,并不作任何处理,因此更新好以后,像上面举的例子那样,现在本地有三个分支分别是master,远程分支和asshole_branch分支,我们更新的数据都在本地的远程分支上,因此需要合并两个分支使用git rebase指令更好,例如git rebase origin/master,因为此时是在master分支上,因此这段指令是直接拿本地分支和本地远程分支合并,最后得到的结果是
A-->B-->C-->D-->E-->G-->L-->M \ \-->I'-->J'-->K' \-->F-->H(origin/asshole_branch)
这里,I先和M合并一次,得到I’,然后J再和I’合并得到J’,再和K合并得到K’,此时K’变成origin/master,origin/head,HEAD,master于一身的节点
git push:push要先进行更新合并,到这一步,直接调用git push就能把节点分布同步到远程分支上
git stash pop:分支合并完,就可以将原来stash save起来的数据,再弹出来
git reset:回滚专用,如果想将代码上次改为上个commit的状态,直接调git reset HEAD,那么此时本地所有改动添加都会被撤销掉,想要重置回远程节点的状态,只需要git reset origin/branch_name即可
git reset HEAD:撤销所有的添加和改动,还原到和最新一次commit的节点一致
git reset hash_key:直接撤销到指定commit节点
git reset –soft HEAD:回滚到本地HEAD,但是修改/添加的数据不清理
git reset –hard HEAD:回滚到本地HEAD,但是清理修改,新增的数据
分支操作
- git branch:罗列本地分支
- git branch -a:查看所有分支
- git branch -r:查看远程分支
- git branch -b branch_name:新建一个叫做branch_name的分支
- git checkout branch_name:切到对应分支
- git checkout -b branch_name:新建一个分支,并切到该分支
查看所有提交记录:
git log
撤销
- 有时候不小心commit了东西,但是没有push的前提下,还是可以撤销的,使用git reset –soft HEAD^指令,可以撤销刚刚进行的commit,–soft的意思撤销提交但是保留修改
- 某个文件要撤销stage状态,只需使用git reset HEAD filename
与github设置关联
要使得本地git仓库和github通过ssh进行通信,需要生成一个public key和private key,这里有两种方式 1. 使用TotoiseGit的PuTTYGen工具,生成一个public key和一个包含私钥的.ppk文件,然后在TotoiseGit设置界面,指定.ppk文件的路径,这样就可以使用TotoiseGit工具,就能从github上clone仓库,fetch更新,push commit等 2. 还有一种方式,则是通过secureCRT工具,生成一个.pub文件的公钥和一个私钥文件,此时只需要将两个名字改名为id_rsa即可,并且将两个文件拷贝到git安装目录的.ssh文件夹下,同时在github上add新增加的ssh public key,这样就能和github进行交互了