Git命令
git init
从当前目录初始化
git clone
从现有仓库克隆
git status
检查当前文件状态
git add
这是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:
- 可以用它开始跟踪新文件,
- 或者把已跟踪的文件放到暂存区,
- 还能用于合并时把有冲突的文件标记为已解决状态等
.gitignore文件
文件.gitignore
的格式规范如下:
- 所有空行或者以注释符号
#
开头的行都会被Git
忽略。 - 可以使用标准的
glob
模式匹配。 - 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
所谓的glob
模式是指shell
所使用的简化了的正则表达式。
- 星号(*)匹配零个或多个任意字符;
[abc]
匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一 个 b,要么匹配一个 c);- 问号(?)只匹配一个任意字符;
- 如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。
例子:
1 | # 此为注释 – 将被 Git 忽略 |
git diff
- 要查看尚未暂存的文件更新了哪些部分,不加参数直接输入
git diff
- 若要看已经暂存起来的文件和上次提交时的快照之间的差异,可以用
git diff --cached
命令
请注意,单单
git diff
不过是显示还没有暂存起来的改动,而不是这次工作和上次提交 之间的差异。所以有时候你一下子暂存了所有更新过的文件后,运行git diff
后却什么也没有,就是这个原因。
git commit
提交更新
- 这种方式会启动文本编辑器以便输入本次提交的说明
- 也可以使用 -m 参数后跟提交说明的方式,在一行命令中提交更新
1 | git commit -m "Story 182: Fix benchmarks for speed" |
跳过使用暂存区域
尽管使用暂存区域的方式可以精心准备要提交的细节,但有时候这么做略显繁琐。Git
提供了一个跳过使用暂存区域的方式,只要在提交的时候,给 git commit
加上-a
选项,Git
就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过git add
步骤:
1 | git commit -a -m 'added new benchmarks' |
git log
默认不用任何参数的话,git log
会按提交时间列出所有的更新,最近的更新排在最上面。每次更新都有一个SHA-1
校验、作者的名字、电子邮件地址、提交时 间,最后缩进一个段落显示提交说明。
我们常用-p
选项展开显示每次提交的内容差异,用-2
则仅显示最近的两次更新:
git log –stat
仅显示简要的增改行数统计
每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计。
1 | 选项 说明 |
git commit –amend
修改最后一次提交
此命令将使用当前的暂存区域快照提交。
- 如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,而所提交的文件快照和之前的一样。
- 如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行
--amend
提交
git reset HEAD \…
取消已经暂存的文件
git checkout – \…
取消对文件的修改
可以看到,该文件已经恢复到修改前的版本。你可能已经意识到了,这条命令有些危险, 所有对文件的修改都没有了,因为我们刚刚把之前版本的文件复制过来重写了此文件。所以 在用这条命令前,请务必确定真的不再需要保留刚才的修改。
记住,任何已经提交到
Git
的都可以被恢复。即便在已经删除的分支中的提交,或者用--amend
重新改写的提交,都可以被恢复。所以,你可能失去的数据,仅限于没有提交过的,对Git
来说它们就像从未存在过一样。
远程仓库的使用
查看当前的远程库
要查看当前配置有哪些远程仓库,可以用git remote
命令,它会列出每个远程库的简短名字。
在克隆完某个项目后,至少可以看到一个名为origin
的远程库,Git
默认使用这个名字来标识你所克隆的原始仓库。
也可以加上-v
选项(译注:此为—verbose
的简写,取首字母),显示对应的克隆地址。
1 | $ git remote -v |
添加远程仓库
要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行git remote add [shortname] [url]
1 | $ git remote |
从远程仓库抓取数据
git fetch [remote-name]
此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。
fetch
命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。
git pull
从原始克隆的远端仓库中抓取数据后,合并到工作目录中当前分支。
推送数据到远程仓库
git push [remote-name] [branch-name]
只有在所克隆的服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务。如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。你必须先把他们的更新抓取到本地,并到自己的项目中,然后才可以再次推送。
查看远程仓库信息
git remote show [remote-name]
实际使用过程中,git remote show
给出的信息可能会像这样1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21$ git remote show origin
* remote origin
URL: git@github.com:defunkt/github.git
Remote branch merged with 'git pull' while on branch issues
issues
Remote branch merged with 'git pull' while on branch master
master
New remote branches (next fetch will store in remotes/origin)
caching
Stale tracking branches (use 'git remote prune')
libwalker
walker2
Tracked remote branches
acl
apiv2
dashboard2
issues
master
postgres
Local branch pushed with 'git push'
master:master
它告诉我们,运行git push
时缺省推送的分支是什么(译注:最后两行)。它还显示了有哪些远端分支还没有同步到本地(译注:第六行的caching
分支),哪些已同步到本地的远端分支在远端服务器上已被删除(译注:Stale tracking branches
下面的两个分支),以及运行git pull
时将自动合并哪些分支(译注:前四行中列出的issues
和master
分支)。
远程仓库的删除和重命名
git remote rename
重命名
1 | $ git remote rename pb paul |
git remote rm
移除
碰到远端仓库服务器迁移,或者原来的克隆镜像不再使用,又或者某个参与者不再贡献代码,那么需要移除对应的远端仓库。
1 | git remote rm paul |