Git总结

2019-08-16 12:19:07来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Git总结

一、Git是什么?

      Git是目前世界上最先进的分布式版本控制系统。 Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 可以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Torvalds 开始着手开发 Git 是为了作为一种过渡方案来替代 BitKeeper,后者之前一直是 Linux 内核开发人员在全球使用的主要源代码工具。开放源码社区中的有些人觉得BitKeeper 的许可证并不适合开放源码社区的工作,因此 Torvalds 决定着手研究许可证更为灵活的版本控制系统。尽管最初 Git 的开发是为了辅助 Linux 内核开发的过程,但是我们已经发现在很多其他自由软件项目中也使用了 Git。例如 很多 Freedesktop 的项目迁移到了 Git 上。   官网地址:https://git-scm.com/  软件下载: Windows版下载: 选择windows 默认下载2.11.1的64位版本  

Linux版下载:

Download for linux and Unix It is easiest to install Git on Linux using the preferred package manager of your Linux distribution. Debian/Ubuntu $ apt-get install git Fedora $ yum install git (up to Fedora 21) $ dnf install git (Fedora 22 and later) Gentoo $ emerge --ask --verbose dev-vcs/git Arch Linux $ pacman -S git openSUSE $ zypper install git FreeBSD $ cd /usr/ports/devel/git $ make install Solaris 9/10/11 (OpenCSW) $ pkgutil -i git Solaris 11 Express $ pkg install developer/versioning/git OpenBSD $ pkg_add git Alpine $ apk add git Red Hat Enterprise Linux, Oracle Linux, CentOS, Scientific Linux, et al. RHEL and derivatives typically ship older versions of git. If you cannot (or don't want to) compile git from source, you may need to use a 3rd-party repository such as the IUS Community Project to obtain a more recent version of git.  

二:SVN与Git的最主要的区别?

      SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。    Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

三:在windows上如何安装Git?

点击git安装软件(老师这里用的 这个版本),执行默认安装即可。 完成安装后,打开git-bash,出现如下界面,表示安装成功。 安装完成后,还需要最后一步设置,在命令行输入如下: $ git config --global user.name "laoluan" $ git config --global user.email "ccnulyq@163.com"    因为Git是分布式版本控制系统,所以需要填写用户名和邮箱作为一个标识。    注意:git config  –global 参数,有了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然你也可以对某个仓库指定的不同的用户名和邮箱。     使用$ git config –-list可以查看是否设置成功。  

四:如何操作?

一:创建版本库。

     什么是版本库?版本库又名仓库,英文名repository,可以简单的理解一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改,删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻还可以将文件”还原”。 创建一个版本库也非常简单,如下是:E盘 –> javaee->git_repository目录下新建一个first_git版本库。 pwd 命令是用于显示当前的目录。

1. 通过命令 git init 把这个目录变成git可以管理的仓库,如下:

     这时候当前first_git目录下会多了一个.git的目录,这个目录是Git来跟踪管理版本的,没事千万不要手动乱改这个目录里面的文件,否则,会把git仓库给破坏了。     

2. 把文件添加到版本库中。

首先要明确下,所有的版本控制系统,只能跟踪文本文件的改动,比如txt文件,网页,所有程序的代码等,Git也不列外,版本控制系统可以告诉你每次的改动,但是图片,视频这些二进制文件,虽能也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是知道图片从1kb变成2kb,但是到底改了啥,版本控制也不知道。 如下的示例中,在first_git目录下新建一个记事本文件readme.txt,可以事先写点内容进去,如“this is my fisrt git”。具体操作为:   1)、使用命令 git add readme.txt添加到暂存区里面去      注意:如果readme.txt事先不存在,则会报错“pathspec 'readme.txt' did not match any files”,这时需要在目标目录中手动创建该文件,或者使用git命令“touch readme.txt”创建该文件,然后使用“git add readme.txt”命令,没有任何提示,则添加成功。 2)、用命令 git commit通知git,把文件提交到仓库。    出现如下提示,则提交成功。 提交成功后,可以通过git status命令,查看是否还有文件未提交。      (a)、需要指出的是,在首次提交至git时,readme.txt是一个空文件,没有文本内容 (b)、在readme.txt中写入一点内容,如“this is my first git”,然后再次使用git status命令来查看结果 (c)示例中的提示说明,readme.txt文件有修改,但是没有提交。可以使用git readme.txt diff命令查看具体修改哪些内容。 (d)、重复之前的提交操作,再次提交修改后的readme.txt文件    

