廖雪峰git学习


什么是git?    版本管理工具

为什么要用它?   方便大家一起工作,提高工作效率

举个例子,大家写论文的时候,会改正好多版吧,通常都是怎么做的呢?

通过命名的方式来区分,版本1,版本2,版本3,,,,等等,这个版本改了,那个版本还得改,改来改去头都大了。

程序开发中,也会遇到类似的情况。大家协同合作,每次提交的代码,需要改一点,每次都需要保存下,很让人头疼。

这个时候版本管理工具就横空出世


版本管理工具一般有两种,一种是分布式,一种是集中式

git是分布式,svn是集中式

各有优缺点。

集中式:需要一个中央服务器,需要联网

分布式:本地有仓库


git安装

Ubuntu:apt-get install git

(有的系统自带git,无需安装)

git安装完后,需要设置用户名和邮箱

git config --global user.name "Your Name"

git config --global user.email "[email protected]"

(git config 命令的--global参数,用了这个参数,表示这台机器上所有的Git仓库都会使用和配置)


创建版本库

(创建git仓库,这是一个文件夹,这个文件夹里面所有的文件都可以被git管理)

命令:git init

方法:在文件夹下执行git init


把文件添加到版本库

前置条件:文件放到版本库中

命令:git add   filename 

            git commit -m "beizhu"

方法:命令行输入命令  git add filename

git中对文件进行管理,只需要两步,一步add,一步commit

git add  是将文件添加到目录

git commit 是将文件更新到版本库

add 可以反复使用,添加多个文件,

commit可以一次提交很多文件


时光机穿梭

命令:git  reset       版本回退

            git  status      查看仓库状态

            git  diff           工作区版本比较,未提交文件的改动

            git  log           查看日志

            git  reflog      查看历史命令

HEAD指向的版本就是当前的版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git  reset -hard commit_id

穿梭前,用git log 可以查看提交历史,以便确定要回退到哪个版本

要重返未来,用git  reflog 查看历史命令,以便确定要回到未来的哪个版本


工作区和暂存区

git中文件的操作有两个步骤,先add 后commit

为什么呢?

因为把文件添加到Git版本库,是分两部分进行的,先添加到工作区,后放到版本库

工作区和版本库

工作区是建立文件夹的地方,我们对文件的操作是在工作区

版本库里有暂存区和master,指向master的指针叫HEAD

git add是把要提交的修改放到暂存区,然后执行git commit把暂存区的修改提交到分支


管理修改

git跟踪并管理的是修改,而非文件

 git diff 比较的是工作区和版本库之间的区别


撤销修改

三种情况:

1、工作区改了,未提交到版本库                                                      命令: git checkout  -- filename

2、工作区的修改提交到了暂存区,未提交到master                     命令:git reset HEAD filename

3、工作区的修改提交到了暂存区,提交到master                         命令:git  reset   -hard commit_id


删除文件

前置条件:工作区和版本库文件相同

操作:工作区中删除文件

两种情形:1、工作区中删除文件,版本库中也需要删除文件

                    命令:     git  rm  filename

                                     git  commit -m “remove filename”

                     2、删除操作属于误删,还需要恢复

                     命令 :    git checkout  -- filename



远程仓库

注册github

按照提示,完成一个hello-world的工程

在本机生成一个私钥,然后添加到github

本地仓库与github关联,git remote add origin [email protected]:leinaolab/learngit.git

推送本地更新到远端:git push  -u origin master


从远程库克隆

git clone [email protected]:leinao/gitskills.git


分支管理

创建与合并分支:    

命令:

查看分支:  git   branch

创建分支:  git branch

切换分支:     git checkout

创建+切换:git checkout -b

合并某分支到当前分支:git merge

删除分支:      git branch -d   

git对分支的操作是通过指针来完成,十分高效,

git鼓励使用分支完成某个任务,合并后再删掉分支,这和直接在master上工作效果一样,但是更加安全


解决冲突:

当git无法自动完成合并时,就必须首先解决冲突,解决冲突后,再提交,完成合并

原因:不同分支合并,会有不一样的地方

如何操作:手动修改

命令:git merge

执行合并命令后,冲突会在文件中显示,手动在文件中修改成需要的样子

然后执行git add ,git commit  ,完成合并


分支管理策略

通常,合并分支时,如果可能,Git会用Fast forward 模式


git有快速合并,也有--no-ff

分支快速合并,是直接移动指针,删除分支后,会丢掉分支信息

如果强制禁用快速合并,git会在merge时生成一个新的commit。这样,从分支历史上就可以看出分支信息

下面是 --no--ff方式的git merge:

git merge --no-ff -m "merge " dev


bug分支

应用场景:你正在处理手中的事情,这个时候需要去解决一个bug,当前工作可能要明天才能完成,但是需要两个小时内解决bug,该怎么弄呢?

解决办法:保存现在的工作状态,去解决bug,解决bug之后再回到工作

命令:git stash 、  git  apply   、  git  pop

步骤:

1、保存当前工作状态        git  stash

2、切换到需要解决bug的分支,例如切换到master               git  checkout  master  

3、在当前分支,拉取一个分支,用来修复bug,取名issue-101                   git  checkout -b issue-101

4、在issue-101分支修复bug,修复完成后切换到master,并完成合并(要加参数 --no-ff)                    

                                                 git merge --no-ff -m "merge fix issue 101"  issue-101

5、删除issue-101分支。      在master上,删除合并后的分支。git branch -d issue-101

6、恢复到先前的工作状态。  查看有哪些保存的状态,git  stash list 。

                              两种恢复方法 :1、直接恢复到先前工作状态,保存的stash还在。      git apply                                                                                                                        2、恢复到先前的工作状态,自动删除保存的stash。 git pop 

  注意事项:对stash状态的保存和恢复,只能在当前分支进行操作。

例如在master分支上保存的stash,只能在master上查看,在feature1分支上看不到该stash状态。


feature分支(开发一个新特性,最好新建一个分支)

应用场景:新建feature分支开发一个特性,完成一部分后,得知该特性被取消,该如何处理呢?

解决方法:不对该分支进行合并操作,使用强制删除命令

命令:git branch -D feature

操作步骤:

1、新建feature分支。git checkout -b feature

2、强制删除。  git branch -D feature

注意事项:不能删除自己所在的分支。例如,现在切换到feature1分支,执行命令git branch -d feature1,会提示无法删除。


多人协作

有一个问题:git  远程库中的仓库名     origin和master是什么关系和区别


你可能感兴趣的:(渣渣入门记)