Git小结

来源:互联网 发布:mac怎么开发android 编辑:程序博客网 时间:2024/04/26 12:14

简单介绍:Git是最先进的分布式版本控制系统,能够自动记录每次文件的改动,非常高效。

1.安装:首先$Git一下,看下有没有装,没有:$sudo apt-get install git(我的是在ubuntu下)

2.设置用户名和邮箱:$git--global user.name “yourname”

                  $git --global user.email“youremail”

 其中—global的意思是你的机器上的所有Git仓库都使用该配置

3.创建版本库(仓库:repository)该仓库里的所有文件都可以被Git管理,每个文件的修改、删除Git都能跟踪,以便追踪和历史还原。

      1)创建一个空目录:$mkdir mygitlearn(这里写上好记有意义的名字)

                      $cd mygitlearn

                      $pwd

2)将目录变成可管理的仓库:$git init

此时再pwd一下,可以看到目录下多出来一个.git目录,这个目录用来跟踪管理版本库

4.将编写的文件(例如:readme)放入仓库中:

      1)添加到仓库:$git add readme

2)提交到仓库:$git commit -m “……” (省略号里面的是对本次提交的说明,也相当于是做个备注)

注:文件一定要放在mygitlearn目录或子目录下;

   Add可以多次add不同文件commit可以一次性提交多个文件

5.查看仓库当前状态(显示已经add,未commit等内容)$git status

6.查看具体修改了哪些内容:$git diffreadme

7.显示从最近到最远提交的日志:$gitlog (--pretty=oneline)(如果命令有包含括号里面的内容,则显示的内容更加简洁)

 命令完显示的结果有一个 commit b80fbde3782……b则是版本号(commit id),用途在于只要找到这个版本号,可以实现后续的版本切换(每提交一个新版本,git就会自动串成一条时间线)

 

问:如何退回上一个版本?

答: 注:HEAD(当前版本)、HEAD^(上一个版本)、HEAD^^(上上个版本)、HEAD~100(上一百个版本)。直接$git reset –hard HEAD^ 但是,你$git log一下会发现找不到HEAD版本,放心,只要找到HEADcommitid,再$git reset --hard b80fhrsk223……b 即可。注:git内部有个指向当前版本的HEAD指针,版本回退时,仅是指针把HEAD指向回退文件,即让HEAD指针指向哪个版本号,当前版本就定位在哪。

 

问:想要恢复到某个版本却找不到commit id

答:可以查看每一次命令历史:$git relog

工作区、版本库、暂存区的关系:

查看工作区与版本库里最新版本的区别:$git diff HEAD –readme


问:如何撤销对文件修改?

答:先$git status查看一下仓库的状态

1)add$git checkout --readme则回到和版本库一样的状态

2)已经add到暂存区再做修改:$git checkout --readme则回到add但没有修改的状态,再$git reset HEAD readme,则回到了只添加了修改未add的状态,再$git checkout --readme则回到了和版本库一样的状态

问:如何删除文件?

答:1.$rm readme 2.$git status查看一下仓库状态,此时会告知你哪些文件被删除了

3.1)的确要从版本库中删除文件:$git rm readme并且$git commit -m “……”

 2)错删要恢复:$git checkout--readme

 

问:如何创建合并分支?

答:首先了解一下HEAD的指向:严格来说,HEAD不是指向提交,而是指向mastermaster指向提交,所以HEAD指向当前分支。如图:1)

(2)

即每一次的提交,master都会向前移动一步。

1)创建了新的分支(dev),Git创建了一个dev指针,指向master相同的提交,再把HEAD指向dev,表示当前分支在dev上。2)而对工作区的修改和提交针对dev分支每次提交,dev都会向前移动一步,而master不变。如图:

1

(2)

3)dev上工作完成,直接把master指向dev的当前提交就完成dev合并到master上。4)合并完分支后,把dev指针删掉即可删除dev分支。如图:

1

(2)

实战:1.创建并指向dev分支:$git checkout -b dev     或者

              $git branch dev $git checkoutdev

     2.查看当前分支:$git branch(当前分支会标*号)

       3.在提交修改后,切换回master分支:$git checkout master此时查看文件内容发现并没有修改,这是因为是在dev上提交的修改内容,maste分支此刻提交点并没有变。如图:

4.dev修改合并到master分支上:$git merge dev 其中git merge是指合并指定分支到当前分支上

     5.合并后,删除dev分支:$gitbranch -d dev

 

情况1:在操作3的基础上,对master分支的文件进行修改并提交,此时状况:如图

                                                                                                                              dev

这种状况下,git无法“快速合并”,必须手动解决冲突后再合并,$git status也会显示有冲突的文件,git<<<<<<,=========,>>>>>>标记不同的分支内容,修改后保存,addcommit,此时状况如图:

                                                                                                     dev

查看分支合并情况:$git log --graph--pretty=oneline –abbrev-commit

删除dev分支:$git branch -d dev

