Git 学习笔记


Git

简述

Git 是一个快速、可扩展的分布式版本控制系统。它对内部系统提供了高级操作和完全访问。
有些版本控制系统它们使用的是“增量文件系统”,这会令它们存储时每次的提交间存在差异。而 Git 会将储存时每次提交的文件的全部内容都会被记录下来
理论上,Git 能保存任何文档,但最擅长的还是保存文本文档。这是因为它被开发出的目的就是为了解决软件源代码版本管理问题,并提供了多种有助于文本分析的工具。Git 对于非文本文档只是对其进行简单的备份并实施版本管理。


安装

参考:https://blog.youkuaiyun.com/mukes/article/details/115693833


Git 配置

桌面任何地方右键便会出现 Git Bash Here

在开始菜单所应用中

使用 Git Bash 输入 git 命令。

设置 user 和 Email

设置你的名字和Email,这是使用者在提交时的签名。

$ git config --global user.name "NONO"
$ git config --global user.email "NONO@qq.com"

这时一个叫~/.gitconfig的文件机会出现在主目录中(Windows 系统是在 Administrator 目录下)。

其配置内容如下:

[user]
	name = NONO
	email = NONO@qq.com"
[http]
	sslVerify = true
[core]
	autocrlf = false

user 部分是全局设置会影响此用户建立的每个项目。
若想让项目与前面的全局设置有区别(如将私人邮箱改为工作邮箱),可在项目中使用以下 git 命令设置。

$ git config user.email "NN@qq.com"

在项目目录下的.git/config文件中会增加一节[user]内容。

[user]
    name = NONO
    email = NN@qq.com"

设置 Vim 编辑器

Git 默认编辑器是 GUN nano,若想设置为 Vim 编辑器,用如下命令:

$ git config --global core.editor vim

Git 更多配置有需要再去查找学习


初始化一个新的项目仓库

以下命令可将任何一个文档令它置于 Git 的版本控制下。先进入要初始化的文档目录中,再使用命令。

$ cd hello
$ git init
Initialized empty Git repository in F:/GitRepo/work/hello/.git/

成功后在该目录下会有一个.git的目录被创建了(此目录是个隐藏目录),这便意味着一个仓库被初始化了。
这个被初始化的文档目录,可称为工作树。每个工作树又包含着一个 git 仓库,有了 git 仓库便能轻松的生成工作树。

Git 向仓库中添加文档时并不是简单的将文档复制过去,它会将这些文档生成为 Git 仓库所能接受的数据格式,此过程为生成快照

$ git add .

.表示当前目录。
此命令可将工作树下所有文档生成快照(包含子文档目录),生成的快照会被存放到临时的存储区域,该区域被称为索引。

$ git commit -m "为每次提交写上相关的信息(如第一次提交)"

-m输入的简约版本更新信息是必要的,它能令每一个查看该项目的人能快速的了解到这个项目的每一次更新都做了什么重大改动。
做没有-m参数,Git 会自动调用系统默认的文本编辑器,让你输入版本更新说明并保存。

有一些文档是无需让 Git 管理的,如程序编译时的中间文件,Git 的文档忽略机制可令它避免成为快照,将不需要被 Git 管理起来的文档信息写到同一目录下的.gitignore文件中即可。

$ cd hello
$ echo "out" > .gitigonre

当使用git add生成文档内容快照时,git 会忽略掉 out 目录。


克隆一个项目仓库

首先的要知道这个项目仓库的地址,因 Git 能在多个协议下使用,所以仓库地址可以是ssh://http(s)://git://,又或者以一个用户名为前缀。(git 会认为这是一个 ssh 地址)
git:

git clone git://git.kernel.org/pub/scm/git/git.git

http:

git clone http://www.kernel.org/pub/scm/git/git.git

成功后便能一个新目录 git 出现,它包含所有的 Git 源代码和历史记录。
git://协议快速及有效,但当公司的防火阻止了非 http 访问请求后,就得使用http协议。在默认下,仓库地址最后一级目录的.git的后缀名都会去掉作为新克隆项目的目录名。
若访问一个仓库地址需要用到法名和密码,可在 Git URL 前加上用户名,并在两者间加上 @ 表示分割,再执行git clone命令便会提示输入密码。

$ git clone NONO @ http://www.kernel.org/pub/scm/git/git.git

-b name 可用来指定克隆的分支名。

$ git clone -b master2 ../server

不使用此参数表示将克隆 master 分支。


基本操作

在工作树中,日常所进行的工作无非是对 Git 仓库所管理的文档进行修改,或者添加/删除一些文件。这些操作与采用 Git 管理我们的文档之前没有任何差异,只是在使用者认为一个工作阶段完成之时,要记得通知 Git,命令它记下使用者所要进行的更新,这一步骤是通过生成文档快照并将其加入到索引中来实现的。

记录更新

Git 不会主动记录使用者对文档进行的更新,除非对它发号施令。

