目录


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教程_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教程_github_02

输入命令初始化仓库:

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_03

说明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教程_github_04

如果你文件更改次数多,输出的信息非常多,那么可以输入​​git log --pretty=oneline​​:

[学习记录]Git教程_github_05

友情提示,这里看到的似​​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​​,创建一个新的仓库

[学习记录]Git教程_Git_06

在Repository name填入​​jar​​,其他保持默认设置,点击“Create repository”按钮,就成功地创建了一个新的Git仓库:

[学习记录]Git教程_远程仓库_07

目前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连接给出的一致。

回到正题。这个时候去远程仓库看一下:

[学习记录]Git教程_github_08

会发现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​​来查看远程仓库的分支:

[学习记录]Git教程_Git_09

图中红色部分就是远程仓库的分支。

远程分支的合并

现在远程仓库的上床已经搞完了,开始搞定分支的合并

现在我转到客户端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的同时也会装好的可视化工具。默认界面为英文,我这里参考这里修改成了中文。

cnblogs.com/webSong/p/11009403.html">​https://www.cnblogs.com/webSong/p/11009403.html​

[学习记录]Git教程_git_10

错误收集

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