Fork me on GitHub

Git常用命令

Git命令

git init

从当前目录初始化

git clone

从现有仓库克隆

git status

检查当前文件状态

git add

这是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:

  • 可以用它开始跟踪新文件,
  • 或者把已跟踪的文件放到暂存区,
  • 还能用于合并时把有冲突的文件标记为已解决状态等

.gitignore文件

文件.gitignore的格式规范如下:

  • 所有空行或者以注释符号#开头的行都会被Git忽略。
  • 可以使用标准的glob模式匹配。
  • 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
  • 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。

所谓的glob模式是指shell所使用的简化了的正则表达式。

  • 星号(*)匹配零个或多个任意字符;
  • [abc]匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一 个 b,要么匹配一个 c);
  • 问号(?)只匹配一个任意字符;
  • 如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。

例子:

1
2
3
4
5
# 此为注释 – 将被 Git 忽略
*.a # 忽略所有 .a 结尾的文件
!lib.a # 但 lib.a 除外
/TODO # 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO build/ # 忽略 build/ 目录下的所有文件
doc/*.txt # 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
选项 说明
-p 按补丁格式显示每个更新之间的差异。
--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(后跟指 定格式)。
-(n) 仅显示最近的 n 条提交
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示指定作者相关的提交。
--committer 仅显示指定提交者相关的提交。

git commit –amend

修改最后一次提交

此命令将使用当前的暂存区域快照提交。

  • 如果刚才提交完没有作任何改动,直接运行此命令的话,相当于有机会重新编辑提交说明,而所提交的文件快照和之前的一样。
  • 如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行--amend提交

git reset HEAD \

取消已经暂存的文件

git checkout – \

取消对文件的修改

可以看到,该文件已经恢复到修改前的版本。你可能已经意识到了,这条命令有些危险, 所有对文件的修改都没有了,因为我们刚刚把之前版本的文件复制过来重写了此文件。所以 在用这条命令前,请务必确定真的不再需要保留刚才的修改。

记住,任何已经提交到Git的都可以被恢复。即便在已经删除的分支中的提交,或者用--amend重新改写的提交,都可以被恢复。所以,你可能失去的数据,仅限于没有提交过的,对Git来说它们就像从未存在过一样。

远程仓库的使用

查看当前的远程库

要查看当前配置有哪些远程仓库,可以用git remote命令,它会列出每个远程库的简短名字。

在克隆完某个项目后,至少可以看到一个名为origin的远程库,Git默认使用这个名字来标识你所克隆的原始仓库。

也可以加上-v选项(译注:此为—verbose的简写,取首字母),显示对应的克隆地址。

1
2
$ git remote -v
origin git://github.com/schacon/ticgit.git

添加远程仓库

要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行git remote add [shortname] [url]

1
2
3
4
5
6
$ git remote
origin
$ git remote add pb git://github.com/paulboone/ticgit.git
$ git remote -v
origin git://github.com/schacon/ticgit.git
pb git://github.com/paulboone/ticgit.git

从远程仓库抓取数据

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时将自动合并哪些分支(译注:前四行中列出的issuesmaster分支)。

远程仓库的删除和重命名

git remote rename 重命名

1
$ git remote rename pb paul

git remote rm 移除

碰到远端仓库服务器迁移,或者原来的克隆镜像不再使用,又或者某个参与者不再贡献代码,那么需要移除对应的远端仓库。

1
git remote rm paul
-------------本文结束感谢您的阅读-------------

本文作者:乔羽 / FightingJoey

发布时间:2017年07月22日 - 15:33

最后更新:2018年09月27日 - 10:09

原始链接:https://fightingjoey.github.io/2017/07/22/开发/Git常用命令/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

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