二:版本回退:

1)、继续修改文件readme.txt,追加文本“git is a very useful tool.”,重复之前的操作,继续提交。 2)、readme.txt已经提交过三次,那么怎么查看它提交的历史记录呢?在这里可以使用git log命令来查看。 使用命令git log --pretty=oneline,则打印简易记录。 3)、思考:如何把当前版本回退到上一个版本?常用的方式有两种:   (a)、命令git reset --hard HEAD^,根据版本顺序回退版本 该命令可以使版本回退到上一个版本,如果要回退到上上个版本,则将HEAD^改成HEAD^^;如果需要往上回退n个版本,则在HEAD后面加n个^,当n比较大时,使用起来不方便,这是可以简化成HEAD~n。 回退之前,readme.txt中的内容是: 执行命令git reset –hard HEAD^之后,除了打开readme.txt来查看文件中的内容外,还可以使用命令cat readme.txt来查看: 可以发现,已经成功回退到上一个版本了。继续使用命令git log来查看当下历史记录,显示只有两个版本记录。 现在要回退到最新的一个版本,可以使用命令git reset –-hard “版本号”。那么问题来了,如何获取历史的版本号?   (b)、git reset –-hard “版本号”:根据版本号回退 当版本比较多时,按照hard HEAD^的方式显然很不方便,使用指定版本号的方式回退比较合理。 在前面的示例中,我们将readme.txt回退了一个版本,通过git log命令,只能看到最开始的两个版本,那么,如何回退到最新的版本呢(也就是第三个版本,注意理解最新的意思)?解决这个问题,只需要获取历史的版本号即可。 使用命令git reflog查看历史版本记录。 获取了版本号之后,就可以使用命令hard “版本号”进行回退了。 比如,readme.txt当前处于第二个版本,文本内容为“this is my first git”,使用命令git reset –-hard “ed3dcd0”:  

三:理解工作区与暂存区的区别?

       工作区:就是你在电脑上看到的目录,比如目录下git_repository里的文件(.git隐藏目录版本库除外)。或者以后需要再新建的目录文件等等都属于工作区范畴。 版本库(Repository):工作区有一个隐藏目录.git,这个不属于工作区,这是版本库。其中版本库里面存了很多东西,其中最重要的就是stage(暂存区),还有Git为我们自动创建了第一个分支master,以及指向master的一个指针HEAD。 前面说过使用Git提交文件到版本库有两步:    第一步:是使用 git add 把文件添加进去,实际上就是把文件添加到暂存区。    第二步:使用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支上。 当然,在提交之前及之后,分别查看提交状态是一个比较好的习惯。   继续看上文中的实例: 在文本中添加新的内容,比如“git is easy”,同时,新建一个文件,同样写入点内容,比如“this is the second git file” (1)、使用命令git status查看状态 (2)、使用命令git add 文件名,将文件添加到暂存区,然后查看状态,观察有没区别? (3)、使用命令git commit,将所有文件一次性提交到当前分支上。  

四:Git撤销修改和删除文件操作。

1、撤销修改 git checkout -- fileName: 在readme.txt文件新增一行内容,比如“git is 6666666”,先通过命令“cat 文件名”,查看文件中的文本内容。 在提交之前,发现新增的内容“git is 666666”有误,现在要删除这些内容,有两种方法: (1)、在明确哪些内容有误时,进入目录打开文件,直接删除对应的内容,然后通过add、commit命令提交即可。 (2)、按照版本回退的方法,回退到上一个版本。 除了这两种方法,还有没有别的方法呢?首先git status查看一下状态: 从图中可以发现,git提供了提示: ○1、使用git add <file>命令,将文件添加到暂存区,等待提交。 ○2、使用git checkout --<file>命令,在工作空间中将该文件所作出的修改全部废弃掉。 如下图所示,使用git checkout –-readme.txt命令,撤销修改:   使用git checkout -- readme.txt 的意思是,将readme.txt在作区做的修改全部撤销,这里有2种情况,如下: (1)、readme.txt在修改后,还没有放到暂存区。 这种情况使用checkout命令,可以直接撤销修改,回到和当前版本库一模一样的状态。 (2)、readme.txt放入暂存区后,接着又作出了修改,撤销修改就是回到刚刚添加到暂存区后的状态。 现在readme.txt中添加文本“git is 6666666”,如何readme.txt添加到暂存区;继续修改readme.txt,添加文本“git is 7777777”,使用回撤命令checkout,发现readme.txt回到刚添加到暂存区时的状态,即文本中存在内容“git is 66666666”   tips: (1)、命令git checkout -- readme.txt 中的--很重要,如果没有--的话,那么命令变成创建分支了。 (2)、修改后,又添加到了暂存区的文件,可以使用版本回退命令,回到指定的版本,即git reset –-hard “版本号”   2、删除文件 git rm fileName: 使用命令git rm fileName,可以删除文件。    

