Da'sBlog

git文件状态

mark
灰色箭头不参与git快照。

  1. 默认git有4种状态
  2. untracked 未跟踪
  3. unmodified 未修改
  4. modified 修改
  5. staged 暂存区

其中我们工作区中只有 未修改 和修改。

初始化,和commit后 所有为跟踪的文件都是 未修改的。

运行了 git add 之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来:

git diff –cached 查看已经暂存起来的变化:
git commit 加上 -a 选项,Git 就会自动把所有已经跟踪过的文件暂存起来一并提交

如果只是简单地从工作目录中手工删除文件,运行 git status 时就会在 “Changes not staged for commit” 部分(也就是未暂存清单)看到:

1
2
3
4
5
6
7
8
9
$ rm grit.gemspec
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: grit.gemspec

no changes added to commit (use “git add” and/or “git commit -a”)
然后再运行 git rm 记录此次移除文件的操作:

1
2
3
4
5
6
7
8
9
$ git rm grit.gemspec
rm 'grit.gemspec'
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: grit.gemspec

另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆 .a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 –cached 选项即可:

$ git rm --cached readme.txt

后面可以列出文件或者目录的名字,也可以使用 glob 模式。比方说:

$ git rm log/\*.log

注意到星号 * 之前的反斜杠 \,因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开(译注:实际上不加反斜杠也可以运行,只不过按照 shell 扩展的话,仅仅删除指定目录下的文件而不会递归匹配。上面的例子本来就指定了目录,所以效果等同,但下面的例子就会用递归方式匹配,所以必须加反斜杠。)。此命令删除所有 log/ 目录下扩展名为 .log 的文件。类似的比如:

$ git rm \*~

会递归删除当前目录及其子目录中所有 ~ 结尾的文件。

图形化显示分支
git log –pretty=format:”%h %s” –graph

1
2
3
4
5
6
7
8
9
10
11
12
选项 说明
-p 按补丁格式显示每个更新之间的差异。
--word-diff 按 word diff 格式显示差异。
--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` 的简化用法。

提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 –amend 提交:

1
2
3
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

取消对文件的修改
$ git checkout – benchmarks.rb

添加远程仓库
git remote add [shortname] [url]

从远程仓库抓取数据
$ git fetch [remote-name]

默认情况下 git clone 命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master 分支)。所以一般我们运行 git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。

坚持原创技术分享,您的支持将鼓励我继续创作!