1. 配置
1.1 设置用户信息(必不可省)
$ git config --global user.name "githubID"
$ git config --global user.email 'youremail'
1.2 gitconfig
文件作用范围
/etc/gitconfig 文件:
系统
中对所有用户都普遍适用的配置。 git config 时用 --system
~/.gitconfig 文件:用户
目录下的配置文件只适用于该用户。 git config 时用 --global
.git/config 文件:当前项目
的 git 目录中的配置文件,这里的配置仅仅针对当前项目有效
每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
2. 开始
① 初始化一个仓库
mkdir my-git
cd my-git
git init
② 或者克隆一个仓库
git clone git://github.com/monicedy/cw.git [rename]
克隆一个裸仓库
git clone --bare my-git
2.2 git status
查看当前文件状态
文件状态变化周期图
2.3 git add
的三种不同功能
- 开始跟踪新文件
- 把已跟踪的文件放到暂存区
- 合并时把有冲突的文件标记为已解决状态
2.4.gitignore
忽略某些文件
1.所有空行或者以注释符号 # 开头的行都会被 Git 忽略。
2.可以使用标准的 glob 模式匹配。
3.匹配模式最后跟反斜杠(/)说明要忽略的是目录。
4.要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
2.5 查看已暂存和未暂存的更新
git diff
工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容
git diff --cached
查看已经暂存起来的变化
$ git diff --cached
diff --git a/benchmarks.rb b/benchmarks.rb
index 3cb747f..e445e28 100644
--- a/benchmarks.rb
+++ b/benchmarks.rb
@@ -36,6 +36,10 @@ def main
@commit.parents[0].parents[0].parents[0]
end
+ run_code(x, 'commits 1') do
+ git.commits.size
+ end
+
run_code(x, 'commits 2') do
log = git.commits('master', 15)
log.size
2.6 git commit
提交
将文件从以上生命周期图
的 staged
状态变成 unmodified
状态
git commit -a
会自动把所有已经跟踪过的文件暂存起来一并提交,跳过 git add
步骤
2.7 git rm <file>
移除
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用
git rm
命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。
#如果删除之前修改过并且已经放到暂存区域的话,则必须要用强制删除选项 -f
$:~/my-git/my-clone/my-git$ git rm file
error: the following file has changes staged in the index:
file
(use --cached to keep the file, or -f to force removal)
$:~/my-git/my-clone/my-git$ rm file #物理删除
$:~/my-git/my-clone/my-git$ git status
Changes to be committed:
new file: file
Changes not staged for commit:
deleted: file
$:~/my-git/my-clone/my-git$ git rm file #魔法删除
rm 'file'
$:~/my-git/my-clone/my-git$ git status
No commits yet
git rm --cached
我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。换句话说,仅是从跟踪清单中删除。比如一些大型日志文件或者一堆 .a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上,用 --cached 选项即可
2.8git mv file_from file_to
移动/更名
可被git识别为renamed,等效于
$ mv README.txt README
$ git rm README.txt
$ git add README
3. 查看提交历史 git log
-p
选项展开显示每次提交的内容差异,用 -n 则仅显示最近的n次更新
--stat
,仅显示简要的增改行数统计
--pretty
选项:oneline
将每个提交放在一行显示 ; 另外还有short
,full
和fuller
format
,可以定制要显示的记录格式
- %H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
用 oneline 或 format 时结合 --graph 选项,可以看到开头多出一些 ASCII 字符串表示的简单图形
$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
* 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
* 11d191e Merge branch 'defunkt' into local
选项 说明
-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(后跟指定格式)。
4. 撤销
4.1 git commit --amend
修改提交
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容
4.2 git reset HEAD <file>...
取消已经暂存的文件
将文件从 Changes to be committed
移到 Changes not staged for commit
$:~/my-git/my-clone/my-git$ git add readme.md
$:~/my-git/my-clone/my-git$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: file
new file: readme.md
$:~/my-git/my-clone/my-git$ git reset -- readme.md
$:~/my-git/my-clone/my-git$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: file
4.3 git checkout -- <filename>
取消对文件的修改
$:~/my-git/my-clone/my-git$ echo 'hhh' > file
$:~/my-git/my-clone/my-git$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: file
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: file
$:~/my-git/my-clone/my-git$ git checkout -- file
$:~/my-git/my-clone/my-git$ git status
On branch master
No commits yet
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: file
5. 远程仓库
5.1 添加远程仓库
git remote add [shortname] [url]
5.2 从远程仓库抓取数据到本地
git fetch [remote-name]
从远程仓库中拉取所有本地仓库中还没有的数据
运行完成后,你就可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只是取出某个分支。
如果是克隆了一个仓库,此命令会自动将远程仓库归于 origin 名下。所以,git fetch origin
会抓取从你上次克隆以来别人上传到此远程仓库中的所有更新(或是上次 fetch 以来别人提交的更新)。有一点很重要,需要记住,fetch
命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。
如果设置了某个分支用于跟踪某个远端仓库的分支,可以使用
git pull
命令自动抓取数据下来,然后将远端分支自动合并到本地仓库中当前分支。在日常工作中我们经常这么用,既快且好。实际上,默认情况下git clone
命令本质上就是自动创建了本地的 master 分支用于跟踪远程仓库中的 master 分支(假设远程仓库确实有 master
分支)。所以一般我们运行git pull
,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。
5.3 推送数据到远程仓库
git push [remote-name(origin)] [branch-name(master)]
将本地仓库中的数据推送到远程仓库
只有在所克隆的服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务。如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送
5.4 查看远程仓库信息git remote show [remote-name]
$ git remote show origin
* remote origin
URL: git://github.com/schacon/ticgit.git
Remote branch merged with 'git pull' while on branch master
master
Tracked remote branches
master
ticgit
5.5 远程仓库的删除和重命名
git remote rename <OldName> <NewName>
命令修改某个远程仓库在本地的简称.
git remote rm <repositoryName>
删库跑路
6.标签
Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。
6.1 含附注的标签
git tag -a v1.4 -m 'my version 1.4'
-a 即annotated含附注的
-m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中
可以使用git show
命令查看相应标签的版本信息,并连同显示打标签时的提交对象
如果你有自己的私钥,还可以用 GPG 来
签署标签
,只需要把之前的 -a 改为-s
(译注: 取 signed 的首字母)即可
6.2 轻量级标签
实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -a,-s 或 -m 选项都不用,直接给出标签名字即可:
6.3 分享标签
默认情况下git push 并不会把标签传送到远端服务器上,显式命令格式如同推送分支,运行 git push origin [tagname]
即可
$ git push origin --tags
#推送所有标签
git命令别名
$ git config --global alias.ci commit
现在,如果要输入 git commit 只需键入 git ci 即可