Git简介
Git(读音为/gɪt/。)是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 [1] Git 是 [Linus Torvalds](https://baike.baidu.com/item/Linus Torvalds/9336769) 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
以上来自于百度百科
看了一个大佬的介绍,总结下来:
当你和同事同时做一个文档的时候,Git不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以。
安装Git
在Windows上安装Git,可以从Git官网下载,一路默认下去就好了,安装完成后按键盘的win+R,输入cmd,弹出命令符见面再输入git,出现如下命令则安装成功:
之后在命令行输入:
1 | $ git config --global user.name "Your Name" |
这里user.name和user.email可自定义,到这里就安装完成了。
创建版本库
什么是版本库?版本库又名仓库,英文repository(/rɪˈpɑːzətɔːri/)。可以简单的理解成一个目录。
开始创建版本库。
1.创建一个空文件夹jar,进入jar文件夹(注意:座位了避免出现问题,文件夹及路径不包含中文)
2.鼠标右键,单击Git Bash here,出现如下界面:
输入命令初始化仓库:
1 | git init |
这个时候jar文件夹就是一个仓库了,并且文件夹下面会多出一个.git文件夹
跟踪新文件
首先创建一个文本文件readme.txt。内容如下
1 | This is a text file. |
一定要在jar这个文件夹目录下,否则会找不到。然后开始放入git仓库
第一步,把文件添加到仓库:
1 | git add readme.txt |
执行完上面命令后没有任何显示就说明添加成功,否则百度去吧。我也不知道。
第二部,提交文件
1 | git commit -m 'add text file' |
-m后面是本次提交的说明,可以输入任何内容,这样就可以从历史记录中查看
执行完命令后会告诉你,1 file changed 一个文件被改动;1 insertions:插入了一行内容
为什么Git添加文件需要add,commit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:
1 | $ git add file1.txt |
跟踪改目录下所有文件可以使用:
1 | git add . |
查看状态
如果你修改了文件,但是你忘了你修改的是什么东西了。这个时候可以使用这个语句查看修改状态。
1 | git status |
1 | On branch master |
如果显示的是上面的语句,那么说明工作目录非常干净,没有被修改过。
如果像这样:
说明git之前的提交中没有这样的文件,就要使用git add <file>来跟踪文件
查看历史提交
默认不是用任何参数的话,git log会按提交时间列出所有的更新
1 | git log |
git log 有许多选项可以帮助你搜寻你所要找的提交, 接下来我们介绍些最常用的。
个常用的选项是 -p,用来显示每次提交的内容差异。 你也可以加上 -2 来仅显示最近两次提交:
1 | git log -p |
1 | git log --stat |
--stat选项查看每次提交的简略统计信息
最有意思的还是format,可以定制要显示的记录格式。当你记录变了时,只要你指定了及时,输出的内容就不会随着Git的更新而改变:
1 | $ git log --pretty=format:"%h - %an, %ar : %s" |
git log – pretty=format 常用的选项 列出了常用的格式占位符写法及其代表的意义。
| 选项 | 说明 |
|---|---|
%H |
提交对象(commit)的完整哈希字串 |
%T |
树对象的完整哈希 |
%P |
父对象(parent)的完整哈希 |
%an |
作者 |
%ae |
电子邮件 |
%ad |
修订日期,可以定制格式 |
%ar |
修订日期 |
%cn |
提交者名字 |
%ce |
提交者邮件 |
%cd |
提交日期 |
%cr |
|
%s |
提交说明 |
版本回退
现在已经会上传文件到仓库了,那么在来一遍。修改readme.txt文件如下:
1 | This is a text file. |
然后提交:
1 | $ git add readme.txt |
这个时候你发现你更改的内容错了,想回到上个版本或者上上上个版本。那么你怎么还记得内容呢。但是Git就会记得。使用git log查看:
如果你文件更改次数多,输出的信息非常多,那么可以输入git log --pretty=oneline:
友情提示,这里看到的似778d2ddf...的叽里呱啦的是commit id(版本号)
好了,现在我们启动时光穿梭机,准备把readme.txt回退到上一个版本,也就是add distributed的那个版本,怎么做呢?
首先,Git必须知道当前版本是哪个版本,在Git中,用HEAD表示当前版本,也就是最新的提交778d2ddf...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
现在,我们要把当前版本first update readme.txt回退到上一个版本add text file,就可以使用git reset命令:
1 | $ git reset --hard HEAD^ |
先不要关闭命令窗口,在窗口输入cat readme.txt看看内容是不是上个版本的。
1 | $ cat readme.txt |
果然回到了上个版本,不过如果又想回到最新版本,那么问题来了。先输入git log查看一下状态:
1 | $ git log |
这里已经没有最新的那个版本的,那么你需要找到之前看的log,找到commit id。输入如下命令可以回到最新版本:
1 | 778d2ddf |
版本号可以不用写全,前几位就好了。再查看一下内容
1 | $ cat readme.txt |
没有commit id怎么办,git提供了后悔药,git reflog命令查看你每次的命令
1 | $ git reflog |
1 | 778d2dd (HEAD -> master) HEAD@{0}: reset: moving to 778d2ddf |
这样又可以找到first update readme.txt的commit id是7b0fa71,然后就又可以改回去了
撤销操作
撤销提交
有时候我们提交完后发现还漏了几个文件,或者提交信息写错了。此时可以使用--amend选项尝试重新提交:
1 | git commit --amend |
撤销对文件的修改
如果你修改了文件,但是发现改错了,想回到没修改之前,那么可以使用:
1 | git checkout -- <file> |
注意空格
远程仓库
添加远程仓库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。
首先,登录GitHub,然后在右上角找到New reposotpry,创建一个新的仓库
在Repository name填入jar,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
目前github上的jar仓库是个空的,那么需要上传本地仓库的话需要吧本地仓库和它关联。根据提示,在命令行中输入命令:
1 | $ git remote add origin https://github.com/ViJar-Wang/jar.git |
上面那段网址是github提供的,一眼就能看到,复制下来用就好了。然后通过命令提交。
1 | $ git push -u origin master |
如果你是第一次push或者clone,那么会得到一个警告:
1 | The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established. |
这里输入yes然后回车就好
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
1 | Warning: Permanently added 'github.com' (RSA) to the list of known hosts. |
这个警告只会出现一次,后面的操作就不会有任何警告了。
如果你实在担心有人冒充GitHub服务器,输入yes前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致。
回到正题。这个时候去远程仓库看一下:
会发现github上已经有readme.txt这个文件了。
从远程仓库克隆
当你需要从远处仓库下载的时候,你可以直接下载压缩包文件,也可以通过命令克隆到本地
1 | git clone https://github.com/ViJar-Wang/ViJar-Wang.github.io.git |
注意把Git仓库地址换成你自己的,克隆也可以指定目录,在末尾加个路径就好了
分支操作
创建、合并以及删除分支
创建
首先,创建test分支然后切换到:
1 | git checkout -b test |
git checkout命令加上-b参数表示创建并切换,相当于以下两条命令:
1 | git branch test |
然后,用git branch命令查看当前分支:
1 | $ git branch |
git branch命令会列出所有分支,当前分支前面会标一个*号。
合并
现在,我们把test分支的工作成果合并到master分支上:
1 | git merge test |
删除
1 | git branch -d dev |
服务器上的Git
本文说明在局域网中用一台电脑作为服务器,在服务器中创建一个文件夹,并设置文共享。然后该文件夹作为公开的版本库,局域网内其他电脑都可以访问。
windows配置公开版本库
服务器端
首先在d盘创建一个文件夹,名字为GitTest.
1.在GitTest目录下新建一个裸仓库名字为test,命令如下:
1 | git init --bare test |
test目录结构如下:
2.设置文件夹为共享文件夹:
右键 –> 属性,如下:
3.然后设置为所用用户,点击Everyone – > 共享:
4.这个时候该文件夹属性上有个网络路径:
客户端
1.在客户端右键我的电脑–>映射网络驱动器,如下图所示:
这个时候会发现电脑下多了个Z盘。Z盘就是公开文件夹
test就是公共版本库。
测试
在客户端,创建本地版本库,加入该版本库下有一个项目。名字叫pc,
先把项目push到版本库中,命令:
1 | git add . |
这个时候在另一个客户端需要修改该工程,只需在另一个客户端配置好公开版本库,把项目克隆下来:
1 | git clone z:\\test |
这样这个项目就在test目录下了。
最后记得在不使用时要把共享文件夹取消共享。
远程仓库分支操作
还是在上面公开版本库的基础上,假如现在有三个开发者,三台客户端,第四台为服务器。服务器地址为:z:\\test.我们现在需要做的是每个人开发一条分支,最后再把所有分支合并起来。
首先我们在服务器的仓库上分配三条新分支:
1 | git breanch b1 |
在客户端1克隆下来仓库中的项目:
1 | git clone z:\\test |
这个时候你会发现,客户端1克隆的下来的仓库里面只有一条分支:
1 | $ git branch |
但是在服务器是有三条分支的:
1 | $ git branch |
如果你修改了文件内容,然后往b1分支push,
1 | $ git push origin b1 |
它会提示你没有足够的权限去操作,那么此时你需要在本地创建一个分支和远程的那个分支绑定起来:
1 | git checkout -b b1 origin/b1 |
这条语句的意思是创建一个b1分支并切换到,同时和origin中的b1分支绑定。注意:你创建的本地的分支名必须要和远程的分支名一致,否则远程会创建一条新的分支。
现在我们有了和远程绑定的分支,然后把修改的文件push到远程分支b1中去
1 | $ git add readme.txt |
这样就成功提交到远程仓库中去了。
我们在服务器通过git branch -v查看一下分支最新提交记录:
1 | $ git branch -vv |
提交成功。当你在本地不知道远程仓库有哪些分支时,可通过git branch -a来查看远程仓库的分支:
图中红色部分就是远程仓库的分支。
远程分支的合并
现在远程仓库的上床已经搞完了,开始搞定分支的合并
现在我转到客户端2,首先把从库中的东西克隆下来,里面有一个文件readme.txt
1 | $ git clone d:/testFile/repo |
创建一个分支与服务器绑定:
1 | git checkout -b b2 origin/b2 |
现在我们分别修改客户端1的readme.txt文件和客户端2的readme.txt。并且修改同一处地方,添加不同的内容:
客户端1:
1 | Hello ,this is the first text. |
客户端2:
1 | Hello ,this is the first text. |
分别提交到b1、b2分支中去:
查看服务器分支修改情况:
1 | $ git branch -v |
修改成功。但是合并有和问题,我们知道是不能在裸仓库操作内容的,所以我们需要先把最后完成的仓库再从远处库克隆下来:
1 | $ git clone z:\\test |
我们会发现这里的文件还是修改之前的,因为我们还没有合并分支。首先创建并绑定分支,再查看一下提交记录:
1 | $ git checkout -b b1 origin/b1 |
在这里可以看到已经和远程仓库绑定了,在同样的操作绑定b2。然后开始合并,首先把b1合并到master中去:
1 | $ git merge b1 |
cat查看一下readme.txt中的内容:
1 | $ cat readme.txt |
出错了啊。HEAD是只上个版本的内容,======下面是合并的内容,如果想要保留合并的内容只需要执行以下命令:
1 | $ git reset --hard HEAD^ |
在查看一下:
1 | $ cat readme.txt |
这样b1就合并成功了。同理合并完b2也会出现同样的错误:
1 | $ git merge b2 |
你想好保留哪个版本的只要回退一个版本再合并一次就好了。
图形化界面
Git 的原生环境是终端。 在那里,你可以体验到最新的功能,也只有在那里,你才能尽情发挥 Git 的全部能
力。 但是对于某些任务而言,纯文本并不是最佳的选择;有时候你确实需要一个可视化的展示方式,而且有些
用户更习惯那种能点击的界面。
git-gui是在安装git的同时也会装好的可视化工具。默认界面为英文,我这里参考这里修改成了中文。
https://www.cnblogs.com/webSong/p/11009403.html
错误收集
1.报错fatal: remote origin already exists.
1 | git remote rm origin |
2.报错The authenticity of host 'github.com ' can't be established
这是由于你的git地址采用了ssh方式,切换为https方式即可,也可能是你的仓库地址不对,可以用命令先查看一下:
1 | git remote -v |
如果跟你的github地址不一样,那就去你的github上复制一下仓库地址
然后在终端中输入:
1 | git remote set-url origin https://github.com/yourname/learngit.git (这个是你的复制的仓库地址) |
最后再push下就可以了!
1 | git push origin master |
3.报错Updates were rejected because the remote contains work that you do
在push之前输入:
1 | git pull origin master |