添加了一份新文档ch1.tex :

$ cd hello
$ git add test.txt

然后我又对其它文档进行了一些修改,如:

$ git add doc-env.tex git-tutor.tex

若时间久了,又对工作树中的许多文档都进行了更新(文档添加、修改、删除),但是忘记了它们的名字,此时若将所做的全部更新添加到索引中,比较轻松的做法是:

$ git add .

此命令除了能够判断出当前目录(包括其子目录)所有被修改或者已删除的文档,还能判断用户所添加的新文档,并将其信息追加到索引中。

可通过git reset HEAD <path>. ..将 path 对应的文件从索引库中剔除,但是 path 对应的文件内容本身不受此影响。

$ git add 1.txt
$ git reset HEAD 1.txt
Unstaged changes after reset:
M       1.txt

可通过git add -i命令中的revert子命令把已经添加到索引库中的文件从索引库中剔除。
可通过git add -i命令中的update子命令把已经被 git 管理的修改文件添加到索引库中。
可通过git add -i命令中的add untracked子命令把还没被 git 管理(untracted)的文件添加到索引库中。

提交更新

将索引内容添加到仓库中。

$ git commit -m "要描述的信息"

不用-m参数的话,git 将调到一个文本编译器(通常是vim)来让使用者输入提交的描述信息。

对工作树中的许多文档都进行了更新(文档添加、修改、删除),但是忘记了它们的名字,此时若将所做的全部更新添加到索引中,比较轻松的做法是:

$ git commit -a -m "要描述的信息"

-a选项可只将所有被修改或者已删除的且已经被 git 管理的文档提交倒仓库中。

查看文件状态

出当前目录所有还没有被 git 管理的文件和被 git 管理且被修改但还未提交的文件。

$ git status

移除文件

把一个文件删除,并把它从 git 的仓库管理系统中移除。但是注意最后要执行git commit才真正提交到 git 仓库。

$ git rm qq.txt
$ git rm -r qqFolder
$ git rm --cached qqq.txt

以上命令都是将文件从 git 的索引库中移除,但是对文件本身并不进行任何操作。

推送本地更新到服务器

$ git push

拉服务更新到本地

$ git pull

查看版本历史

日志

在工作树中,可以查看当前项目的日志,也就是使用者在使用git commit向仓库提交新版本时所描述的版本更新信息。

$ git log

如果想看一下每一次版本的大致变动情况:

$ git log -stat --summary

如:

$ git add readme.txt
$ git commit -m " test"
$ echo "hhh">>readme.txt
$ git add readme.txt
$ git commit -m " init "

$ git log
commit 214cf71782040579ce8c8ea3a815c0212dbca86f
Author: NONO <NONO@qq.com>
Date:   Sun Apr 8 22:04:24 2012 +0800
     init
commit 9e041d62c0565a58efceac1ca6e75126d5a4da75
Author: NONO <NONO@qq.com>
Date:   Sun Apr 8 22:03:14 2012 +0800
     test

从上面的项目日志信息中可看到每一个版本都对应着一次项目版本更新提交。在项目日志信息中,每条日志的首行(就是那一串莫名奇妙的数字)为版本更新提交所进行的命名,可以将该命名理解为项目版本号。项目版本号应该是唯一的,默认由 Git 自动生成,用以标示项目的某一次更新。

可将项目版本号作为命令的参数,即可查看该次项目版本的更新细节:

 git show  214cf71782040579ce8c8ea3a815c0212dbca86f

也可以使用其它方式:
一般只使用版本号的前几个字符即可

 git show 214cf 

显示当前分支的最新版本的更新细节

 git show HEAD

显示当前分支的最新版本的更新细节,它相当于上一个命令

 git show

打标签

可对项目版本号进行自定义,然后就可以使用自定义的版本号查看对应的项目版本更新细节。

$  git tag  v0.1 dfb02
$  git show

实际上,上述命令并非是真正的进行版本号自定义,只是制造了一个tag 对象而已,这在进行项目版本对外发布时比较有用。


撤销

撤销我们的修改。

撤销未提交的修改

若使用者现在的工作目录里搞的一团乱麻, 但是他现在还没有把它们提交,此时还是能让工作目录回到上次提交时的状态的。

$ git reset --hard HEAD

上面的命令会把使用者索引工作目录中所有未提交的内容清空(当然这不包括未置于版控制下的文件)。从另一种角度来说,这会让git diffgit diff --cached命令的显示都变为空。

若只是要恢复一个文件:

$ git checkout -- tt.txt

上诉命令会把 tt.txt 从 HEAD 中迁出并且把它恢复成未修改时的样子。

若想要恢复当前目录所有修改的文件:

$ git checkout

上诉命令会把当前目录所有修改的文件从 HEAD 中迁出并且把它恢复成未修改时的样子。

撤销已提交的修改

