赞
踩
目录
在 github.com 中通过 New repository
创建仓库 git-demo
,只输入了仓库名称,其他均为默认值,未进行设置。
有两种取得 Git 项目仓库的方法。
从一个服务器克隆一个现有的 Git 仓库;
在现有项目或目录下导入所有文件到 Git 中。
如果想获得一份已经存在了的 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
如果不克隆现有的仓库,而是打算使用 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'
建立好了现有的 Git 仓库(git-demo1024.git),并从这个仓库中取出了所有文件的工作拷贝。 接下来,对这些文件做些修改,在完成了一个阶段的目标之后,提交本次更新到仓库。
工作目录下的每一个文件都不外乎这两种状态:已跟踪或未跟踪。
已跟踪的文件:被纳入了版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能处于未修改,已修改或已放入暂存区。
初次克隆某个仓库的时候,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态
未跟踪文件:既不存在于上次快照的记录中,也没有放入暂存区。
编辑过某些文件之后,由于自上次提交后对它们做了修改,Git 将它们标记为已修改文件。我们逐步将这些修改过的文件放入暂存区,然后提交所有暂存了的修改,如此反复。
生命周期如下:
用 git status
命令查看哪些文件处于什么状态:
- // 获取文件状态
- git status
说明所有已跟踪文件在上次提交后未被更改过。此时,还表明了当前目录下没有出现任何处于未跟踪状态的新文件,同时显示,当前所在分支同远程服务器上对应的分支没有偏离,默认分支名 master
。
在项目下创建一个新的 mytext.txt
文件。 如果之前并不存在这个文件,使用 git status
命令,将看到一个新的未跟踪文件:
- // 编写并写入
- echo 'my first Git control file' > mytext.txt
- git status
在之前的快照(提交)中没有这些文件:Git 不会自动将之纳入跟踪范围。
使用命令 git add
开始跟踪一个文件,
再运行 git status
命令,会看到 mytext.txt
文件已被跟踪,并处于暂存状态:
- // 跟踪文件
- git add mytext.txt
- git status
显示在 Changes to be committed 下面的文件,就说明是已暂存状态。
$ git ls-tree -r master --name-only
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
暂存最新版本。
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 表示该文件被修改了并放入了暂存区。
一般总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。
在这种情况下,我们可以创建一个名为 .gitignore
的文件,列出要忽略的文件模式:
- $ cat .gitignore
- *.[oa]
- *~
忽略 .o
或者 .a
结尾的文件(编译过程中出现的类对象文件和存档文件);
忽略以 ~
波浪符结尾的文件(副本文件);
可能还需要忽略 log
、tmp
或者 pid
目录,以及自动生成的文档等等;
文件
.gitignore
规范如下:
所有空行或者以
#
开头的行会被 Git 忽略;可以使用标准的
glob
模式匹配;匹配模式可以以
/
开头防止递归;匹配模式可以以
/
结尾指定目录;要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号
!
取反。
glob 模式:shell 模式所使用的简化了的正则表达式;
*
:匹配零个或多个字符;
[]
:匹配任何一个列在方括号中的字符;
?
:匹配一个任意字符;
[ - ]
:所有在这两个字符范围内的都可以匹配;( [a-z] )
**
:匹配任意中间目录
当前做的哪些更新还没有暂存? 有哪些更新已经暂存起来准备好了下次提交?
尽管 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
插件。
准备提交前,先用 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
),以及在本次提交中,有多少文件修订过,多少行添加和删改过。
提交时记录的是放在暂存区域的快照。
任何还未暂存的仍然保持已修改状态,可以在下次提交时纳入版本管理。
每一次运行提交操作,都是对你项目作一次快照,之后可回到这个状态,或者进行比较。
在提交的时候,给 git commit
加上 -a
,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add
步骤:
$ git commit -a -m 'skip command submission 1025 10:30'
从 Git 中移除文件,就必须要从已跟踪文件清单中移除(准确来说是在暂存区中),然后 commit 。通过 git rm
连同从工作目录中删除文件,之后也不会重新出现在未跟踪文件清单里了。
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 \*~
不比其他的 VCS 系统,Git 并不显示跟踪文件的移动操作,如果在 Git 中重命名了某个文件,仓库中存储的元数据并不体现这是一次重命名操作。
- $ git mv file_from file_from2
-
- # 相当于运行以下命令:
- $ mv README.md README
- $ git rm README.md
- $ git add README
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。