Git(四):远程仓库的搭建、获取与更新
目录
1、搭建远程仓库
1.1 github 创建 Repository
2、获取远程仓库
2.1 克隆现有的仓库
2.2 在现有目录中初始化仓库
3、更新提加到仓库
3.1 记录每次更新到仓库
3.2 检查当前文件状态
3.3 跟踪新文件
3.3.1 查看跟踪的文件
3.4 暂存已修改文件
3.5 状态简览
3.6 忽略文件
3.7 查看已暂存和未暂存的修改
3.8 提交更新
3.9 跳过使用暂存区域
3.10 移除文件
3.11 移动文件
1、搭建远程仓库
1.1 github 创建 Repository
在 github.com 中通过 New repository
创建仓库 git-demo
,只输入了仓库名称,其他均为默认值,未进行设置。
2、获取远程仓库
有两种取得 Git 项目仓库的方法。
-
从一个服务器克隆一个现有的 Git 仓库;
-
在现有项目或目录下导入所有文件到 Git 中。
2.1 克隆现有的仓库
如果想获得一份已经存在了的 Git 仓库的拷贝,就需要用到命令 git clone
而非 git checkout
,这是区别于其他版本控制系统的一个重要特性,Git 克隆的是该仓库服务器上的几乎所有数据,而不是仅仅复制完成你的工作所需文件,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。
git clone https://github.com/**/git-demo1024.git
远程克隆时,自定义本地仓库名字 【 git-demo 】:
git clone https://github.com/**/git-demo1024.git git_pratice1024
// 指定拉取 branch 分支下的代码
$ git clone -b branch git@github.com:**/git-demo0823.git
2.2 在现有目录中初始化仓库
如果不克隆现有的仓库,而是打算使用 Git 来对现有的项目进行管理。
git init
该命令将创建一个名为
.git
的子目录,该目录还有初始化的 Git 仓库中所有的必须文件,这些是仓库的骨干,但仅仅是初始化,项目里的文件还没有被跟踪。
如果是在一个已经存在文件的文件夹(非空文件夹)中初始化 Git 仓库来进行版本控制的话,应该开始跟踪这些文件并提交。
通过 git add
实现对指定文件的跟踪,然后 git commit
提交,假设在目录 E:\MarkText\.git
中有文件需要跟踪(版本控制),这样即得到了一个实际维护(跟踪)着若干个文件的 Git 仓库。
git add C、C++/C/C\ 标准库.md
git commit -m 'initial markdown version'
3、更新提加到仓库
3.1 记录每次更新到仓库
建立好了现有的 Git 仓库(git-demo1024.git),并从这个仓库中取出了所有文件的工作拷贝。 接下来,对这些文件做些修改,在完成了一个阶段的目标之后,提交本次更新到仓库。
工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。
已跟踪的文件:被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。
初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态
未跟踪文件:既不存在于上次快照的记录中,也没有放入暂存区。
编辑过某些文件之后,由于自上次提交后对它们做了修改,Git 将它们标记为已修改文件。我们逐步将这些修改过的文件放入暂存区,然后提交所有暂存了的修改,如此反复。
生命周期如下:
3.2 检查当前文件状态
用 git status
命令查看哪些文件处于什么状态:
// 获取文件状态
git status
说明所有已跟踪文件在上次提交后未被更改过。此时,还表明了当前目录下没有出现任何处于未跟踪状态的新文件,同时显示,当前所在分支同远程服务器上对应的分支没有偏离,默认分支名 master
。
在项目下创建一个新的 mytext.txt
文件。 如果之前并不存在这个文件,使用 git status
命令,将看到一个新的未跟踪文件:
// 编写并写入
echo 'my first Git control file' > mytext.txt
git status
在之前的快照(提交)中没有这些文件:Git 不会自动将之纳入跟踪范围。
3.3 跟踪新文件
使用命令 git add
开始跟踪一个文件,
再运行 git status
命令,会看到 mytext.txt
文件已被跟踪,并处于暂存状态:
// 跟踪文件
git add mytext.txt
git status
显示在 Changes to be committed 下面的文件,就说明是已暂存状态。
3.3.1 查看跟踪的文件
$ git ls-tree -r master --name-only
3.4 暂存已修改文件
- 修改一个已被跟踪的文件,打开文件
mytext.txt
,命名为remind.md
并编辑其中的内容,然后运行git status
命令:
显示在 Changes not staged for commit 这行下面,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。要暂存这次更新,需要运行
git add
命令。
git add
是个多功能命令【添加内容到下一次提交中】:
-
可以用它开始跟踪新文件;
-
把已跟踪的文件放到暂存区;
-
合并时把有冲突的文件标记为已解决状态等。
2. 运行 git add
将“remind.md
”放到暂存区,然后再看看 git status
的输出:
git add remind.md
git status
3. 现在两个文件都已暂存,下次提交时就会一并记录到仓库。此时我们再进行编辑文件内容并检查状态:
现在 remind.md
同时出现在暂存区和非暂存区。实际上 Git 只是暂存了运行 git add
时的版本, 如果现在提交,remind.md
的版本是最后一次运行 git add
命令时的那个版本,而不是运行 git commit
时,在工作目录中的当前版本。
当运行
git add
过后又作了文件修订,需要重新git add
暂存最新版本。
3.5 状态简览
git status
输出十分详细,但有些繁琐。 使用 git status -s
或 git status --short
命令,将得到一种更为紧凑的格式输出。 运行 git status -s
,状态报告输出如下:
$ git status -s
M README.md
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
AD mytext.txt
?? LICENSE.txt
标记:
-
?? : 新添加的未跟踪文件;
-
A : 新添加到暂存区中的文件;
-
M : 修改过的文件;
-
D : 删除过的文件;
-
MM :在右边的 M 表示该文件被修改了但是还没放入暂存区,在靠左边的 M 表示该文件被修改了并放入了暂存区。
3.6 忽略文件
一般总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。
在这种情况下,我们可以创建一个名为 .gitignore
的文件,列出要忽略的文件模式:
$ cat .gitignore
*.[oa]
*~
-
忽略
.o
或者.a
结尾的文件(编译过程中出现的类对象文件和存档文件); -
忽略以
~
波浪符结尾的文件(副本文件); -
可能还需要忽略
log
、tmp
或者pid
目录,以及自动生成的文档等等;
文件
.gitignore
规范如下:
所有空行或者以
#
开头的行会被 Git 忽略;可以使用标准的
glob
模式匹配;匹配模式可以以
/
开头防止递归;匹配模式可以以
/
结尾指定目录;要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号
!
取反。
glob 模式:shell 模式所使用的简化了的正则表达式;
-
*
:匹配零个或多个字符; -
[]
:匹配任何一个列在方括号中的字符; -
?
:匹配一个任意字符; -
[ - ]
:所有在这两个字符范围内的都可以匹配;( [a-z] ) -
**
:匹配任意中间目录
3.7 查看已暂存和未暂存的修改
当前做的哪些更新还没有暂存? 有哪些更新已经暂存起来准备好了下次提交?
尽管 git status
已经通过在相应栏下列出文件名的方式回答了这个问题,git diff
将通过文件补丁的格式显示具体哪些行发生了改变。
修改文件后,先不暂存,运行 git status
:
要查看尚未暂存的文件更新了哪些部分,不加参数输入 git diff
:
git diff
本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。绿色 + 号:表示添加;
红色 - 号:表示删除。
用 git diff --cached
查看已经暂存起来的变化:(--staged
)
通过图形化的方式或其它格式输出方式的话,可以使用
git difftool
命令来用Araxis
,emerge
或vimdiff
等软件输出diff
分析结果。使用
git difftool --tool-help
命令来看你的系统支持哪些Git Diff
插件。
3.8 提交更新
准备提交前,先用 git status
看下,是不是都已暂存起来了,如果没有暂存起来则要先使用命令:git add .
将所有文件暂存起来, 然后再运行提交命令 git commit
:
$ git status
$ git add .
$ git commit
这种方式会启动文本编辑器以便输入本次提交的说明。
默认会启用 shell 的环境变量
$EDITOR
所指定的软件,一般都是vim
或emacs
。使用
git config --global core.editor
命令设定自定义编辑软件。
可以在 commit
命令后添加 -m
选项,将提交信息与命令放在同一行,如下所示:
$ git commit -m "1025 10:15 commit info"
[main (root-commit) 57cc4a2] 1025 10:15 commit info
2 files changed, 2 insertions(+)
create mode 100644 mytext.txt
create mode 100644 remind.md
提交后会显示,当前是在哪个分支(main
)提交的,本次提交的完整 SHA-1 校验和是什么(57cc4a2
),以及在本次提交中,有多少文件修订过,多少行添加和删改过。
提交时记录的是放在暂存区域的快照。
任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管理。
每一次运行提交操作,都是对你项目作一次快照,之后可回到这个状态,或者进行比较。
3.9 跳过使用暂存区域
在提交的时候,给 git commit
加上 -a
,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add
步骤:
$ git commit -a -m 'skip command submission 1025 10:30'
3.10 移除文件
从 Git 中移除文件,就必须要从已跟踪文件清单中移除(准确来说是在暂存区中),然后 commit 。通过 git rm
连同从工作目录中删除文件,之后也不会重新出现在未跟踪文件清单里了。
- 手工移除文件时,git status 时会显示:
Changes not staged for commit // 未暂存清单
下次 commit 则该文件就不会再纳入版本管理了。
-
移除文件之前,若修改过且也已经放到暂存区了,则必须使用强制移除选项
-f
(force),这是一种安全特性,用于防止误删还没有添加到快照的数据,这样的数据不能被 git 恢复。 -
从暂存区移除文件时,(忘记添加
.gitignore
文件)若希望保留在当前工作目录,即文件保留在磁盘,且不想让 Git 继续跟踪,使用--cached
选项:
# 仅仅删除暂存区的文件
$ git rm --cached mytext.txt
# 删除工作区和暂存区中的文件
$ git rm -r mytext.txt
git rm
后面可以列出文件或指定目录,也可以使用 glob 模式:# 文件模式扩展匹配方式,删除所有 .log 文件 $ git rm log/\*.log # 移除 ~ 结尾的文件 $ git rm \*~
3.11 移动文件
不比其他的 VCS 系统,Git 并不显示跟踪文件的移动操作,如果在 Git 中重命名了某个文件,仓库中存储的元数据并不体现这是一次重命名操作。
- 文件重命名:
$ git mv file_from file_from2
# 相当于运行以下命令:
$ mv README.md README
$ git rm README.md
$ git add README