通常合并分支的时候,git会用fast forward模式,删除分支后,会丢弃分支信息,若强制禁用fast forwardgit会在merge时生成一个新的commit,这样从历史上可以看出分支信息。

 

情况2:在操作3的基础上,合并dev分支,禁用fastforward(快进模式):$git merge --no-ff -m “……” dev,查看分支历史:$git log --graph --pretty=oneline –abbrev-commit,此时状况如图:

                                                                                                    dev

情况3:在操作3的基础上,要把dev删除:$gitbranch -d dev 删除失败,只能强行删除(根据系统提示):$git branch -D dev

 

问:当接到一个修复bug任务想要创建一个分支来修复,可是当前dev里的只进行到一半的工作还未提交,应该怎么做?

答:1.将现场工作“储藏“:$git stash

2.查看工作区:$git status此时工作区是干净的

3.处理完bug后,回到dev$git checkout dev,再用$git status查看,工作区是干净的,再用$git status list查看,gitstash内容存放在某个地方

4.恢复:1$git stash apply ,恢复后,stash的内容不删除,需要使用$git stash drop删除

2$git stash pop,恢复的同时把stash的内容也删除了。

5.查看stash内容:$git stash list

6.若要恢复指定的stash$git stash apply stash@{...}

 

问:标签是什么?如何创建标签?

答:简而言之,标签就是版本号,也相当于快照。

1.     切换到需要打标签的分支上,查看分支:$git branch $git checkout master

2.     打一个新的标签:$git tag v1.0

3.     查看所有的标签:$git tag

 

默认标签都是打在最新提交的commit上,如果忘了打上标签?

1.     找到历史提交的commit id$git log --pretty=oneline--abbrev-commit

2.     打标签:$git tag v0.9 36271(id)

3.     再查看标签:$git tag

 

打可以带有说明的标签,-a指定标签名,-m指定说明文字:$gittag -a v0.1 -m “……” 273823(id )

查看标签信息里的说明文字:$git show v0.1

删除本地标签:$git tag -d v0.1

推送标签到远程:$git push origion v1.0

一次性推送全部未推送到远程的本地标签:$git push origion --tags

删除远程标签:1.先从本地删除:$git tag -d v0.9

                     2.从远程删除:$git push origion:refs/tags/v0.9

Github的使用:

注册好Github的账号以后,由于Git本地库和Github远程库之间的传输需要通过SSH加密:

1.创建SSH Key:$ssh-keygen -t rsa -C “your email”  然后一路回车,使用默认值,之后便可在主目录中找到.SSH目录,其中有id_rsa(私钥)和id_rsa.pub(公钥)

  2.登录Github,在key文本框中粘贴id_rsa.pub文件的内容

 

添加远程库:

第一种:先有本地库,再有远程库,关联远程库:

1.登录Github,“create a newrepo“创建一个新的仓库,填入name,其他保持默认

2.把已有的本地仓库与Github上的仓库关联,然后把本地仓库的内容推送到Github仓库:$git remote add origiongit@github.com:账户名/仓库名.git  其中所关联的账户名只有SSH Key公钥在列表中推送才可成功,添加后,远程库的默认名为origion

3.把本地库的内容推送到远程库上:$git push -u origion master 此时,git不但把本地的master分支内容推送到远程新的master分支,还会把本地的master分支和远程的master分支关联起来。

4.在本地提交后,将master的最新修改推送到Github:$git push origion master

第二种:先创建远程库,再从远程库克隆

1.     创建一个仓库,勾选Initialize this repository with a readme,然后Github会为我们创建一个README.md文件

2.     克隆一个本地仓库:$git clonegit@github.com:用户名/仓库名.git

                  $cd 仓库名  $ls 便有README.md

 

在Github上参与开源项目:

1.     访问主页点“Fork“便可在自己的账号下克隆一个仓库

2.     从自己的账号下clone:$git clonegit@guthub.com:用户名/仓库名.git

3.     修改后在Github上发起pull request

 

查看远程库信息:$git remote -v 其中-v可以显示抓取和推送的origion地址

 

抓取分支:

1.     从远程库克隆$git clonegit@github.com:用户名/仓库名.git

2.     查看分支:$git branch 此时只能查看到master分支

3.     若要在dev上修改,则必须创建远程origion的dev分支到本地:$git checkout -b dev origion/dev

4.     将修改后的dev分支推送到远程:$git commit -m “……”   $git push origion dev

5.     若别人已经向origion/dev分支推送了她的提交,同时自己也作了修改并试图推送,因为和别人的最新提交有冲突,则提交失败,则:1)用$git pull把最新的提交从orogion/dev上抓取下来2)在本地合并解决冲突,再推送。若$git pull也失败(系统提示:no tracking information),则因为没有指定本地dev分支与远程origion/dev分支的链接,需设置dev和origion/dev链接:$git branch --set-upstream devorigion/dev 再$git pull 完成后合并冲突,需手动解决,完成后再push。


 

0 0