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,出现如下命令则安装成功:
之后在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
这里user.name和user.email可自定义,到这里就安装完成了。
创建版本库
什么是版本库?版本库又名仓库,英文repository(/rɪˈpɑːzətɔːri/)。可以简单的理解成一个目录。
开始创建版本库。
1.创建一个空文件夹jar,进入jar文件夹(注意:座位了避免出现问题,文件夹及路径不包含中文)
2.鼠标右键,单击Git Bash here,出现如下界面:
输入命令初始化仓库:
git init
这个时候jar文件夹就是一个仓库了,并且文件夹下面会多出一个.git文件夹
跟踪新文件
首先创建一个文本文件readme.txt。内容如下
This is a text file.
一定要在jar这个文件夹目录下,否则会找不到。然后开始放入git仓库
第一步,把文件添加到仓库:
git add readme.txt
执行完上面命令后没有任何显示就说明添加成功,否则百度去吧。我也不知道。
第二部,提交文件
git commit -m 'add text file'
-m后面是本次提交的说明,可以输入任何内容,这样就可以从历史记录中查看
执行完命令后会告诉你,1 file changed
一个文件被改动;1 insertions
:插入了一行内容
为什么Git添加文件需要add
,commit
一共两步呢?因为commit
可以一次提交很多文件,所以你可以多次add
不同的文件,比如:
$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."
跟踪改目录下所有文件可以使用:
git add .
查看状态
如果你修改了文件,但是你忘了你修改的是什么东西了。这个时候可以使用这个语句查看修改状态。
git status
On branch master
nothing to commit, working directory clean
如果显示的是上面的语句,那么说明工作目录非常干净,没有被修改过。
如果像这样:
说明git之前的提交中没有这样的文件,就要使用git add <file>
来跟踪文件
查看历史提交
默认不是用任何参数的话,git log
会按提交时间列出所有的更新
git log
git log 有许多选项可以帮助你搜寻你所要找的提交, 接下来我们介绍些最常用的。
个常用的选项是 -p
,用来显示每次提交的内容差异。 你也可以加上 -2
来仅显示最近两次提交:
git log -p
git log -2
git log --stat
--stat
选项查看每次提交的简略统计信息
最有意思的还是format,可以定制要显示的记录格式。当你记录变了时,只要你指定了及时,输出的内容就不会随着Git的更新而改变:
$ git log --pretty=format:"%h - %an, %ar : %s"
9d8d940 - 1419908068, 30 minutes ago : 1
8fc3932 - 1419908068, 4 days ago : 博客源文件
d347c60 - 1419908068, 2 weeks ago : append GPL
a137c1d - 1419908068, 2 weeks ago : add distrubute
7908392 - 1419908068, 2 weeks ago : wrote a readme file
git log – pretty=format 常用的选项 列出了常用的格式占位符写法及其代表的意义。
选项 | 说明 |
---|---|
%H | 提交对象(commit)的完整哈希字串 |
%T | 树对象的完整哈希 |
%P | 父对象(parent)的完整哈希 |
%an | 作者 |
%ae | 电子邮件 |
%ad | 修订日期,可以定制格式 |
%ar | 修订日期 |
%cn | 提交者名字 |
%ce | 提交者邮件 |
%cd | 提交日期 |
%cr | |
%s | 提交说明 |
版本回退
现在已经会上传文件到仓库了,那么在来一遍。修改readme.txt文件如下:
This is a text file.
Git is free software.
然后提交:
$ git add readme.txt
$ git commit -m "first update readme.txt"
[master 778d2dd] first update readme.txt
1 file changed, 2 insertions(+), 1 deletion(-)
这个时候你发现你更改的内容错了,想回到上个版本或者上上上个版本。那么你怎么还记得内容呢。但是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
命令:
$ git reset --hard HEAD^
先不要关闭命令窗口,在窗口输入cat readme.txt
看看内容是不是上个版本的。
$ cat readme.txt
This is a text file.
果然回到了上个版本,不过如果又想回到最新版本,那么问题来了。先输入git log
查看一下状态:
$ git log
commit 7b0fa712b2de80d7978dab94643c2cb59aca7c38 (HEAD -> master)
Author: 1419908068 <1419908068@qq.com>
Date: Mon Dec 2 16:29:25 2019 +0800
add text file
这里已经没有最新的那个版本的,那么你需要找到之前看的log,找到commit id。输入如下命令可以回到最新版本:
$ git reset --hard 778d2ddf
HEAD is now at 778d2dd first update readme.txt
版本号可以不用写全,前几位就好了。再查看一下内容
$ cat readme.txt
This is a text file.
Git is free software.
没有commit id怎么办,git提供了后悔药,git reflog
命令查看你每次的命令
$ git reflog
778d2dd (HEAD -> master) HEAD@{0}: reset: moving to 778d2ddf
7b0fa71 HEAD@{1}: reset: moving to HEAD^
778d2dd (HEAD -> master) HEAD@{2}: commit: first update readme.txt
7b0fa71 HEAD@{3}: commit (initial): add text file
这样又可以找到first update readme.txt
的commit id是7b0fa71
,然后就又可以改回去了
撤销操作
撤销提交
有时候我们提交完后发现还漏了几个文件,或者提交信息写错了。此时可以使用--amend
选项尝试重新提交:
git commit --amend
撤销对文件的修改
如果你修改了文件,但是发现改错了,想回到没修改之前,那么可以使用:
git checkout -- <file>
注意空格
远程仓库
添加远程仓库
现在的情景是,你已经在本地创建了一个Git仓库后,又想在GitHub创建一个Git仓库,并且让这两个仓库进行远程同步,这样,GitHub上的仓库既可以作为备份,又可以让其他人通过该仓库来协作,真是一举多得。
首先,登录GitHub,然后在右上角找到New reposotpry
,创建一个新的仓库
在Repository name填入jar
,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:
目前github上的jar仓库是个空的,那么需要上传本地仓库的话需要吧本地仓库和它关联。根据提示,在命令行中输入命令:
$ git remote add origin https://github.com/ViJar-Wang/jar.git
上面那段网址是github提供的,一眼就能看到,复制下来用就好了。然后通过命令提交。
$ git push -u origin master
如果你是第一次push或者clone,那么会得到一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established.
RSA key fingerprint is xx.xx.xx.xx.xx.
Are you sure you want to continue connecting (yes/no)?
这里输入yes然后回车就好
Git会输出一个警告,告诉你已经把GitHub的Key添加到本机的一个信任列表里了:
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
这个警告只会出现一次,后面的操作就不会有任何警告了。
如果你实在担心有人冒充GitHub服务器,输入yes
前可以对照GitHub的RSA Key的指纹信息是否与SSH连接给出的一致。
回到正题。这个时候去远程仓库看一下:
会发现github上已经有readme.txt这个文件了。
从远程仓库克隆
当你需要从远处仓库下载的时候,你可以直接下载压缩包文件,也可以通过命令克隆到本地
git clone https://github.com/ViJar-Wang/ViJar-Wang.github.io.git
注意把Git仓库地址换成你自己的,克隆也可以指定目录,在末尾加个路径就好了
创建与合并分支
创建分支
首先,创建test
分支然后切换到:
git checkout -b test
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:
然后,用git branch
命令查看当前分支:
$ git branch
* test
master
git branch
命令会列出所有分支,当前分支前面会标一个*
号。
合并分支
现在,我们把test分支的工作成果合并到master
分支上:
git merge test
删除分支
git branch -d dev
以上所有均参考这位大佬的文章廖雪峰的官方网站
远程仓库分支操作
还是在上面公开版本库的基础上,假如现在有三个开发者,三台客户端,第四台为服务器。服务器地址为:z:\\test
.我们现在需要做的是每个人开发一条分支,最后再把所有分支合并起来。
首先我们在服务器的仓库上分配三条新分支:
git breanch b1
git breanch b2
git breanch b3
在客户端1克隆下来仓库中的项目:
git clone z:\\test
这个时候你会发现,客户端1克隆的下来的仓库里面只有一条分支:
$ git branch
* master
但是在服务器是有三条分支的:
$ git branch
b1
b2
b3
* master
如果你修改了文件内容,然后往b1分支push,
$ git push origin b1
error: src refspec b1 does not match any
它会提示你没有足够的权限去操作,那么此时你需要在本地创建一个分支和远程的那个分支绑定起来:
git checkout -b b1 origin/b1
这条语句的意思是创建一个b1分支并切换到,同时和origin中的b1分支绑定。注意:你创建的本地的分支名必须要和远程的分支名一致,否则远程会创建一条新的分支。
现在我们有了和远程绑定的分支,然后把修改的文件push到远程分支b1中去
$ git add readme.txt
$ git commit -m "提交到b1"
[b1 341f980] 提交到b1
1 file changed, 2 insertions(+), 1 deletion(-)
$ git push origin b1
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 289 bytes | 289.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To d:\testFile\repo
8169059..341f980 b1 -> b1
这样就成功提交到远程仓库中去了。
我们在服务器通过git branch -v
查看一下分支最新提交记录:
$ git branch -vv
b1 341f980 提交到b1
b2 8169059 test1
b3 8169059 test1
* master 9330421 第一次修改
提交成功。当你在本地不知道远程仓库有哪些分支时,可通过git branch -a
来查看远程仓库的分支:
图中红色部分就是远程仓库的分支。
远程分支的合并
现在远程仓库的上床已经搞完了,开始搞定分支的合并
现在我转到客户端2,首先把从库中的东西克隆下来,里面有一个文件readme.txt
$ git clone d:/testFile/repo
Cloning into 'repo'...
done.
$ cd repo
$ cat readme.txt
Hello ,this is the first text.
Hello ,this is the second text.
创建一个分支与服务器绑定:
git checkout -b b2 origin/b2
现在我们分别修改客户端1的readme.txt文件和客户端2的readme.txt。并且修改同一处地方,添加不同的内容:
客户端1:
Hello ,this is the first text.
Hello ,this is the second text.
Hello ,this is the third text.
客户端2:
Hello ,this is the first text.
Hello ,this is the second text.
thi is the b2 branch
分别提交到b1、b2分支中去:
查看服务器分支修改情况:
$ git branch -v
b1 fa8a5ae b1提交
b2 c95dbf8 b2修改
b3 8169059 test1
* master 9330421 第一次修改
修改成功。但是合并有和问题,我们知道是不能在裸仓库操作内容的,所以我们需要先把最后完成的仓库再从远处库克隆下来:
$ git clone z:\\test
Cloning into 'repo'...
done.
$ cd repo
$ cat readme.txt
Hello ,this is the first text.
Hello ,this is the second text.
我们会发现这里的文件还是修改之前的,因为我们还没有合并分支。首先创建并绑定分支,再查看一下提交记录:
$ git checkout -b b1 origin/b1
Switched to a new branch 'b1'
Branch 'b1' set up to track remote branch 'b1' from 'origin'.
$ git log --pretty=format:"%an : %s - %cd"
1419908068 : b1提交 - Mon Dec 9 10:29:34 2019 +0800
1419908068 : 提交到b1 - Mon Dec 9 09:44:24 2019 +0800
1419908068 : test1 - Mon Dec 9 09:29:10 2019 +0800
在这里可以看到已经和远程仓库绑定了,在同样的操作绑定b2。然后开始合并,首先把b1合并到master中去:
$ git merge b1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
cat查看一下readme.txt
中的内容:
$ cat readme.txt
Hello ,this is the first text.
<<<<<<< HEAD
Hello ,this is the second text.
=======
Hello ,this is the second text.
Hello ,this is the third text.
>>>>>>> b1
出错了啊。HEAD
是只上个版本的内容,======
下面是合并的内容,如果想要保留合并的内容只需要执行以下命令:
$ git reset --hard HEAD^
HEAD is now at 8169059 test1
$ git merge b1
Updating 8169059..fa8a5ae
Fast-forward
readme.txt | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
在查看一下:
$ cat readme.txt
Hello ,this is the first text.
Hello ,this is the second text.
Hello ,this is the third text.
这样b1就合并成功了。同理合并完b2也会出现同样的错误:
$ git merge b2
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
$ cat readme.txt
Hello ,this is the first text.
Hello ,this is the second text.
<<<<<<< HEAD
Hello ,this is the third text.
=======
thi is the b2 branch
>>>>>>> b2
你想好保留哪个版本的只要回退一个版本再合并一次就好了。
远程分支删除
git push origin --delete b3
图形化界面
Git 的原生环境是终端。 在那里,你可以体验到最新的功能,也只有在那里,你才能尽情发挥 Git 的全部能
力。 但是对于某些任务而言,纯文本并不是最佳的选择;有时候你确实需要一个可视化的展示方式,而且有些
用户更习惯那种能点击的界面。
git-gui是在安装git的同时也会装好的可视化工具。默认界面为英文,我这里参考这里修改成了中文。
https://www.cnblogs.com/webSong/p/11009403.html
错误收集
1.报错fatal: remote origin already exists.
git remote rm origin
2.报错The authenticity of host 'github.com ' can't be established
这是由于你的git地址采用了ssh方式,切换为https方式即可,也可能是你的仓库地址不对,可以用命令先查看一下:
git remote -v
如果跟你的github地址不一样,那就去你的github上复制一下仓库地址
然后在终端中输入:
git remote set-url origin https://github.com/yourname/learngit.git (这个是你的复制的仓库地址)
最后再push下就可以了!
git push origin master
3.报错Updates were rejected because the remote contains work that you do
在push之前输入:
git pull origin master