天天看点

git常用操作一,缘由。二,git简介。三,git常用命令。四,总结。

目录

一,缘由。

二,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时由于本地已经修改了同样的文件,所以无法直接获取远程库的更新,此时一般会报这样的错误:

git常用操作一,缘由。二,git简介。三,git常用命令。四,总结。

意思就是当前的版本落后于远程库的版本,想要更新需要先pull一下,操作如下:

git常用操作一,缘由。二,git简介。三,git常用命令。四,总结。

但是并无法直接拉取,因为本地库相应的文件已经更新,所以如果直接拉取下来,会出现覆盖的问题,那么该怎么办呢?此时有两种办法:

(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在拉取代码时会产生冲突,无法完成合并,报错信息如下:

git常用操作一,缘由。二,git简介。三,git常用命令。四,总结。

很明显,说合并时产生了冲突,此时打开hello.txt你会发现:

git常用操作一,缘由。二,git简介。三,git常用命令。四,总结。

上图会列出冲突的内容,其中<<<<<<head 到 ===之间的内容是当前head的版本,===到>>>>>>之间的内容是另一个版本的内容,上面还有它的提交id,此时只需要留下需要的内容,删掉其他的版本就行了,如下:

git常用操作一,缘由。二,git简介。三,git常用命令。四,总结。

上面的操作就是留下自己修改的版本,然后保存,注意冲突解决之后,还需要add,commit,之后再pull就行了。

5,.gitignore文件

在仓库中经常会看到有一个.gitignore的文件,它的作用呢就是排除掉不用提交的内容,例如Java编译之后的class文件,要是没有这个过滤文件,通过git add . 会将所有新增的文件都添加到工作区,除此之外还有很常见的.idea文件,.settings文件等配置信息都没必要上传到远程库。

四,总结。

git是程序开发中必不可少的工具之一,虽然命令不多,但是使用起来还是很容易踩坑,上面是我总结的git常用的一些操作,如有问题,欢迎指出。

继续阅读