一、Git是什么呢?
Git是目前世界上最先进的分布式版本控制系统。那什么是版本控制系统?简单的点就是控制每次修改、提交后所有版本的集合。在这个版本控制系统中,你可以找到所有已经修改过后的内容。
二、Git与SVN的区别
SVN是集中式版本控制系统,版本库是集中放在服务器的,每次工作的时候,首先要从服务器上拿到最新代码,然后工作,写代码,工作完成后,还要继续推送到服务器上。这种集中式版本控制系统是必须联网才能工作,工作局限性就比较大,用着不是很方便。
Git是分布式版本控制系统,本地就是版本仓库,可以不用依赖网络,功能相当强大。
三、创建版本库
1、什么是版本库?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
所以,创建一个版本库非常简单,创建一个空目录:
这时候桌面上就有一个test文件夹了。或者直接在桌面上创建一个空的文件夹,然后cd到该文件目录下。
2、把该目录创建成版本管理仓库:使用命令 git init
这样该目录就是版本管理仓库了,以后工作内容都会提交到这个里面来。这个目录是Git来跟踪管理版本的,没事千万不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了
3、把文件提交到仓库里
首先在该文件下面创建一个read.txt文件:内容为:helloworld
第一步:使用命令行 git add . 把内容添加到暂存区里
第二步:用命令 git commit,把文件提交到仓库。
现在我们已经提交了一个read.txt文件了,我们下面可以通过命令git status来查看是否还有文件未提交,如下:
上面说明已经提交到仓库了,没有需要提交的内容。接着 我们修改下read里面的内容:添加helloworld2 然后在查看状态如下:
可以发现,read已经被修改了,但是还没有提交到仓库里。那怎么办呢?还是使用git add.和git commit -m ""命令提交。那每次都用这两个命令是不是有点麻烦呢?有没有简单点的呢?答案是git这么强大,那必须有的。把这两个命令合成一个命令:git commit -a -m "" 就可以了。还有就是要养成一个习惯:当你提交完成后,在执行下git status这个命令,查看下当前状态,以确保所有修改的内容都已经提交完成了。
四、添加远程库(先有本地仓库,后有远程仓库)
公司里的项目代码一般都是放在远程仓库,以便多人开发,多人使用。同时还可以备份项目代码。那怎么创建远程仓库呢?首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库,然后 在Repository name填入test,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库。
目前远程仓库已经创建好了,不过还是空的。那怎么将远程仓库和本地仓库关联起来呢,使用下面命令:
记得把地址换成自己公司。添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是origin这个名字一看就知道是远程库。
下一步:可以把本地库的所有内容推送到远程库上:使用命令git push -u origin master
由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。以后在推送时 就可以用git push origin master或者git push了。
五、从远程仓库克隆
一般进去公司后,项目就可以在远程仓库已经有了,你需要做的就是从远程仓库把代码给克隆下,然后自己在做相应的工作。那如何从远程仓库克隆呢?用命令git clone克隆一个本地库如下:
其实你会发现:git还支持另一种方式:SSH。这里使用的HTTPS,当然你也可以用SSH,这个需要自己去生成一个后,添加进去就可以了。
六、版本回退
1、工作中难免会有出错的地方,而有时候需要回归到上一个版本或者之前的某一个版本。这是就需要版本回退功能了。但又有一个问题:可能之前有好多版本,而你也不知道到底是哪一个版本,这是就要用命令 git log 把所有提交的记录打印下,我们就可以通过log来确认自己需要回退的版本。如下:
git log命令显示从最近到最远的显示日志,如果嫌上面显示的信息太多的话,我们可以使用命令 git log –pretty=oneline
2、现在我想使用版本回退操作,我想把当前的版本回退到上一个版本,要使用什么命令呢?git reset --hard id 如下:
git reset --hard id中的id是commit id,git 就是通过这个id来找回对应的版本,而这个id是怎么获取的呢?通过git log命令,如第一步,就可以找到了。注:cat命令用来查看文件内容
3、回到未来。现在,你回退到了某个版本,然后想恢复到新版本怎么办?找不到新版本的commit id怎么办?Git提供了一个命令git reflog用来记录你的每一次命令:
这样就可以回到最新版本了。
4、撤销修改
比如我现在在read.txt文件里面增加一行 内容为12333,在我未提交之前,我发现添加12333内容有误,所以我得马上恢复以前的版本,现在我可以有如下几种方法可以做修改:
第一:如果我知道要删掉那些内容的话,直接手动更改去掉那些需要的文件,然后add添加到暂存区,最后commit掉。
第二:我可以按以前的方法直接恢复到上一个版本。使用 git reset –hard HEAD^
但是现在我不想使用上面的2种方法,我想直接想使用撤销命令该如何操作呢?可以使用git checkout — file 可以丢弃工作区的修改。
命令 git checkout –read.txt 意思就是,把read.txt文件在工作区做的修改全部撤销,这里有2种情况,如下:read.txt自动修改后,还没有放到暂存区,使用 撤销修改就回到和版本库一模一样的状态。另外一种是read.txt已经放入暂存区了,接着又作了修改,撤销修改就回到添加暂存区后的状态。(注:git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令)
5、删除修改
现在我们在test文件下添加b.txt文件,如下:
可以发现,现在test目录下面有两个文件:b.txt和read.txt.(注:lb命令查看当前目录的内容)
现在我们想删除b.txt文件,怎么办呢?把文件管理器中把没用的文件删了,或者用rm命令删了:
然后用ls命令查看,发现只剩下read.txt文件了。当然,如果我想彻底从版本库中删掉了此文件的话,可以再执行commit命令 提交就可以的。
七、分支管理
1.创建与合并
首先创建一个dev分支,并且切换到dev分支上
git checkout 命令加上 –b参数表示创建并切换,相当于如下2条命令
git branch dev
git checkout dev
git branch查看分支,会列出所有的分支,当前分支前面会添加一个星号。
现在我们在dev上面开发了。我在read.txt添加一句话:这个是dev分支添加的Helloworld 如下:
dev工作已经做完了,现在切换到master分支上面,使用命令:git checkout master 然后使用cat read.txt命令查看内容,发现master分支没有刚刚添加的内容。说明我们刚刚是在dev上面开发的,还没有把内容合并到主分支上。
合并分支:使用命令git merge dev 在master主分支来合并dev分支如下:
git merge命令用于合并指定分支到当前分支上,合并后,再查看read.txt内容,可以看到,和dev分支最新提交的是完全一样的。
注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
合并完成后,留着dev分支也没有用途了,我们可以接着删除dev分支了,操作如下:
总结创建与合并分支命令如下:
查看分支:git branch
创建分支:git branch name
切换分支:git checkout name
创建+切换分支:git checkout –b name
合并某分支到当前分支:git merge name
删除分支:git branch –d name
2、解决冲突
Git用<<<<<<<,=======,>>>>>>>标记出 不同分支的内容,通过标记来找到冲突,然后解决,在提交就可以了。
3、分支管理策略。
通常合并分支时,git一般使用”Fast forward”模式,在这种模式下,删除分支后,会丢掉分支信息,现在我们来使用带参数 –no-ff来禁用”Fast forward”模式。首先我们来做demo演示下:
1)、创建一个dev分支。
2)、修改readme.txt内容。
3)、添加到暂存区。
4)、切换回主分支(master)。
5)、合并dev分支,使用命令 git merge –no-ff -m “注释” dev
6)、查看历史记录
分支策略:首先master主分支应该是非常稳定的,也就是用来发布新版本,一般情况下不允许在上面干活,干活一般情况下在新建的dev分支上干活,干完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。
4、多人协作:多人协作时,大家都会往master分支上推送各自的修改
1)、推送分支:
就是把该分支上所有本地提交到远程库中,推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:使用命令:git push origin master,如果我们现在要推送到其他分支,比如dev分支上,我们还是那个命令 git push origin dev
那么一般情况下,那些分支要推送呢?
master分支是主分支,因此要时刻与远程同步。
一些修复bug分支不需要推送到远程去,可以先合并到主分支上,然后把主分支master推送到远程去。
2)、拉取分支:
有这么一种情况:假如我把本地dev分支推送到远程服务器上,之后另一位同事,拉取代码后,也需要在dev分支上开发,而他的本地没有dev分支,怎么办呢?很简单,使用命令:git checkout –b dev origin/dev, 现在小伙伴们就可以在dev分支上做开发了,开发完成后把dev分支推送到远程库时。
另一种情况:我已经在我的本地dev分支开发了,然而并没有和远程的dev分支关联,这是同样是push不了的。怎么办呢?使用命令:git branch --set-upstream dev origin/dev,将本地dev和远程dev关联起来就可以了
这样git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的 解决冲突完全一样。解决后,提交,再push:
多人协作工作模式一般是这样的:
首先,可以试图用git push origin branch-name推送自己的修改.
如果推送失败,则因为远程分支比你的本地更新早,需要先用git pull试图合并。
如果合并有冲突,则需要解决冲突,并在本地提交。再用git push origin branch-name推送。
如果git pull提示“no tracking information”,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name。
Git常用命令
mkdir: XX (创建一个空目录 XX指目录名)
pwd: 显示当前目录的路径。
git init 把当前的目录变成可以管理的git仓库,生成隐藏.git文件。
git add XX 把xx文件添加到暂存区去。
git commit –m “XX” 提交文件 –m 后面的是注释。
git status 查看仓库状态
git diff XX 查看XX文件修改了那些内容
git log 查看历史记录
git reset –hard HEAD^ 或者 git reset –hard HEAD~ 回退到上一个版本
(如果想回退到100个版本,使用git reset –hard HEAD~100 )
cat XX 查看XX文件内容
git reflog 查看历史记录的版本号id
git checkout — XX 把XX文件在工作区的修改全部撤销。
git rm XX 删除XX文件
git remote add origin 关联一个远程库
git push –u(第一次要用-u 以后不需要) origin master 把当前master分支推送到远程库
git clone 从远程库中克隆
git checkout –b dev 创建dev分支 并切换到dev分支上
git branch 查看当前所有的分支
git checkout master 切换回master分支
git merge dev 在当前的分支上合并dev分支
git branch –d dev 删除dev分支
git branch name 创建分支
git stash 把当前的工作隐藏起来 等以后恢复现场后继续工作
git stash list 查看所有被隐藏的文件列表
git stash apply 恢复被隐藏的文件,但是内容不删除
git stash drop 删除文件
git stash pop 恢复文件的同时 也删除文件
git remote 查看远程库的信息
git remote –v 查看远程库的详细信息
git push origin master Git会把master分支推送到远程库对应的远程分支上
git tag <tagname>用于新建一个标签
git tag可以查看所有标签。
命令git push origin <tagname>可以推送一个本地标签;
git push origin --tags可以推送全部未推送过的本地标签;
git tag -d<tagname>可以删除一个本地标签;
git push origin :refs/tags/<tagname>可以删除一个远程标签。