创建 Git 仓库
- 在已存在目录中初始化仓库
cd my-workspace
mkdir my-prpject-a
cd my-prpject-a
git init
git init
该命令将创建一个名为 .git 的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干
- 克隆现有的仓库
git clone https://github.com/your-name/your-project
cd your-project
git clone https://github.com/your-name/your-project my-project-a
cd my-project-a
记录每次更新到仓库【重点】
- 检查当前文件状态
git status
查看哪些文件处于什么状态
案例:
echo ‘My Project’ > README
git status
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
README
nothing added to commit but untracked files present (use "git add" to track)
- 跟踪新文件
git add [file]
案例:
git add README
git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README
只要在 Changes to be committed
这行下面的,就说明是已暂存状态。
如果此时提交,那么该文件在你运行 git add 时的版本
将被留存在后续的历史记录中。
git add 命令使用文件或目录
的路径作为参数;如果参数是目录的路径,该命令将递归地跟踪该目录下的所有文件。
- 暂存已修改的文件
修改一下 README 文件
git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: README
文件同时出现在暂存区和非暂存区;
实际上 Git 只不过暂存了你运行 git add 命令时的版本
。 如果你现在提交, README 的版本是你最后一次运行 git add 命令时的那个版本,而不是你运行 git commit 时的版本。
所以,运行了 git add 之后又作了修订的文件,需要重新运行 git add 把最新版本重新暂存起来
git add 命令 是个多功能命令:
- 可以用它开始跟踪新文件
- 把已跟踪的文件放到暂存区
- 用于合并时把有冲突的文件标记为已解决状态
- 将这个命令理解为“
精确地将内容添加到下一次提交中
”而不是“将一个文件添加到项目中”要更加合适
- 状态简览
git status -s
git status –short
将得到一种格式更为紧凑
的输出
- ?? 标记 : 新添加的未跟踪文件
- A 标记 : 新添加到暂存区中的文件
- M 标记 : 修改过的文件
- 忽略文件
一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等
创建一个名为 .gitignore
的文件,列出要忽略的文件的模式
.DS_Store
target/
.idea/*
*.iml
文件 .gitignore
的格式规范如下:
- 所有空行或者以 # 开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(/)开头防止递归。
- 匹配模式可以以(/)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
所谓的 glob 模式
是指 shell 所使用的简化了的正则表达式。
- 星号(*)匹配零个或多个任意字符;
- [abc] 匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);
- 问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。
- 使用两个星号(
**
)表示匹配任意中间目录,比如 a/**/z 可以匹配 a/z 、 a/b/z 或 a/b/c/z 等。
- 查看已暂存和未暂存的修改
git diff
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。 也就是修改之后还没有暂存起来的变化内容。
git diff –staged
查看已暂存的将要添加到下次提交里的内容
git diff –cached
查看已经暂存起来的变化( –staged 和 –cached 是同义词)
可以使用 git difftool 命令来调用 emerge 或 vimdiff 等软件(包括商业软件)输出 diff 的分析结果。
- 提交更新
git commit -m “git log”
- 跳过使用暂存区域
git commit -a -m “git log”
git add 和 git commit 的组合命令
这很方便,但是要小心,有时这个选项会将不需要的文件添加到提交中
- 移除文件
git rm [file>
如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f
(译注:即 force 的首字母)
另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。
换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。 当你忘记添加 .gitignore 文件,不小心把一个很多的日志文件添加到暂存区时,这一做法尤其有用。
为达到这一目的,使用 --cached
选项:
git rm –cached [file>
查看提交历史
git log
不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面。 这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明
git log -p
显示每次提交所引入的差异(按 补丁 的格式输出);
也可以限制显示的日志条目数量,例如使用 -2
选项来只显示最近的两次提交
git log -p -2
git log –stat
能看到每次提交的简略统计信息
--stat 选项
在每次提交的下面列出所有被修改过的文件、有多少文件被修改了以及被修改过
的文件的哪些行被移除或是添加了。 在每次提交的最后还有一个总结。
git log –pretty=oneline
可以使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用。 比如 oneline
会将每个提交放在一行显示,在浏览大量的提交时非常有用。 另外还有 short
,full
和 fuller
选项,
最有意思的是 format ,可以定制记录的显示格式。 这样的输出对后期提取分析格外有用——因为你知道输出的格式不会随着 Git 的更新而发生改变:
git log –pretty=format:”%h - %an, %ar : %s”
限制输出长度:类似 –since 和 –until 这种按照时间作限制的选项很有用。
git log –since=2.weeks
还可以过滤出匹配指定条件的提交。 用 --author
选项显示指定作者的提交,用 --grep
选项搜索提交说明中的关键字。
撤消操作
git commit –amend
- 取消暂存的文件
git reset HEAD [file>
远程仓库的使用
- 查看远程仓库
git remote -v
- 添加远程仓库
git remote add [remote> https://github.com/xxx/xxx
没有 [remote> ,默认为 origin
- 从远程仓库中抓取与拉取
git fetch [remote>
- 推送到远程仓库
git push [remote> master
- 查看某个远程仓库
git remote show [remote>
如果你是 Git 的重度使用者,那么还可以通过 git remote show 看到更多的信息。
- 远程仓库的重命名与移除
git remote rename [remote1> [remote2>
git remote remove [remote>
打标签
- 列出标签
git tag
git tag -l “v1.8.5*”
- 创建标签
Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)
轻量标签很像一个不会改变的分支——它只是某个特定提交的引用
附注标签是存储在 Git 数据库中的一个完整对象
创建附注标签
git tag -a v1.4 -m “my version 1.4”
通过使用 git show 命令可以看到标签信息和与之对应的提交信息
git show v1.4
创建轻量标签
git tag v1.5
git show v1.5
- 后期打标签
git log –pretty=oneline
git tag -a v1.2 8a5cbc430f1a9c3d00faaeffd07798508422908a
- 共享标签
默认情况下,git push 命令并不会传送标签到远程仓库服务器上。 在创建完标签后你必须显式地推送标签到共享服务器上。 这个过程就像共享远程分支一样——你可以运行
git push origin [tagname>
git push origin –tags
- 删除标签
git tag -d v1.4
注意上述命令并不会从任何远程仓库中移除这个标签,你必须用 git push [remote>:refs/tags/[tagname>
来更新你的远程仓库
第一种变体是 git push [remote> :refs/tags/[tagname> :
git push origin :refs/tags/v1.4
第二种更直观的删除远程标签的方式是:
git push origin –delete v1.4
- 检出标签
git checkout v1.5
Git 别名
Git 并不会在你输入部分命令时自动推断出你想要的命令。 如果不想每次都输入完整的 Git 命令,可以通过 git config 命令来轻松地为每一个命令设置一个别名。
git config –global alias.co checkout
git config –global alias.br branch
git config –global alias.ci commit
git config –global alias.st status
意味着,当要输入 git commit
时,只需要输入 git ci
就可以了
git config –global alias.unstage ‘reset HEAD –’
git config –global alias.last ‘log -1 HEAD’
git config –global alias.visual ‘!gitk’