要是使用者已经做了一个提交,但是马上后悔了,怎么办?
1、创建一个新的提交,在新的提交里撤消老的提交所作的修改. 这种作法在使用者已经把代码发布到服务器的情况下十分正确。
2、也可以去修改使用者的老提交,但是如果使用者已经把代码发布到了服务器,那么千万别这么做,git 不会处理项目的历史会改变的情况,如果一个分支的历史被改变了那以后就不能正常的合并。

创建新提交来撤销前期提交的修改

创建一个新的提交来撤消前期某个提交的修改是很容易的,只要把使用者想撤销修改的某个提交的名字做为参数传给命令即可。

$ git revert HEAD

这样便创建了一个撤消了上次提交修改的新提交,就能去修改新提交里的提交注释信息。

撤销上上次的提交:

$ git revert HEAD^

撤销某个提交:

$ git revert 4ab494a0bf5c5b09267a01ec03b587731d3034b4

这样便创建了一个撤消提交 4ab494a0bf5c5b09267a01ec03b587731d3034b4 修改的新提交。

在执行git revert时,git 尝试去撤消老提交的修改,如果使用者最近的修改和要撤消的修改有重叠,那么就会被求手工解决冲突,就像解决合并时出现的冲突一样。
另外,git revert其实不会直接创建一个提交,而是把撤消的文件内容放到索引里,并需要再执行提交命令,它们才会成为真正的提交。

撤销旧提交但不保留修改

若刚刚做了一个或多个提交,但是又想撤销这些提交,而且不保留这些提交的修改和文件系统中的修改, 可使用下面的命令:

$ git reset --hard
撤销旧提交但保留修改

若刚刚做了一个或多个提交,但是又想撤销这些提交,而且想仍然在文件系统中保留这些修改,然后做修改或不做修改再次提交的话,可使用下面的命令:

$ git reset --mixed
$ git reset --soft
追加提交来修改提交

若刚刚做了某个提交,,但是又想来马上修改这个提交,可使用下面的命令:

$ git commit --amend

现在支持这个--amend的参数,能让修改刚才的这个提交。这项机制能让使用者在代码发布前,添加一些新的文件或是修改自己的提交注释。
另外,若在老提交里发现一个错误,但是现在还没有发布到代码服务器上。可使用下面的命令:

$ git rebase -i

此命令的交互模式会提示使用者在编辑中做相关的修改,这样其实就是让使用者在 rebase 的过程中来修改提交。


版本的回退

回退到某个提交或标签。

$ git checkout branch_a
$ git checkout 5731ea5cf1c544337648ffb79e6dfb5fc17fead7

回退到到 branch_a 的版本 5731ea5cf1c544337648ffb79e6dfb5fc17fead7 提交。
完成了回退,看到那想看到的东西,编译那想编译的版本,打算回到最新的版本:

$ git checkout branch_a

回退到 tag_a 代表的 tag 点:

$ git checkout tag_a

回到最新的版本:

$ git checkout branch_a

分支管理

前所的内容未有提及项目分支问题,但事实上是有一个分支存在的,那就是master分支(主分支),该分支是由 Git 自动产生的。在此之前,所有针对项目版本的各种操作都是在主分支上进行的,只是未察觉它的存在而已。

分支的创建

$ git branch local

对于新产生的 local 分支,初始时是完全等同于主分支的。但是,在 local 分支所进行的所有版本更新工作都不影响主分支,这意味着作为项目的参与者,可以在 local 中开始各种各样的更新尝试。

查看分支

$ git branch 
local
* master

在上面操作输出结果中,若分支名之前存在 * 符号,表示此分支为当前分支。其实 Git 各分支不存在尊卑之别,只存在哪个分支是当前分支的区别。为了某种良好的秩序,很多人默认是将 master 分支视为主分支,这里也沿用这一潜在规则。

分支的切换

在上面的命令输出中,虽然使用git-branch命令产生了 local 分支,但是 Git 不会自动将当前分支切换到 local 下。可使用下面的命令:

$ git checkout local

分支的合并

创建了新分支,并在该分支下进行了诸多修改与数次的版本更新提交,那最后这一分支的最终状态怎么提交到 master 分支中呢?
将当前分支切换为 master:

$ git checkout master

将新分支与当前分支合并:

$ git merge local

git rebase命令也能实现分支的合并。

当一个分支检查无误并且与 master 分支成功合并完毕后,那么这一分支基本上就没有存在的必要性了,可以删除掉:

$ git branch -d local

-d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想不问青红皂白地删除一个分支,可以使用-D 选项。


储藏修改

当正在做一项复杂的工作时,发现了一个和当前工作不相关但是又很讨厌的 bug。此时想先修复 bug再做手头的工作,可以先保存当前的工作状态,等修复完 bug后,再回到之前的工作里。
保存当前的工作状态:

$ git stash

回到之前的工作:

$ git stash apply

标签

针对某个提交打标签。

$ git tag

找回丢失的对象

基本工作流

高级工作流

理论知识

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值