文件生命周期中的状态
- 未跟踪
- 已跟踪
- 未修改
- 已修改
- 已暂存
上图中的Modified-->Staged这一状态转变,需要 git add 命令实现。
注意:
git add 是个多功能命令:可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“添加内容(新增或修改的)到下一次提交中”。(git book中的原话)
跟踪新文件:Untracked --> Staged
把已跟踪的文件放到暂存区:Modified --> Staged
注意项(摘自 git book 中文版):
如果对文件CONTRIBUTING.md做了一次修改,然后执行了 git add 命令,然后又做了一次修改,这时候执行下git status 会看到如下情况
$ vim CONTRIBUTING.md
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: README
modified: CONTRIBUTING.md
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
怎么回事? 现在 CONTRIBUTING.md 文件同时出现在暂存区和非暂存区。 这怎么可能呢? 好吧,实际上 Git 只不过暂存了你运行 git add 命令时的版本, 如果你现在提交,CONTRIBUTING.md 的版本是你最后一次运行 git add 命令时的那个版本,而不是你运行 git commit 时,在工作目录中的当前版本。 所以,运行了 git add 之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来。
提交时,忽略部分文件
GitHub 有一个十分详细的针对数十种项目及语言的 .gitignore
文件列表,你可以在 https://github.com/github/gitignore 找到它.
查看已暂存和未暂存的修改
查看尚未暂存的文件更新了哪些部分,不加参数直接输入 git diff
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容。
若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --cached 命令。(Git 1.6.1 及更高版本还允许使用 git diff --staged,效果是相同的,但更好记些。)(也就是说 git diff --staged 是比较 暂存区里的快照/版本 与 上一次提交的版本 之间的区别。)
提交
执行 git commit 会启用默认的vim或者emacs编辑器,可以使用 git config --global core.editor 命令设定你喜欢的编辑软件(路径不能有空格)。
git commit 提交的是暂存区域的快照。每一次提交,都是对你项目作一次快照,以后可以回到这个状态,或者进行比较。
跳过使用暂存区域(git book中的该标题不恰当)
给 git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add 步骤。(注意:是把 已跟踪过的文件 添加到暂存区,而未跟踪的文件还是需要通过 git add 命令加入暂存区)
移除文件
手动将文件删除(在linux中的命令是rm),然后执行 git rm 命令,下一次提交时,该文件就不再纳入版本管理了(从工作区+暂存区 移除文件)。
git rm [文件名]
注意,git rm 命令只能操作已跟踪的文件。
如果要删除已修改的文件(当然该文件必须是已跟踪的文件),要使用 -f 参数强制删除,即
git rm -f [文件名]
如果只想将某个文件的暂存快照删除,而在工作区里保留这个文件,要使用 --cached 选项,即
git rm --cached [文件名]
移动文件
其实,运行 git mv 就相当于运行了下面三条命令:
$ mv README.md README
$ git rm README.md
$ git add README
本文摘自 git book 中文版 v2,其中部分内容为个人见解。
git book——2.2 Git 基础 - 记录每次更新到仓库