首先咱们要知道Git是什么git
他是一个基于差别的版本控制器,主要是储存基本文件随时间逐步积累的差别 他大部分操做都是本地执行,通常只添加数据,而不是删除修改 有已提交,已暂存,已修改,三个状态,修改后保存到已暂存区等待一次性提交github
设置用户名和邮件地址,每个Git提交都会使用,会被记录到每一次提交中且不可更改windows
若是不想使用默认文本编辑器,能够这样^1^,好比更改为Emacs,在windows系统上使用别的编辑器必须提供可执行文件^2^markdown
1. $ git config --global core.editor emacs
2. $ git config --global core.editor "url"
复制代码
当你须要获取帮助时使用,使用时无需联网,超方便less
$ git help <verb>
$ git <verb> --help
$ man git-<verb>
复制代码
同时使用-h能够得到更简洁的帮助,以上命令展示的时全面的帮助编辑器
$ cd /c/user/my_project
//继续
$ git init
//将建立一个.git的子目录,里面包含着全部的初始化的git必须文件
复制代码
使用git clone url命令,克隆git仓库近乎全部的数据svn
$ git clone https://github.com/libgit2/libgit2
//在当前目录下建立一个libgit2的目录,并在其下初始化一个.git的文件夹
复制代码
已跟踪文件:被归入了版本控制的文件,Git已知晓的文件函数
使用git status命令oop
//获得这个说明工做目录自上次提交后不曾更改
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
//试图在我建立的"My Project"项目下添加一个文件夹"README"
$ echo 'My Project' > README
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
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开始跟踪一个文件flex
$ git add README
复制代码
再次查看当前文件状态
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
new file: README
复制代码
Changes to be committed:如下的说明是已暂存状态
Changes not staged for committed:已跟踪文件内容发生了变化但未放到暂存区,即更新,暂存此次更新时须要运行gir add命令,这是一个多功能命令
git add : 能够用于跟踪新文件,用于将已跟踪文件放到暂存区,用于合并时吧冲突文件标记为已解决状态
此时文件已暂存,若是咱们在该文件未提交时再次进行修改会发生什么呢? 答案就是他同时出如今了暂存区和非暂存区 可是提交时仍旧提交的上一个运行过git add的版本 因此不管如何,在作了修改之后要记得暂存
git status命令输出十分详细,可是咱们也有一种更为简洁的查看方式
git status -s
//或者
git status -short
//输出
$ git status -s
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
复制代码
其中
?? 新添加的未跟踪文件
A 新添加到暂存区
M 修改过的文件
咱们能够建立一个.gitignore结尾的文件,来列出要忽略的文件的模式 通常状况下,一个仓库只有根目录下有一个.gitignore文件,他被递归地应用到整个仓库中,而子目录下也能够有额外的该文件,子目录下的文件只应用到他的目录中
GitHub有一个十分详细的.gitignore文件列表: github.com/github/giti…
格式规范以下:
全部空行或者以 # 开头的行都会被 Git 忽略。
可使用标准的 glob 模式匹配,它会递归地应用在整个工做区中。
匹配模式能够以(/)开头防止递归。
匹配模式能够以(/)结尾指定目录。
要忽略指定模式之外的文件或目录,能够在模式前加上叹号(!)取反。
# 忽略全部的 .a 文件
*.a
# 但跟踪全部的 lib.a,即使你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其全部子目录下的 .pdf 文件
doc/**/*.pdf
复制代码
若是你想知道具体修改了说明地方,可使用git diff命令,他可让咱们知道,当前哪些更新未暂存,哪些更新已暂存正在等待提交.
git diff相较于git status是以文件补丁的格式来展现更新,能让咱们更加具体的了解具体在哪里发生了变化
咱们先输入git status查看状态
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: README
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: CONTRIBUTING.md
复制代码
咱们能够知道README文件已修改暂存,而CONTRIBUING.md文件已修改未暂存 此时咱们要查看还没有暂存的文件更新了哪部分,使用git diff
$ git diff
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 8ebb991..643e24f 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -65,7 +65,8 @@ branch directly, things can get messy.
Please include a nice description of your changes when you submit your PR;
if we have to read the whole diff to figure out why you're contributing
in the first place, you're less likely to get feedback and have your change
-merged in.
+merged in. Also, split your changes into comprehensive chunks if your patch is
+longer than a dozen lines.
If you are starting to work on a particular area, feel free to submit a PR
that highlights your work in progress (and note in the PR title that it's
复制代码
git diff比较的是工做目录中当前文件和暂存区快照之间的差别,即未暂存的变化内容
要查看下次提交的内容,可使用git diff --staged或者git diff --cached(同义词) 他会对比已暂存的文件和最后一次提交的文件的差别
$ git diff --staged
diff --git a/README b/README
new file mode 100644
index 0000000..03902a1
--- /dev/null
+++ b/README
@@ -0,0 +1 @@
+My Project
复制代码
可是git diff自己只显示未暂存的改动
和status同样,若是已暂存文件未提交又修改且未再次保存,在git diff命令下和git diff --staged命令下都会出现该文件的名字,一样提交也只会提交先前已暂存的部分.
git commit是提交命令,输入后会启动你所选择的文本编辑器来输入提交说明
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is up-to-date with 'origin/master'.
#
# Changes to be committed:
# new file: README
# modified: CONTRIBUTING.md
# (在这里输入你的提交说明)
~
~
~
".git/COMMIT_EDITMSG" 9L, 283C
复制代码
推出编辑器时,Git会丢弃注释行,用提交说明生成一次提交
也能够用commit -m命令,将提交信息与命令放在同一行
$ git commit -m "(提交信息)Story 182: Fix benchmarks for speed"
[master 463dc4f] Story 182: Fix benchmarks for speed
2 files changed, 2 insertions(+)
create mode 100644 README
//提交信息中会告诉你,当前是哪一个分支(master)提交的
复制代码
使用git commit -a命令,将全部已跟踪过的文件暂存起来一并提交,跳过git add暂存步骤
可是这也会加入一些不须要的文件
若是只是从工做目录简单删除文件,运行git status时会在未暂存区看到他
咱们能够经过将已跟踪文件从暂存区移除,而后提交,使用git rm命令完成
将以前修改过或已经放到暂存区的文件删除,可使用强制删除,不可被修复,使用git rm -f
若是忘记使用.gitignore,不当心将一堆注释添加到暂存区可使用git rm --cached命令,后可接文件或目录的名字,也可使用glob模式
//删除全部名字以~结尾的文件
$ git rm \*~
//删除log/目录下扩展名为.log的全部文件
$ git rm log/\*.log
复制代码
若是在Git中发生了重名,他不会具体地显示是一次更名操做
若是要在Git中更名能够这样使用git mv
$ git mv file1_from file2_to
复制代码
他至关于将文件1移入文件2,而后删除原文件1,暂存文件2
$ mv README.md README
$ git rm README.md
$ git add README
复制代码
使用git log命令,会按时间顺序列出全部提交
$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 16:40:33 2008 -0700
removed unnecessary test
commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sat Mar 15 10:31:28 2008 -0700
first commit
复制代码
使用git log -p或git log -patch能够看到每次提交所引入的差别(即补丁),咱们可使用一些选项来限制显示日志数量,如-2只显示最近的两次提交
使用git log --stat能够看到每次提交的简略统计信息,好比全部被修改过的文件,有多少文件被修改以及哪些被修改文件是被移除或添加了
使用git log --pretty能够用其余风格展现提交历史,其内部还包含其余子选项, 好比 oneline 会将每一个提交放在一行显示
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
复制代码
使用git log --format定制记录的显示格式,输出的格式不会随着Git的更新而发生改变
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : changed the version number
085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
a11bef0 - Scott Chacon, 6 years ago : first commit
复制代码
%H--提交的完整哈希值
%h--提交的简写哈希值
%T--树的完整哈希值
%t--树的简写哈希值
%P--父提交的完整哈希值
%p--父提交的简写哈希值
%an--做者名字
%ae--做者的电子邮件地址
%ad--做者修订日期(能够用 --date=选项 来定制格式)
%ar--做者修订日期,按多久之前的方式显示
%cn--提交者的名字
%ce--提交者的电子邮件地址
%cd--提交日期
%cr--提交日期(距今多长时间)
%s--提交说明
-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(用来定义本身的格式)。
--oneline
--pretty=oneline --abbrev-commit 合用的简写。
就像上述过的-2选项,限制显示最新的两条更新
还有按时间做限制的选项,好比 --since 和 --until
//列出最近两周的全部的提交
$ git log --since=2.weeks
//列出具体某一天的提交
$ git log --since=2008-01-15
//列出一个相对日期的提交
$ git log --since="2 years 1 day 3 minutes ago"
复制代码
还有按指定条件做限制的提交
用 --author 选项显示指定做者的提交,用 --grep 选项搜索提交说明中的关键字。其中可指定多个 --author 和 --grep 为搜索条件,也能够添加 --all-match 输出全部匹配 --grep 模式的提交
-S 接收一串字符串参数,只会显示那些添加或删除了该字符串的提交
//寻找删除或添加了对某一个函数的引用的提交
$ git log -S function_name
复制代码
若是只关心某些文件或者目录的历史提交,能够在log选项后指定他们的路径,要记得用 -- 将前面选项和路径分开
-
仅显示最近的 n 条提交。
--since, --after
仅显示指定时间以后的提交。
--until, --before
仅显示指定时间以前的提交。
--author
仅显示做者匹配指定字符串的提交。
--committer
仅显示提交者匹配指定字符串的提交。
--grep
仅显示提交说明中包含指定字符串的提交。
-S
仅显示添加或删除内容匹配指定字符串的提交。
--no-merges能够将包含信息很少的提交合并起来,以避免弄乱历史记录