起步
初次运转 git 前的装备
-
用户信息
git config --global user.name "黑色外套" git config --global user.email johndoe@example.com
-
文本修改器
在
windows
系统上,假如你想要运用别的文本修改器,有必要指定可履行文件的完好路径。git config --global core.editor "'C:/Program Files/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"
-
检查装备信息
git config --list user.name=黑色外套 user.email=123456@qq.com ...
你能够经过输入
git config <key>
来检查某一项装备。
三种状况
Git
有三种状况,以提交(Committed
)、已修正(“modified)、以暂存(
staged`)。
- 已修正表明修正了文件,可是没有保存到数据库中。
- 以暂存表明对一个现已修正文件的当时版别做了符号,使之包含再下次提交的快照中。
- 已提交表明数据现已安全地保存在本地数据库中。
- 作业区:本地电脑寄存项目文件的当地。
- 暂存区:在运用Git办理项目文件的时分,项目目录中会呈现一个
.git
的隐藏文件夹,这个文件夹称之为版别库。 - 本地库房:
.git
文件夹包含git
主动创立的master
分支,而且将HEAD
指针指向master
分支。运用commit
指令能够将暂存区中的文件增加到本地库房中。
日常开发中咱们的代码是放置在作业区中,经过add
指令将这个代码提交到暂存区,交给Git
去办理,之后经过commit
等指令,将暂存区的代码提交到本地库房(版别库)。
Git 根底
文件状况
检查文件地点的状况
git status
On branch master
No commits yet
nothing to commit (create/copy files and use "git add" to track)
这阐明当时作业区没有任何文件被更改正,没有呈现任何处于未盯梢的新文件。
git status -s
# or
git status --short
# 文件状况:A 新增,M 修正,D 删去,?? 未增加到Git中
接下来让咱们在作业区创立一个新文件A.txt。
此刻A.txt
处于未盯梢的状况,未盯梢的文件意味着在之前的提交快照中没有这个文件,Git
不会主动将之归入盯梢规模。
盯梢新文件
git add
:盯梢新文件,或许把已盯梢的文件放到暂存区,还能用于兼并时把有抵触的文件符号为已处理状况等。
接下来咱们修正以下A.txt
中的内容。
:grey_question: A.txt
为什么会一起呈现在暂存区和非暂存区? 这个时分咱们仅仅对A
文件进行了修正,可是还没有将修正后的文件放置在暂存区,假如此刻你去提交时,就会发现,你提交的是暂存区的A
文件,而非你修正后的A
文件,因此在修正后需求将A
文件放置在暂存区再做提交。
git add A.txt
git commit -m "修正了A文件"
检查已暂存和未暂存的修正
git diff
:检查没有暂存的文件更新了那些部分,不加参数直接输入git diff
。此指令是比较作业区和暂存区快照之间的差异。也便是修正之后还没有暂存起来的改变内容。
接下来,咱们再A
文件的根底上再追加一个B
文件。将其追加到暂存区,接着再B
文件中增加一行文本。
若要检查已暂存的即将增加到下次提交里的内容,能够用git diff --staged
。这条指令将比对以暂存文件与终究一次提交的文件差异。
提交操作
提交暂存区文件到库房
git commit -m "提交的描述信息"
提交前史
-
git log
:不传参数的情况下,会依照时刻先后顺序列出一切提交,最近的排在最前,(会列出每个提交的 SHA-1 校验、作者、电子邮件地址、提交时刻、提交阐明)
-
git log -p
:显现每次提交所引进的差异,也能够约束显现的日志条目数量。该选项除了显现基本的信息之外,还附带了每次提交的改变。
-
git log -stat
:检查简略的 log 信息。在每次提交的下 main 列出一切被修正过的文件、有多少文件被修正了以及被修正过的文件的那些行被删去或许是增加了。
git log --pretty=format:"%h - %an, %ar:%s"
选项 | 阐明 |
---|---|
%H | 提交的完好哈希值 |
%h | 提交的简写哈希值 |
%T | 树的完好哈希值 |
%t | 树的简写哈希值 |
%P | 父提交的完好哈希值 |
%p | 父提交的简写哈希值 |
%an | 作者姓名 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(能够用 –date=选项 来定制格局) |
%ar | 作者修订日期,按多久曾经的办法显现 |
%cn | 提交者的姓名 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期(距今多长时刻) |
%s | 提交阐明 |
!:作者和提交者之间的差异:作者是指实践做出修正的人,提交者是终究将次作业成功提交到库房的人。
git log 的常用选项
选项 | 阐明 |
---|---|
-p | 按补丁格局显现每个提交引进的差异。 |
–stat | 显现每次提交的文件修正统计信息。 |
–shortstat | 只显现 –stat 中终究的行数修正增加移除统计。 |
–name-only | 仅在提交信息后显现已修正的文件清单。 |
–name-status | 显现新增、修正、删去的文件清单。 |
–abbrev-commit | 仅显现 SHA-1 校验和一切 40 个字符中的前几个字符。 |
–relative-date | 运用较短的相对时刻而不是完好格局显现日期(比方“2 weeks ago”)。 |
–graph | 在日志旁以 ASCII 图形显现分支与兼并前史。 |
–pretty | 运用其他格局显现前史提交信息。可用的选项包含 oneline、short、full、fuller 和 |
format | (用来定义自己的格局)。 |
–oneline –pretty=oneline –abbrev-commit | 合用的简写。 |
约束输出长度
git log --since=2.weeks
撤销操作
从头提交
在某些时分等咱们提交完会发现遗漏了某些文件或许提交信息写错了,此刻能够运转带有--amend
选项的提交指令来从头提交。这个指令会将暂存区的文件提交。假如前次提交以来还未作修正,那么快照会坚持不变,修正的仅仅提交信息。
git commit --amend
假设我在涨价B
的时分忘记了将C
文件增加到暂存区,这时咱们能够依照如下过程操作。
咱们能够看到,此刻第2次的提交信息现已被修正了过来,一起也将C
文件增加到版别库里了。
撤销暂存的文件
接下来我创立了D
文件,一起又将D
文件增加到暂存库中,突然间我又不想去盯梢D
文件,这时分,咱们能够把D
文件按从暂存区撤销。
撤销对文件的修正
假设现在我现已提交过一部分文件,紧接着我又持续投入到接下来的作业中,过了一会发现刚刚进行的作业内容不是我想要的作用,我想回到刚开始的状况(进行下一步张的状况)。
比方我再A
文件中新增加了一行数据,随后我想会到刚刚提交的状况。此刻咱们能够用如下指令。
git checkout -- A.txt
运用此指令会使最近一次提交的版别掩盖本次修正的内容。
任何以提交的东西几乎是能够回复的,可是未提交的东西丢掉后很难康复。
长途库房的运用
增加长途库房
-
增加长途库房:
git remote add <shortname> <url>
git remote add origin git@gitee.com:coderlzw/git-dir.git
检查长途库房
- 检查长途库房:
git remote
,你也能够指定选项-v
,会显现需求读写长途库房运用的Git
保存的简写与其对应的URL
。
-
检查某个长途库房:
git remote show origin
它同样会列出长途库房的 URL 与盯梢分支的信息。它告诉你正处于master
分支,而且假如运转git pull
,就会抓取一切的长途引证,然后将长途master
分支兼并到本地master
分支上。它也会列出拉去到的一切长途引证。
推送本地库房到长途
-
推送本地库房到长途:
git push <remote> <branch>
git push origin master
从长途库房中抓取与拉去
假如你想拉去长途库房中有,可是你没有的信息,能够运转git fetch
git fetch <remote>
这个指令会拜访长途库房,从中拉取一切你还没有的数据。 履行完结后,你将会拥有那个长途库房中一切分支的引证,能够随时兼并或检查。
git fetch
只会将数据下载到你的本地库房,她并不会主动兼并或修正你但花钱的作业区,你有必要手动将其兼并到你的作业区。
假如你的当时分支设置了盯梢长途分支, 那么能够用 git pull
指令来主动抓取后兼并该长途分支到当时分支。 这或许是个愈加简略舒服的作业流程。默许情况下,git clone
指令会主动设置本地master
分支盯梢克隆的长途库房的 master
分支(或其它姓名的默许分支)。 运转 git pull
一般会从最初克隆的服务器上抓取数据并主动测验兼并到当时地点的分支。
长途库房的重命名与移除
-
长途库房的重命名
运转
git remote rename
修正长途库房的简写名。例如,你想要重命名origin
未org
。
这时也同样修正了一切长途盯梢的分支姓名,一切的引证有原来的origin/master
变为org/master
。
-
删去长途库房
运转
git remote remove rename
或许git remote rm rename
从服务器上删去某个分支。一旦你运用这种办法删去了一个长途库房,那么一切和这个长途库房相关的长途盯梢分支以及装备信息也会一起被删去。git remote remove org
打标签
像其他版别控制系统(VCS)相同,Git
能够给库房前史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会运用这个功能来符号发布结点( v1.0 、 v2.0 等)。
- 列出标签
git tag
(可选参数-l
或许–list
)
创立标签
Git
支撑两种标签,轻量标签与附注标签。
-
轻量标签很像一个不会改变的分支,它是某个特定提交的引证。.
git tag v1.0-beta
经过运用
git show
指令能够看到标签信息和与之对应的提交信息:
-
附注标签是存储在
Git
数据库中的一个完好目标,它们能够是被校验的,其间包含打标签者的姓名、邮箱、日期、标签信息。git tag -a v1.0 -m "我开发的1.0版别"
后期打标签
你也能够对过去的提交打标签。 假设提交前史是这样的:
共享标签
默许情况下,git push
指令并不会传 送标 报到长途服务器上,需求手动推送到服务器。运转 git push origin <tagname>
。
假如想要一次性推送一切标签,运用带有--tags
选项的git push
指令。这将会把一切不在服务器的标签悉数推送到长途服务器。git push origin --tags
。
现在,当其他人从库房克隆项意图时分,也能得到这些标签。
git push
推送两种标签:运用
git push <remote> --tags
推送标签并不会区分清凉标签和附注标签,没有简略的选项能够让你只挑选推送一种标签。
删去标签
- 删去本地库房的标签,能够运用
git tag -d <tagname>
- 删去长途库房的标签,能够运用
git pusn origin :refs/tags/<tagname>
检出标签
假如你想要检查某个标签所指向的文件版别,能够运用git checkout
指令。这会使你的库房处于分离指针的状况。
在分离指针的状况下,假如你做了某些更改然后提交它们,标签不会发生改变,但你的新的提交将不属于任何分支,而且将无法拜访,除非经过切当的提交哈希才能拜访。因此,假如需求进行更改,比方要修复旧版别中的过错,那么一般需求创立一个新的分支。
分支
本地分支
举个比如:
- 你正在开发某个网站。
- 为了运用用户的某个需求,创立了一个分支,在这个分支上开展当时的作业。
此刻,接到一个需求紧急修正的 bug,你需求做以下过程:
- 切换到你的线上分支。并为这个紧急使命新建一个分支,并在其间修正。
- 在测试经过后,切换会线上分支,然后兼并这个修补分支,终究将改动推送到线上分支。
- 切换会用户需求的分支,持续作业。
新建分支
git branch testing # 新建一个testing分支
git checkou -b testing # 新建一个testing分支,并切换到新分支
这会在当时地点的提交目标上创立一个指针,两个指向相同的提交前史,但当时你任处于master
分支上,你需求运用git checkout
手动切换到新创立的分支。
你能够运用git log --oneline --decorate
检查各个分支当时所指向的目标。
能够清晰的看到,当时master
和testing
分支所指向检验和以f7cea41
最初的提交目标。
分支切换
git checkout testing
# 这样HEAD就指向testing分支了
现在咱们在testing
分支上对A和B
两个文件做出修正,HEAD
分支随着提交操作向前移动,可是master
分支却没有,它任然履行运转git checkout
时所指的目标。如图所示。
接着咱们切换到master
分支
git branch master
HEAD
随之也分着移动。这条指令做了两件作业
-
使
HEAD
指回master
分支。 -
将作业区的文件康复成
master
分支所指向的快照内容。
兼并分支
git merge testing # 将指定的分支兼并到当时地点的分支
这时分你的看起来可能便是这样的(如下如所示),和之前将分支指针向前推动所不同的是,Git 将此次三方兼并的成果做了一个新的快照而且主动创立一个新的提交指向它。
此刻在兼并分支的时分发生了抵触,也便是说你在master
和testing
分支上一起对A
文件做出了修正。此刻Git
做了兼并,可是没有主动创立一个新的兼并提交。Git
会暂停下来,等候你去处理兼并发生的抵触。咱们能够运用git status
检查那些因包含兼并抵触而处于未兼并(unmerged)状况的文件
这时分你的有抵触的文件看起来便是这个样子,你需求自己判断要保存那些更改,然后做出修正。
当你处理掉一切抵触后,对每个文件运用git add
指令来将其符号为抵触已处理,一旦暂存这些本来有抵触的文件,Git 就会将它们符号为抵触已处理。随后你需求做的便是暂存、提交。
删去分支
git branch # 列出一切分支,*表明当时地点的分支
git branch -d testing # 删去分支
-
git branch
有两个可选参数,--merged
和--no-merged
能够过滤分支列表中现已兼并或没有兼并到当时分支的分支。(在咱们处理了抵触之后有testing
分支进行了兼并。)
目前为止咱们有三个分支,他们现在的关系如下图所示。
接下来咱们运用git barnch -b testing testing_testing_2
删去testing
和testing_2
分支。
咱们能够看到testing
被成功的删去了,可是testing_2
却删去失败了。因为它包含了还未兼并的作业,测验运用git branch -b
删去时会失败,假如确定要删去而且丢掉那些作业能够运用-D
选项强制删去那些没有兼并的分支。
你能够提供一个附加的参数来检查其他分支的兼并状况而不必检出他们,例如没有兼并到master
分支的有那些。
git branch --no-merged master
长途分支
长途引证是对长途库房的引证(指针),包含分支、标签等等。你能够经过git ls -remote <remote>
来显现地获取长途引证的完好列表,经过git remote show <remote>
获取长途分支的更多信息。
长途分支以<remote>/<branch>
的形式命名,例如假如你想要看左后一次与长途库房的origin
通讯时master
分支的状况,你能够检查origin/master
分支。假设你开发了用户办理(user)
分支并提交到长途,那么你的本地会存在user
,但是服务器上的分支会以origin/user
来表明。那么他看起来会是这样的。
假如你在本地的master
分支上做了一些作业,再同一段时刻内又有其他成员向远端的master
分支上提交的代码,这便是你们的提交前史已走向不同的方向。即便这样,只要你坚持不与origin
服务器衔接(并拉去数据),你的origin/master
指针就不会移动。
假如你想要与给定的长途库房同步数据,只需求运转git fetch <remote>
指令(例如git fetch origin
)。这个指令会查找origin
是哪一个服务器,从中抓取本地没有的数据,而且跟新本地数据库,移动origin/master
指针到更新之后的方位。
推送分支
本地分支并不会主动与长途库房的同步,你有必要手动推动想要的分支到长途。
git push origin testing
下一次其他成员用户再服务器上抓取数据时,他们会在本地生成一个长途分支origin/testing
,指向服务器的testing
分支的引证。
接下来咱们需求运转git merge origin/testing
将这些作业兼并到当时地点分支,或许将其放在一个全新的分支。
git checkout -b testing origin/testing
# 这会给你一个用于作业的本地分支,而且起点位于 origin/testing
盯梢分支
当克隆一个库房时,一般会主动创立一个盯梢分支origin/master
。但是,假如你想设置其他的分总分支能够运转git checkout -b <branch> <remote>/<branch>
。这是一个非常常用的操作所以Git
提供了一个--track
快捷办法。
git checkout --track origin/testing
-
假如想将本地分支与长途分支设置未不同的姓名
现在本地的
test
分支会主动从origin/testing
上拉去。 -
假如想要检查设置的一切盯梢分支,能够运用 git branch 的 -vv 选项。
能够看到
test
分支上还有两个提交还没有推送到长途分支。master
分支正在盯梢origin/master
分支而且是最新的。你所看到的这一切数据来自于你最近的一次抓取数据,这个指令并不是衔接服务器去查询的,因此你想要获取最新的数据,你需求运转以下指令
git fetch --all git branch -vv
拉去
当git fetch
指令从服务器上抓取本没有的数据时,他并不会修正作业目录中的内容,它只会获取数据然后让你自己兼并。
git pull
大多数情况下它的含义是一个git fetch
紧接着一个git merge
指令。
删去长途分支
git push origin --delete testing
这个指令仅仅从服务器上移除这个指针,Git
服务器一般会保存一段时刻直到废物收回运转,所以假如不小心删去掉了,一般是很简单康复的。
变基
在Git
中整合来自不同分支的修正主要有两种办法:merge
以及 rebase
。
在之前咱们咱们开发使命分叉到两个不同分支,又各自提交了跟新。
这时咱们运用merge
指令,它会把两个分支的最新快照(C3
、C4
)以及二者最近的一起先人C2
进行三方兼并,并生成一个新的快照(并提交)。
还有一种办法:你能够提取在
C4
中引进的补丁和修正,然后再C3
的根底上应用一次。这种操作咱们称之为变基(rebase)。你能够运用rebase
指令将提交到某一分支上的一切修正都移到另一分支上。
在这个比如上,你能够运用检出testing
分支,然后将它变基到master
分支上。
git checkout testing
git rebase master
它的作业原理是先找到这两个分支的最近一起先人C2
,然后对比当时分支相对于先人的每次提交,提取相应的修正并存为临时文件,然后将当时分支指向目标基底C3
,终究以此将之前另存为临时文件的修正依序应用。
接下来切换到master
分支上,进行一次快进兼并。
git checkout master
git merge testing
此刻,C4
指向的快照就和上图运用merge
兼并后的C5
的快照一模相同了,这两种整合的终究成果没有任何差异,可是修改使得提交前史愈加简练。当你检查提交前史记录时,会发现,虽然实践的开发作业是并行的,可是他们看上去就像是串行相同,提交前史是一条线没有分叉。咱们这样做的意图是为了保证在向长途分支推送的时分能够坚持提交前史的整齐。
例如向某个其他人维护的项目奉献代码时。在这种情况下,你首先在自己的分支里进行作业,带你开发完结时你需求将你的代码变基到origin/master
上,然后再向主项目提交修正。这样项意图维护者就不需求进行整合作业,只需求快进兼并即可。
无论是经过变基还是三方兼并,整合的终究成果所指向的快照始终是相同的,只不过提交前史不同罢了。