目录
一,缘由。
二,git简介。
三,git常用命令。
1,初始化方式
2,仓库操作
3,分支操作
5,.gitignore文件
四,总结。
一,缘由。
在多人开发中,为了控制版本迭代,常常需要使用svn或git,这不我们就使用的git,虽然就那几个常用的命令,但是使用的时候还是遇到了很多坑,比如冲突。。。于是便有这篇博客,谁让我老是犯同一个错误呢,好记性不如烂笔头。
二,git简介。
git可以简单地理解为就是一个具有版本控制的仓库,你什么时候往仓库里放了什么都会有详细的记录,同时它具有版本回退的功能,这点可以和数据库联系起来,当数据库遇到了问题,就可以通过某一个时间点的备份进行回退,这样虽然备份之后的记录不存在了但却可以保留之前的数据;同时数据库我们往往有一个正式的库,一个测试的库,git也是如此,平时开发可以尽情地往dev库中提交记录,当某一个功能正常之后再提交到正式库,这样开发和生产就分开了,不然什么都往正式库提,万一有什么bug,就会直接影响到用户的体验。
git与svn最大的不同就是git是分布式的版本控制工具而svn是集中式的版本控制工具,简单地说git只要有权限,每个人都可以在本地clone一份远程仓库,然后进行修改,这样的结果就是同一时刻不同的人本地的git库是不同的;而svn采用集中式的版本控制,有一个单一的集中管理版本的服务器,上面保留有所有文件的。再通俗点就是git每个人都可以创建自己的版本库,每次提交可以只提交本地库,不用网络,就能完成自己的版本控制;而svn版本是统一管理的,你只能在已有的版本上进行修改,同步时需要连接服务器,这就是与分布式的不同。另外,svn常用图形化工具进行管理,而git可以直接使用命令进行。
三,git常用命令。
1,初始化方式
git clone + 仓库的url
可以通过http或ssh,ssh的方式需要将自己电脑的ssh公钥放到自己git远程仓库中,ssh的好处就是之后push等操作不用在验证用户信息,通过http每次都需要验证账号和密码信息。
git init
初始化本地仓库。
git remote add origin + 仓库的url
添加远程仓库信息,其中origin是本地给仓库取的名字,一般都使用origin,当然可以取别的名字。
git pull + 仓库名 + 分支名
拉取代码,完整命令eg:git pull origin master
上面的命令是拉取主分支的代码,master分支是默认存在的分支,如果想拉取其他分支,只需要改为相应的分支名就行了,eg:
git pull origin dev 拉取origin仓库的dev分支,前提是dev分支需要已存在。
当git clone时默认拉取的是master分支,如果想要clone别的分支,使用以下命令:
git clone -b + 分支名 + 仓库的url
查看git的配置信息:
git config -l
2,仓库操作
查看仓库信息:
git remote -v
删除本地仓库与远程仓库的关联:
git remote remove + 远程仓库的名字
本地库与远程库关联:
git remote add 仓库名(本地给远程起的别名) + 远程仓库url
3,分支操作
查看本地分支:
git branch
查看远程所有分支:
git branch -a
新建本地分支:
git branch+ 分支名
新建本地分支并切换到该分支:
git checkout -b + 分支名
切换本地分支:
git checkout + 本地分支名
删除本地分支:
git branch -d + 本地分支名
删除远程分支:
git push + 仓库名 --delete + 分支名
eg: git push origin --delete dev 删除远程的dev分支
需要注意的是: 当删除远程分支后,本地分支依然存在,所以还需要手动删除本地的相应分支,另外删的时候不能在该分支上删除该分支,否则会报error。
向远程仓库提交本地新建的一个分支:
git push 仓库名 + 分支名
eg: git push origin test 向远程库origin提交test分支
本地新建分支并与远程分支进行关联:
git branch --set-upstream-to 仓库名/分支名
该操作会将当前分支与远程分支关联,eg: 当前我在本地新建的devlope分支上,则通过命令 git branch --set-upstream-to origin/dev 则会将本地的devlope分支与远程库origin的dev分支进行关联。
查看本地分支与远程分支的关联关系:
git branch -vv
该操作会显示所有的本地分支追踪的是哪个远程分支。
一般本地分支与远程分支都是同名的,方便辨认区分,当然你也可以让本地分支与关联的远程分支名称不同,这样的话通过上述命令就可以知道分支间的映射关系。
4,冲突
在使用git的过程中最让人无语的就是冲突了,冲突造成的原因常见的有A对某个文件进行修改并推送到了远程库,此后B并没有同步远程库,就对该文件之前的版本进行了修改,之后提交时会提示本地版本库落后远程库,需要进行pull,但是pull时由于本地已经修改了同样的文件,所以无法直接获取远程库的更新,此时一般会报这样的错误:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxkTN1IDM1kTM1ETOwkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
意思就是当前的版本落后于远程库的版本,想要更新需要先pull一下,操作如下:
但是并无法直接拉取,因为本地库相应的文件已经更新,所以如果直接拉取下来,会出现覆盖的问题,那么该怎么办呢?此时有两种办法:
(1)通过git stash 压栈操作,可以保留当前的暂存区内容,即暂存工作进度,然后将本地库回到上一次提交的地方,此时还没有对相应的文件进行修改,通过git pull可以成功拉取最新的修改到本地库,通过git stash list可以查看当前的压栈信息,当本地库是最新的版本后,通过git stash pop可以取消压栈将本地库恢复到之前的工作区版本,注意,如果没有冲突的话,之前保留的信息会与当前的版本库内容自动进行合并,如果有冲突则无法自动完成,此时需要手动解决冲突,进行合并。
(2)拷一份自己的修改出来,然后将文件恢复到之前未修改的状态,再pull,文件恢复状态有以下几种情形:
对于没有add的文件, 通过git checkout -- +文件名 会放弃对该文件的所有更改。注意中间的两个"-",没有这个就是新建分支了。
对于add之后缓存了的文件,通过git reset HEAD + 文件名 可以撤销之前缓存的内容 ,此时工作区的修改依然是存在的,可以通过git checkout 命令继续取消之前的修改。
对于commit之后的文件,通过git reset --hard + commit_id 可以回退到任意一个提交的版本,其中提交的版本号通过git log可以获得。
另一种常见的冲突是,A和B同时对一个文件的相同部分的内容进行了修改,此时git不知道该保留谁的版本,此时就需要手动处理冲突。
之前文件的内容为:
1+1=2
A修改后文件的内容为:
1+1=一个人的修改
B修改后的内容为:
1+1=另一个人的修改
此时当A提交后,B在拉取代码时会产生冲突,无法完成合并,报错信息如下:
很明显,说合并时产生了冲突,此时打开hello.txt你会发现:
上图会列出冲突的内容,其中<<<<<<head 到 ===之间的内容是当前head的版本,===到>>>>>>之间的内容是另一个版本的内容,上面还有它的提交id,此时只需要留下需要的内容,删掉其他的版本就行了,如下:
上面的操作就是留下自己修改的版本,然后保存,注意冲突解决之后,还需要add,commit,之后再pull就行了。
5,.gitignore文件
在仓库中经常会看到有一个.gitignore的文件,它的作用呢就是排除掉不用提交的内容,例如Java编译之后的class文件,要是没有这个过滤文件,通过git add . 会将所有新增的文件都添加到工作区,除此之外还有很常见的.idea文件,.settings文件等配置信息都没必要上传到远程库。
四,总结。
git是程序开发中必不可少的工具之一,虽然命令不多,但是使用起来还是很容易踩坑,上面是我总结的git常用的一些操作,如有问题,欢迎指出。