几个名词:
仓库:repository
跟踪:track
暂存:stage
提交:commit
推送:push
拉取:pull
Git仓库
将现有目录git初始化——git init
$ git init
该命令创建了.git目录,此时项目文件还没有被跟踪。
$ git add .
$ git commit -m "init"
git add对文件进行跟踪,git commit进行提交。
从服务器clone现有git仓库——git clone
$ git clone url
该命令将服务器上所有数据拉取下来。
记录更新到仓库
Git中的文件有三种状态:已提交Committed,已修改Modified,已暂存Staged。
而工作区中的文件又分为两种状态:
- 已跟踪,即被纳入了版本控制
- 未跟踪,
执行git clone之后,工作区的所有文件都是已跟踪状态,也都是未修改状态。
文件被修改后从未修改Unmodified变为已修改Modified,将已修改文件放入暂存区,变为已暂存状态Staged,将已暂存的修改提交,变为已提交Committed,重新变为未修改Unmodified。

检查文件状态——git status
$ git status
On branch master 当前分支
nothing to commit, working directory clean 已跟踪文件在上次提交后都未更改过,没有任何未跟踪的新文件
如果创建了README,提示如:
Untracked files:
(use "git add <file>" to include in what will be committed)
README
nothing added to commit but untracked files presend(use "git add" to track)
说明README.md是新的未跟踪文件
跟踪新文件——git add
如果想要将其纳入跟踪状态,执行:
$ git add README
$ git status
Changes to be committed:
(use "git reset HEAD <file>" to unstage)
new file: README
Changes to be committed下面的文件都是已暂存状态,是由于执行了git add <文件或目录>,即开始跟踪某文件。
暂存已修改文件——git add
如果修改了已跟踪的文件contributing.md,再git status:
$ git status
Changes to be committed:
(use "git reset HEAD <file>" to unstage)
new file: README
Changes not staged for commit:
(use "git add <file>" to update what will be committed)
(use "git checkout -- <file>" to discard changes in working directory)
modified: CONTRIBUTING.md
Changes not staged for commit下的文件是已跟踪文件被修改了,但还没有暂存。- 执行
git add,将会暂存CONTRIBUTING.md,git status查看时其出现在Changes to be committed下。 - 如果继续修改
CONTRIBUTING.md,执行git status,会看到其同时出现在Changes to be committed和Changes not staged for commit。原因是git add暂存的是当时的修改,将要commit的是当时的版本,工作区的现在的版本没有经过git add,还没有被暂存。 - 再次执行
git add,会把最新版本暂存,git status查看时该文件只出现在Changes to be committed下。
git add的功能,核心是添加到下一次提交中,有如下使用场景:
- 开始跟踪新文件
- 已跟踪已修改的文件暂存
- 合并时把有冲突的文件标记为已解决
忽略文件——.gitignore
项目目录下创建.gitignore文件,列出要忽略的文件模式。
使用连续的两个星号表示匹配任意中间目录,如a/**/z可以匹配a/z,a/b/z,a/b/c/z
查看修改——git diff
分两种,查看未暂存的修改,查看已暂存尚未提交的修改。
git add只能给出文件名的简单形式,git diff通过文件补丁的格式显示具体哪些行有改动。
$ git diff 不加任何参数时,显示未暂存的修改,即工作区文件和暂存区快照的差异
$ git diff --staged 新版本,显示已暂存的修改和已提交内容的差异,即将要提交的内容
$ git diff --cached 旧版本,同上
回想一下,git status打印出的栏有Changes to be committed和 Changes not staged for commit。
git diff会打印Changes not staged for commit下的版本的改动
git diff --staged会打印Changes to be committed下的版本的改动
所以如果全部改动都被git add跟踪了,之后立即执行git diff并不会打印任何东西。
相应地,如果全部暂存都被git commit提交过了,之后立即执行git diff --staged也不会打印任何东西。
提交更新——git commit
将git status打印出的Changes to be committed下的版本提交。
$ git commit 启动vim供编辑提交说明
$ git commit -m "comment"
每次提交,都是对项目做一次快照,之后可以将项目回到这个状态,也可以进行比较。
跳过暂存区——git commit -a
-a 选项告诉git,把所有已经跟踪过的文件暂存、提交一并完成,跳过git add,也就是把git status打印的Changes not staged for commit下的版本直接一步提交了。
$ git commit -a -m "comment"
移除文件——git rm
- 对于已提交的文件,执行
git rm <file>相当于执行rm <file>+git add <file>,也相当于rm <file>+git rm <file>,之后本次删除都会放入暂存区待提交。 - 对于已暂存的文件,执行
git rm将会失败,会提示:(use --cached to keep the file, or -f to force removal),即如果加上--cached选项即git rm --cache <file>,将会在git的暂存区中删除文件,之后的提交会提交对该文件的删除,仓库不再保留该文件(不再跟踪),但本地工作区还有该文件。如果加上-f选项,将会把对该文件的删除放入暂存区,本地也删除了该文件。 - 对于已修改的文件,执行
git rm也会失败,也会提示:(use --cached to keep the file, or -f to force removal)。如果加上–cached选项,将会在git的暂存区中删除文件,之后的提交会提交对该文件的删除,仓库不再保留该文件(不再跟踪),但本地工作区还有该文件。如果加上-f选项,本地文件会被删除,本次删除也会出现在下次提交中。
小结一下:
git rm只适用于已跟踪文件,新建的未跟踪文件,git rm无效。
$ git rm <file> 适用于已提交文件,暂存对文件的删除,本地也删除
$ git rm --cached <file> 适用于已暂存、已修改文件,暂存对文件的删除,工作区仍有该文件
$ git rm -f <file> 适用于已暂存、已修改文件,暂存对文件的删除,本地也删除
移动文件——git mv
$ git mv file_from file_to
相当于运行如下三条命令:
$ mv file_from file_to
$ git rm file_from
$ git add file_to
即git mv,相当于本地重命名以后,对新文件进行跟踪,对旧文件按删除暂存。
本文介绍了Git的基本操作,包括如何初始化Git仓库、从服务器克隆仓库、跟踪和提交文件、忽略文件、查看文件状态以及移动和删除文件。通过`git init`、`git clone`、`git add`、`git commit`等命令,理解Git的工作流程,实现版本控制。
2343

被折叠的 条评论
为什么被折叠?