五:远程仓库。

在开始本节内容之前,先注册GitHub账号,由于你的电脑的本地Git仓库和github仓库之间的传输是通过SSH加密的,所以需要配置验证信息:   第一步:创建SSH Key。 打开git-bash命令行,输入命令ssh-keygen -t rsa -C '5233@qq.com'即可,其中邮箱地址替换为个人github账户中绑定的邮箱。 注意:在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果有的话,说明之前创建过SSH Key,可以跳过该步骤了。   第二步:连接Github (1)、登录github官网(https://github.com/); (2)、点击settings (3)、点击○1“SSH and GPG Keys”,然后点击○2“New SSH Key”,在弹出的文本域中,title可以自定义,key则粘贴id_rsa.pub文件中的个人公钥即可。最后点击○3“Add SSH Key”   (4)、添加成功后的页面如下:   (5)、在命令行中输入ssh -T git@github.com,验证是否连接成功。  

1、如何添加远程库?

现在在本地创建了一个Git仓库后,还需在github创建一个Git仓库,并且让这两个仓库进行远程同步,这样github的仓库既可以作为备份,又可以实现多人协作。 (1)、登录github上,然后在右上角找到“create a new repository”创建一个新的仓库。如下: (2)、在Repository name填入first_git(自己的本地仓库),其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库: 目前,在GitHub上的这个first_git仓库还是空的,GitHub告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库。 (3)、在本地的first_git仓库下运行git remote命令,建立本地仓库与远程github仓库的连接,然后使用git push命令,将本地仓库的分支,推送到远程github仓库中。 ○1git remote add origin https://github.com/ccnulyq/0531 (如果是Linux环境上建立远程连接,则默认的是http协议,所以每次push的时候需要输入github的账号和密码,可以将其连接方式改为ssh git ramote add origin git@github.com:/ccnulyq/0531 删除连接:git remote rm origin)   ○2git push -u origin master          在推送的过程中,需要输入github账户名和密码,如下图所示:   由于远程库是空的,我们第一次推送master分支时,加上了–u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。推送成功后,可以立刻在github页面中看到远程库的内容已经和本地一模一样了: (5)、只要本地提交了修改,就可以使用命令git push origin master,将修改同步到远程仓库,至此,分布式版本库就搭建完成了。 2、如何从远程库克隆? 前面我们实现了如何关联本地仓库到Github仓库,并且通过git push命令同步本地修改到远程仓库中。 那么,如何实现将远程仓库克隆到本地仓库呢? (1)、登陆github官网,点击“new repository”,建立一个名为second_git的远程仓库。      (2)、使用git clone命令,将远程仓库克隆到本地 打开本地仓库目录,可以发现second_git仓库克隆成功了。  

六:创建与合并分支。

1、创建分支 在前面的操作中,我们已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。 (1)、创建并切换到分支:git checkout –b masterName 创建分支,并切换到分支上。在这里,相当于如下2条命令: ○1git branch dev:创建分支 ○2git checkout dev:切换分支 git branch查看分支,会列出所有的分支,当前分支前面会添加一个“*”   (2)在新的分支dev上修改并提交文档 从上图可以发现,dev分支上的修改并没有影响到master上,这分明分支之间是相互独立。 (3)、合并分支:git merge dev,将指定分支合并到当前分支上。 git merge命令用于合并指定分支到当前分支上,合并后,再查看readme.txt内容,可以看到,和dev分支最新提交的是完全一样的。 注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。 (4)、删除分支:git branch –d dev,删除指定分支  

2、如何解决冲突?

(1)、先创建一个新的分支new_branch,然后在readme.txt中添加一行文本“git is 88888888”,保存并提交。   (2)、切换到master分支上,也在readme.txt上添加一行文本,如“git is 9999999999”,如下所示:   (3)、在master分支上,合并new_branch分支,如下所示: Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中<<<HEAD是指主分支修改的内容,>>>>>new_branch 是指new_branch上修改的内容,中间用=======分割开。   (4)、如何解决分支合并产生的冲突? 删除掉标记性的废代码,在这里指: ○1、“<<<<<<< HEAD” ○2、“=======” ○3、“>>>>>> new_branch”        保存修改后提交,然后可以查看提交日志:   3、分支管理策略 通常合并分支时,git使用”Fast forward”模式,在这种模式下,删除分支后,会丢掉分支信息。可以使用参数 –no-ff来禁用“Fast forward”模式。操作示例步骤如下: ○1、创建一个dev分支。 ○2、修改readme.txt内容。 ○3、添加到暂存区并提交。 ○4、切换回主分支(master)。 ○5、合并dev分支,使用命令 git merge –no-ff  -m “注释” dev ○6、查看历史记录    分支策略: 首先master主分支应该是非常稳定的,也就是用来发布新版本,一般情况下不允许在上面干活,干活一般情况下在新建的dev分支上干活,干完后,比如上要发布,或者说dev分支代码稳定后可以合并到主分支master上来。 七:多人协作。 当你从远程库克隆时候,实际上Git自动把本地的master分支和远程的master分支对应起来了,并且远程库的默认名称是origin。 (1)、要查看远程库的信息 使用 git remote (2)、要查看远程库的详细信息 使用 git remote –v 如下演示:    一:推送分支:git push origin branchName       推送分支就是把该分支上所有本地提交到远程库中,推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:   比如我现在的github上的readme.txt代码如下: 本地的readme.txt代码如下: 现在我想把本地更新的readme.txt代码推送到远程库中,使用命令如下: 如上,推送成功, github上的readme.txt内容 如下: 我们现在要推送到其他分支,比如new_branch分支上,我们还是那个命令 git push origin dev 那么一般情况下,那些分支要推送呢? (1)、master分支是主分支,因此要时刻与远程同步。 (2)、一些修复bug分支不需要推送到远程去,可以先合并到主分支上,然后把主分支master推送到远程去。 二:抓取分支: 多人协作时,大家都会往master分支上推送各自的修改。现在我们可以模拟另外一个同事,可以在另一台电脑上(注意要把SSH key添加到github上)或者同一台电脑上另外一个目录克隆,新建一个目录名字叫testgit2 但是我首先要把dev分支也要推送到远程去,如下 接着进入testgit2目录,进行克隆远程的库到本地来,如下:    现在目录下生成有如下所示: 现在我们的小伙伴要在dev分支上做开发,就必须把远程的origin的dev分支到本地来,于是可以使用命令创建本地dev分支:git checkout  –b dev origin/dev 现在小伙伴们就可以在dev分支上做开发了,开发完成后把dev分支推送到远程库时。 如下: 小伙伴们已经向origin/dev分支上推送了提交,而我在我的目录文件下也对同样的文件同个地方作了修改,也试图推送到远程库时,如下: 由上面可知:推送失败,因为我的小伙伴最新提交的和我试图推送的有冲突,解决的办法也很简单,上面已经提示我们,先用git pull把最新的提交从origin/dev抓下来,然后在本地合并,解决冲突,再推送。 git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置dev和origin/dev的链接:如下: 这回git pull成功,但是合并有冲突,需要手动解决,解决的方法和分支管理中的 解决冲突完全一样。解决后,提交,再push: 我们可以先来看看readme.txt内容了。 现在手动已经解决完了,我接在需要再提交,再push到远程库里面去。如下所示: 因此:多人协作工作模式一般是这样的: 1.    首先,可以试图用git push origin branch-name推送自己的修改. 2.    如果推送失败,则因为远程分支比你的本地更新早,需要先用git pull试图合并。 3.    如果合并有冲突,则需要解决冲突,并在本地提交。再用git push 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 https://github.com/tugenhua0707/testgit 关联一个远程库    git push –u(第一次要用-u 以后不需要) origin master 把当前master分支推送到远程库    git clone https://github.com/tugenhua0707/testgit  从远程库中克隆    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分支推送到远程库对应的远程分支上      

原文链接:https://www.cnblogs.com/aknife/p/11332613.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:JVM垃圾收集策略与算法

下一篇:Spring Boot @EnableAutoConfiguration解析