本笔记是阅读《git pro》所写,仅供参考。
《git pro》网址https://git-scm.com/book/en/v2
git官网 https://git-scm.com/
一、git起步
1.1、检查配置信息
git config --list
查看所有的配置以及它们所在的文件
git config --list --show-origin
可能有重复的变量名,因为 Git 会从不同的文件中读取同一个配置(例如:/etc/gitconfig与~/.gitconfig)。 这种情况下,Git 会使用它找到的每一个变量的最后一个配置。
你可以通过输入 git config <key>:来检查 Git 的某一项配配置
1.2、提交用户名
git config --global user.name "John Doe"
提交邮箱
git config --global user.email johndoe@example.com
说明:
如果使用了 --global 选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事
情, Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运
行没有 --global 选项的命令来配置。
1.3、配置默认文本编辑器
git config --global core.editor emacs
在 Windows 系统上,必须指定可执行文件的完整路径
git config --global core.editor "'C:/ProgramFiles/Notepad++/notepad++.exe' -multiInst -notabbar -nosession -noPlugin"
1.4、获取帮助,三种方式
git help <verb>
git <verb> --help
man git-<verb>
git help
二、git基础
通常有两种获取 Git 项目仓库的方式:
1、将尚未进行版本控制的本地目录转换为 Git 仓库;
2、从其它服务器 克隆一个已存在的 Git 仓库。
2.1、git添加一个尚未进行版本控制的项目目录
进入尚未进行版本控制的项目目录,执行 git init
git init
该命令将会创建一个 .git
的子目录,这个子目录含有初始化的Git仓库中所有的必须文件,这些文件是Git的骨干。
2.2、git clone 克隆现有的仓库
git clone
命令可以获取已有仓库的拷贝,Git 克隆的是该 Git 仓库服务
器上的几乎所有数据,而不是仅仅复制完成你的工作所需要文件。 当你执行 git clone 命令的时候,默认配置
下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。事实上,如果你的服务器的磁盘坏掉了,你通常
可以使用任何一个克隆下来的用户端来重建服务器上的仓库 (虽然可能会丢失某些服务器端的钩子(hook)设
置,但是所有版本的数据仍在)
克隆仓库的命令是
git clone <url>
克隆仓库并重命名
git clone <url> <my_project_name>
2.3、记录每次更新到仓库
刚才有了一个真实项目的Git仓库, 并从这个仓库中检出了所有文件的工作副本。当对文件进行修改时,想要记录时,应该将其提交到仓库。
工作目录下的所有文件只有俩总状态:已跟踪和未跟踪。已跟踪的文件是指那些被纳入版本控制的文件,再上一次快照中有它们的记录,在工作一段时间后,它们的状态有可能是已修改、未修改或者已放入暂存区。简而言之,已跟踪就是Git已经知道的文件。
工作目录中除已跟踪外的其它文件都属于未跟踪文件,他们既不存在于上次的快照记录中,也没有被放入暂存区。初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,并处于未修改状态,因为Git刚刚检出他们,而你并未编辑过他们。
编辑过某些文件之后,由于上次提交后对它们做了修改,Git将它们标记为已修改文件。在工作时,可以选择性的将这些修改过的文件放入暂存区,然后提交所有已暂存的修改,反复如此。
2.4、检查当前文件状态
可以用 git status
命令查看文件处于什么状态
查看目录下所有文件状态
git status
查看单个文件或者目录
git status <filename>
这说明有该文件在暂存区。
这说明你现在的工作目录相当干净。换句话说,所有已跟踪文件在上次提交后都未被更改过。 此外,上面的信息还表明,当前目录下没有出现任何处于未跟踪状态的新文件,否则 Git 会在这里列出来。 最后,该命令还显示了当前所在分支,并告诉你这个分支同远程服务器上对应的分支没有偏离。 现在,分支名是“master”,这是默认的分支名。
使用 git status -s 命令或 git status --short 命令,你将得到一种格式更为紧凑的输出。
git status -s
git status --short
在项目下创建一个新的 README 文件。 如果之前并不存在这个文件,使用 git status 命令,你将看到一个新的未跟踪文件:
echo 'My Project' > README
git status
在状态报告中可以看到新建的 README 文件出现在 Untracked files(未跟踪的文件) 下面。 未跟踪的文件意味着 Git 在之前的快照(提交)中没有这些文件;Git 不会自动将之纳入跟踪范围,除非你明明白白地告诉它“我需要跟踪该文件”。
2.5、跟踪新文件
使用命令 git add
开始跟踪一个文件 。命令格式
git add <filename>
git add 命令使用文件或目录的路径作为参数;如果参
数是目录的路径,该命令将递归地跟踪该目录下的所有文件。可以用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。 将这个命令理解为“精确地将内容添加到下一次提交中”而不是“将一个文件添加到项目中”要更加合适。
跟踪文件README,并查看文件状态,文件状态显示已跟踪并处于暂存状态
只要在 要提交的变更(Changes to be committed )这行下面的,就说明是已暂存状态。 如果此时提交,那么该文件在你运
行 git add 时的版本将被留存在后续的历史记录中。
2.5、暂存已修改的文件
修改已跟踪的文件,并提交文件。打开一个文件并修改,使用git status
查看。
使用 git add添加到暂存区,就可以commit。
如果将文件放入暂存区又修改后,git status,该文件会同时出现在在暂存区和非暂存区。Git 只
会暂存了运行 git add 命令时的版本。如果commit,只会运行最后一次git add的版本而不是最后修改的版本。所以修改完文件以后,需要及时git add 把最新版本重新暂存起来。
2.6、忽略文件
如果文件不想被Git管理又不想出现未跟踪文件列表。可以创建一个名 .gitignore
的文件。文件 .gitignore 的格式规范如下:
• 所有空行或者以 # 开头的行都会被 Git 忽略。
• 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
• 匹配模式可以以(/)开头防止递归。
• 匹配模式可以以(/)结尾指定目录。
• 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反。
示例如下:
touch .gitignore
vi .gitignore
在 .gitignore
加入被忽略的文件,支持 #开头注释以及正则表达式。
#过滤编译文件 .out
*.out
#过滤以 .o .a 结尾的文件
*.[oa
2.7、查看已暂存和未暂存的修改
git diff 能通过文件补丁的格式更加具体地显示哪些行发生了改变。看出当前做的哪些更新尚未暂存? 有哪些更新已暂存并准备好下次提交?
git diff
若要查看已暂存的将要添加到下次提交里的内容,可以用 git diff --staged 命令。 这条命令将比对已暂存文件与最后一次提交的文件差异:
git diff --staged
注意,git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件,运行 git diff 后却什么也没有,就是这个原因。
然后用 git diff --cached 查看已经暂存起来的变化
git diff --cached
2.8、提交更新
如果暂存区已经准备就绪,那么就可以提交。建议提交前使用 git status
查看文件状态然后再运行命令 git commit
提交文件。
git status
git commit
这样会启动你选择的文本编辑器来输入提交说明(我的是VIM 模式)
git commit 参数
-m 将提交信息与命令放在同一行
git commit -m "增加文件"
-a 跳过使用暂存区域,不经过git add直接提交
git commit -a
2.9、 移除文件
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。可以用 git rm 命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。
git rm 文件名
下一次提交时,该文件就不再纳入版本管理了。 如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f(译注:即 force 的首字母)。 这是一种安全特性,用于防止误删尚未添加到快照的数据,这样的数据不能被 Git 恢复。
不要直接使用系统命令删除文件,这样会有一点问题。如果删除可以使用git restore 恢复文件。
2.10、移动文件
Git 并不显式跟踪文件移动操作。 如果在 Git 中重命名了某个文件,仓库中存储的元数据并不会体现出这是一次改名操作。 不过 Git 非常聪明,它会推断出究竟发生了什么。
在 Git 中对文件改名,可以这么做:
git mv file_from file_to
运行 git mv 就相当于运行了下面三条命令
mv filterHalf.c filterHalf1.c
git rm filterHalf.c
git add filterHalf1.c
2.11、查看提交历史 git log
在提交了若干更新,又或者克隆了某个项目之后,可以使用git log
查看历史。
git log
-p 或 --patch 它会显示每次提交所引入的差异(按 补丁 的格式输出),后面可以加数字,例如:-2,显示前俩条。
--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 合用的简写。
不传入任何参数的默认情况下,git log 会按时间先后顺序列出所有的提交,最近的更新排在最上面。 这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
git log 参数:
-p 或 --patch ,它会显示每次提交所引入的差异(按 补丁 的格式输出)。 你也可以限制显示的日志条目数量,例如使用 -2 选项来只显示最近的两次提交:
查看每次提交的简略统计信息,可以使用 --stat 选项:
--pretty。 这个选项可以使用不同于默认格式的方式展示提交历史。 这个选项有一些内建的子选项供你使用。 比如 oneline 会将每个提交放在一行显示,在浏览大量的提交时非常有用。 另外还有 short,full 和 fuller 选项,它们展示信息的格式基本一致,但是详尽程度不一:
git log --pretty=oneline
pretty的 format ,可以定制记录的显示格式。git log --pretty=format 常用的选项 列出了 format 接受的常用格式占位符的写法及其代表的意义。
选项 | 说明 |
---|---|
%H | 提交的完整哈希值 |
%h | 提交的简写哈希值 |
%T | 树的完整哈希值 |
%t | 树的简写哈希值 |
%P | 父提交的完整哈希值 |
%p | 父提交的简写哈希值 |
%an | 作者名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 --date=选项 来定制格式) |
%cn | 提交者的名字 |
%ce | 提交者的电子邮件地址 |
%cd | 提交日期 |
%cr | 提交日期(距今多长时间) |
%s | 提交说明 |
git log --pretty=format:"%h - %an, %ar : %s"
当 oneline 或 format 与另一个 log 选项 --graph 结合使用时尤其有用。 这个选项添加了一些 ASCII 字符串来形象地展示你的分支、合并历史:
git log --pretty=format:"%h %s" --graph
git log 限制输出长度
选项 | 说明 |
---|---|
-<n> | 仅显示最近的 n 条提交 |
–since, --after | 仅显示指定时间之后的提交。 |
–until, --before | 仅显示指定时间之前的提交。 |
–committer | 仅显示提交者匹配指定字符串的提交。 |
–grep | 仅显示提交说明中包含指定字符串的提交。 |
-S | 仅显示添加或删除内容匹配指定字符串的提交。 |
2.12、撤消操作
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend 选项的提交命令来重新提交:
git commit --amend
这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令), 那么快照会保持不变,而你所修改的只是提交信息。
2.13、取消暂存的文件
如果一次git add多个文件,其中某个文件想要取消暂存,可以使用
git reset HEAD <file>…
2.14、撤消对文件的修改
修改完文件后或者在电脑删除文件后想要恢复(不是使用git rm),git status会提示怎么做。
git restore -- <file>
是一个危险的命令。 你对那个文件在本地的任何修改都会消失——Git 会用最近提交的版本覆盖掉它。 除非你确实清楚不想要对那个文件的本地修改了,否则请不要使用这个命令。也可以使用git checkout -- <file>
2.15远程仓库的使用
远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。 管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。
查看远程仓库
查看你已经配置的远程仓库服务器,可以运行 git remote 命令。 它会列出你指定的每一个远程服务器的简写。
git remote
-v,会显示需要读写远程仓库使用的 Git 保存的简写与其对应的URL。
添加远程仓库
运行 git remote add <shortname> <url>
添加一个新的远程 Git 仓库,同时指定一个方便
使用的简写:
git remote add <shortname> <url>
现在你可以在命令行中使用字符串 shortname 来代替整个 URL。 例如,如果你想拉取 url(远程仓库) 的仓库中有但你没有的信息,可以运行 git fetch <shortname>
。
从远程仓库中抓取与拉取
从远程仓库中获得数据命令
git fetch <remote>
这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所
以,git fetch origin 会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch 命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
推送到远程仓库
分享项目时,必须将其推送到上游,命令:
git push <remote> <branch>
查看某个远程仓库
如果想要查看某一个远程仓库的更多信息,可以使用命令:
git remote show <remote>
它同样会列出远程仓库的 URL 与跟踪分支的信息。 这些信息非常有用,它告诉你正处于 master 分支,并且如果运行 git pull, 就会抓取所有的远程引用,然后将远程 master 分支合并到本地 master 分支。 它也会列出拉取到的所有远程引用。
远程仓库的重命名与移除
修改一个远程仓库的简写名:
git remote rename oldname newname
移除一个远程仓库——你已经从服务器上搬走了或不再想使用某一个特定的镜像了, 又或者某一个贡献者不再贡献了——可以使用命令
git remote remove 仓库名
git remote rm 仓库名
一旦你使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。