Git是什么
git目前最先进的分布式版本控制系统。
使用git之前,我们先了解git的几个概念
工作区(Working Directory)
顾名思义,工作区即为你本地工作的区域,你在工作区可以修改你的文件。暂存区
如果你某一部分完成了修改,可以使用把修改的部分提交到暂存区。(git add .)本地版本库
如果你需要把修改提交到本地历史版本库,可以使用git commit -m "change[]:提交修改至历史版本库",这儿有一个HEAD的概念,HEAD其实是一个指针,指向你版本库最新的提交节点。远程仓库
远程即 romote,远程仓库也就是项目文件存储的地方。如果你想把修改从本地推到远程仓库,可以使用git push origin branch
Git的常见使用场景及命令
使用git的第一步,我们需要和远程仓库建立起链接
- 克隆远程仓库
直接执行: git clone http:....git,(远程仓库地址),这样我们的本地就有了一个和远程仓库一样的本地版本库,我们可以使用 git remote -v 查看一下关联信息。我们可以在这个仓库里做修改,然后推送至远程
- 将一个已存在的文件夹推送至远程仓库
如果你还没有克隆现有仓库,并欲将我们的本地仓库连接到某个远程服务器,就可以使用如下命令添加,首先,git init ,用以初始化仓库,即把你的本地文件交给git管理,然后我们执行: git remote add origin http:....git,(远程仓库地址),这样我们就把本地的git仓库和远程仓库建立起了连接,同样我们可以使用 git remote -v来查看一下关联信息。然后就可以正常使用你的本地仓库了。执行git pull 的时候会提示你的master分支分支没有添加追踪信息,可使用:git branch --set-upstream-to=origin/master master,来添加追踪信息。如此你就能够将你的改动推送到至远程仓库上去了。
提交修改
1、执行:git add file,把文件添加至暂存区(git add . ,将所有工作区修改添加至暂存区)
2、执行:git commit -m "change【】:提交说明" ,把文件提交到历史版本库"
3.执行:git pull --rebase,将获取远程仓库里相对于你上次pull之后的本地历史版本落后的提交fetch到你的本地仓库,并自动merge到你的本地分支。
当然,如果远程仓库没有新的提交,你就可以不必执行git pull命令。这里建议大家push之前先执行pull,以免push执行之后提示有新的提交,确保不会有问题。另外建议大家使用加上 - -rebase,而不是直接使用git pull,因为git pull 会产生一个新的提交节点,rebase不会,它可以让你的提交是线性的。我们这里不做具体说明。大家有兴趣可以查看其它资料。4、执行:git push origin master ,把文件提交至远程master分支。(当然也可以提交到其他分支。把master换成其他分支即可。)
解决冲突
如果,我们执行git pull --rebase 时,远程仓库里的文件跟你本地的同一个文件的同一行存在不一致就会有冲突。(或者merge时,两个分支的同一个文件同一行不一致时也会有冲突)这时,我们需要解决完冲突之后,继续合并。
查看冲突: git diff。
冲突:
<<<<<<<<<<<<<<<<
已经存在的文件内容
===================
本地文件内容
>>>>>>>>>>>>>>>>>>>>>
保留需要保留的部分,解决完冲突之后,我们使用,git rebase --continue 来继续合并。然后就可以继续我们的操作了
分支管理
分支是用来将特性开发绝缘开来的。在你创建仓库后,master是默认的,可在其他分支上进行修改,完成后再将他们合并到主分支上。每一人的每一个本地项目都有一个master分支
- 创建并切换分支
执行,git checkout -b dev,可创建一个dev分支,等同于:git branch dev(创建分支) + git checkout dev(切换分支)。
dev分支完成修改后,可以合并到master分支: git checkout master 在master上合并dev分支的修改 git merge dev,接下来,你就可以提交你的修改至远程。
有一点需要说明一下,如果你的分支没有添加追踪信息,可使用:git branch --set-upstream-to=origin/master dev,并且你的dev分支也可以直接提交到远程,git是允许的,但如果你的远程分支只有一个master的话,尽量不要这么做,可能会出现问题,这样逻辑是有点混乱的。一般项目开发中,远程分支可能有多个,pull的时候会把远程分支也拉下来(pull之后,再执行:git checkout -b 分支名 origin/远程分支名即可),如你的项目在远程dev分支,你可以直接从dev提交到远程的dev分支上。本地创建的分支,只有本地可见,除非你将你的本地分支推送到远程仓库。推送本地分支至远程仓库:git push origin 本地分支名:远程仓库分支名
另外还有一点值得注意,如果你需要切换分支,需要先把当前分支的修改暂存(git stash)或提交(git commit -m "修改提交到本地仓库")。git现在的版本不限制本地有修改不能切换分支(之前不可以切换,会有提示),但当前的修改会被带到新的分支上。且需要注意:同一个修改文件只能被提交一次。例如,你的dev分支上有修改,并且没有stash或者commit,这样就会把dev上的修改带到master,并且在mater提交,你在切回dev,dev就看不见修改了,因为修改已经被提交了。
- 删除分支
如果,我们新建的分支使命已经完成了,我们也不再需要它了,这时,我们可以执行
git branch -d name命令来删除这个分支。
删除远程分支:
git push origin -d name
stash暂存
前边我们已经提到了暂存的概念,当开发过程中(分支上有修改代码),但又需要切换分支时,就可将修改暂存后再切换分支,这样就可以省去一次commit。那我们应该怎么使用他呢,这里我们做个详细的说明,
stash 和add并不是一样的,stash保存当前的工作进度。会分别对暂存区和工作区的状态进行保存。git stash的作用是索引中的内容暂时存到一个堆上。而且这个堆是和分支不相关的。而git add命令将文件内容添加到索引(将修改添加到暂存区)。也就是将要提交的文件的信息添加到索引库中。stash命令:git stash save "name"。我们可以使用, git stash list 命令来查看当前有多少暂存。stash列表编号从@{0}开始,最近的一次保存编号为0. 新增代码+文件: git stash save -a "message",类似于:git commit -a -m "message".
取出暂存可以执行: git stash pop name ; 或者 git stash apply stash@{id}。需要了解的是,pop会把取出的stash删除,apply则会继续保存stash).删除某个stash:git stash drop stash@{id},删除所有stash:git stash clear
撤销修改
如果你远程上传了一个文件需要修改或者不想要了,直接在本地修改或者删除就好了,然后使用git add ,git commit 提交修改 ,然后push上传至远程(删除文件也要执行git add,add的作用是把修改放到暂存,增删改都属于修改)
撤销修改有三种类型:
- 1、如果你没有只是在工作区修改了文件,不想要了
可以使用checkout撤销: git checkout -- file 放弃对某个文件的修改 (checkout撤销时,必须要加 --参数,要不然就成了切换分支的操作了);或者使用git checkout . 放弃对所有修改
- 2、如果你已经add进了暂存区,不想要了
可以使用 git reset HEAD file 。本地修改被撤销至暂存区,然后使用步骤1的命令撤销修改
- 3、如果你已经 commit进了本地历史版本库,不想要了
可以使用 git reset --hard HEAD^ ,来撤销本地修改
版本回退
如果我们的远程仓库有问题,想要做版本回退来回退到没有问题的版本
- 1、 回退至版本
执行: git reset --hard HEAD^ ,可回退至上个版本
- 2、回退至某个版本
我们可以使用 git log来查看提交历史,想回退到某个版本,可以执行:git reset --hard HEAD 版本号,当然,如果你想回退到最新的第十个版本:git reset --hard HEAD~10,回退之后别忘了git push ,把操作推送到远程,否则,你做的任何修改都只是在你的本地。push成功后,版本被回退且提交记录也会删除,这时git log查询不到被删除的记录
- 回退至未回退之前的版本
如果你发现回退错了,需要回退至未回退之前的版本,我们可以使用 git reflog 查看历史,找到版本号你想回退的版本号,执行,git reset --hard HEAD 版本号 ,这个命令回退至此版本。本地回退成功,再push到远程即可。
还是要提醒一下,版本回退,一般是遇到比较大的问题时才会做,做之前最好通知一下本组其他同事。以防别人已经拉下了你的代码,已经在新的提交节点开始工作了。
Git其他常见命令及配置
- 查看状态
执行:git status 命令用来查看本地文件的状态(是否被add或者commit),建议执行过程中,确认一下状态,可以减少我们出错。有时候执行完status后,名称含有中文的文件名显示不正常,我们可以配置一下中文显示:git config --global core.quotepath false 。
- git的配置
每个使用git向远程仓库推送文件的人都需要自报家门,需要告诉git你是谁
我们可以使用如下命令来配置我们的全局用户名和邮箱: git config --global user.name "***", git config --global user.email "*****@****"。
当然你也可以针对某个远程仓库单独设置用户名和邮箱:git config user.name "***";git config user.email "*****@****"
查看配置的用户名邮箱:
git config user.name
git config user.email
取消全局配置:
git config --global --unset user.name
git config --global --unset user.email
git常见乱码解决
windows上中文乱码解决
$ git config --global gui.encoding utf-8
$ git config --global i18n.commitEncoding utf-8
$ git config --global gui.logOutputEncoding utf-8
git status后显示乱码
$ git config --global core.quotepath false
从gitlab拉取ssh的代码
基于ssh加密的管理的代码需要配置ssh key
我们可以先查看一下本地是否有ssh密钥: cd ~/.ssh
如果有,直接复制.pub中的密钥
如果没有,需要设置git用户名和邮箱,生成密钥
$ ssh-keygen -t rsa -C "你的邮箱"按3个回车,密码为空。(可输入可不输入)得到了两个文件:id_rsa和id_rsa.pub
最后,我们打开id_rsa.pub文件,复制密钥,登录gitlab,在个人中心打开setting。切换到SSH key,粘贴复制好的秘钥,点击Add key,添加成功之后就可以拉取代码了。