Git是什么?
git是一个版本控制系统。其它的版本控制系统: CVS、Subversion (SVN)或 Perforce。
git的三种状态
已提交(committed)、已修改(modified) 和 已暂存(staged)。
-
已修改表示修改了文件,但还没保存到数据库中。
-
已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
-
已提交表示数据已经安全地保存在本地数据库中。
这会让我们的 Git 项目拥有三个阶段:工作区、暂存区以及 Git 目录。
工作区是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。
暂存区是一个文件,保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。 按照 Git 的术语叫做“索引”,不过一般说法还是叫“暂存区”。
Git 仓库目录是 Git 用来保存项目的元数据和对象数据库的地方。 这是 Git 中最重要的部分,从其它计算机克隆仓库时,复制的就是这里的数据。
基本的 Git 工作流程如下:
-
在工作区中修改文件。
-
将你想要下次提交的更改选择性地暂存,这样只会将更改的部分添加到暂存区。
-
提交更新,找到暂存区的文件,将快照永久性存储到 Git 目录。
如果 Git 目录中保存着特定版本的文件,就属于 已提交 状态。 如果文件已修改并放入暂存区,就属于 已暂存 状态。 如果自上次检出后,作了修改但还没有放到暂存区域,就是 已修改 状态。
初次运行Git前的配置
Git 自带一个git config
的工具来帮助设置控制 Git 外观和行为的配置变量。 这些变量存储在三个不同的位置:
/etc/gitconfig
文件: 包含系统上每一个用户及他们仓库的通用配置。 如果在执行git config
时带上--system
选项,那么它就会读写该文件中的配置变量。 (由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。)~/.gitconfig
或~/.config/git/config
文件:只针对当前用户。 你可以传递--global
选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效。- 当前使用仓库的 Git 目录中的
config
文件(即.git/config
):针对该仓库。 你可以传递--local
选项让 Git 强制读写此文件,虽然默认情况下用的就是它。。 (当然,你需要进入某个 Git 仓库中才能让该选项生效。)
.git/config
的配置变量会覆盖 /etc/gitconfig
中的配置变量。查看所用配置及他们所在的文件夹
git config --list --show-origin
git config --list(检查配置信息)
用户信息
安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改:
git config --global user.name
git config --global user.email
如果使用了--global
选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情,Git 都会使用那些信息。当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有--global
选项的命令来配置。
文本编辑器
如果想使用不同的文本编辑器,例如Emacs:
git config --global core.editor emacs
git config <key> :检查Git的某一项配置
获取帮助
git help <verb>
git <verb> --help
man git-<verb>
获得 git config
命令的手册,执行:
git help config
获取Git
获取Git仓库:
-
将尚未进行版本控制的本地目录转换为 Git 仓库;
-
从其它服务器克隆 一个已存在的 Git 仓库。
在已存在目录中初始化仓库
如果有一个尚未进行版本控制的项目目录,想要用Git来控制它,首先要进入该项目目录
在Linux上:
cd /home/user/my_project
在macOs上:
cd /Users/user/my_project
在windows上:
cd /c/user/my_project
之后执行:
git init
该命令将创建一个名为 .git
的子目录,这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的骨干。 但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪。
如果在一个已存在文件的文件夹(而非空文件夹)中进行版本控制,你应该开始追踪这些文件并进行初始提交。 可以通过
git add
命令来指定所需的文件来进行追踪,然后执行 git commit
git add *.c
git add LICENSE
git commit -m 'initial project version'
克隆现有的仓库
git clone https://github.com/libgit2/libgit2
记录每次更新到仓库
每一个文件的两种状态:已跟踪 或 未跟踪。
检查当前文件状态
git status
如果显示为
则所有已跟踪文件在上次提交后都未被更改过,也说明当前目录下没有出现任何处于未跟踪状态的新文件,否则 Git 会在这里列出来。
跟踪新文件
git add
只要在 Changes to be committed
这行下面的,就说明是已暂存状态。 如果此时提交,那么该文件在你运行 git add
时的版本将被留存在后续的历史记录中。
暂存已修改的文件
如果修改了一个 的已被跟踪的文件,然后运行 git status
命令,会看到下面内容
只要在 Changes not staged commit
这行下面的,说明已跟踪文件的内容发生了变化,但还没有放到暂存区。 要暂存这次更新,需要运行 git add
命令。这是个多功能命令:可以用它开始跟踪新文件,或者把
已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等。
状态简览
git status -s
git status --short
??
:新添加的未跟踪文件
A
:新添加到暂存区中的文件
M
:修改过的文件前面有标记
忽略文件
创建一个名为 .gitignore
的文件,列出要忽略的文件的模式。
*. Git 忽略所有以 .o
或 .a
结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的。*~ Git 忽略所有名字以波浪符(~)结尾的文件,许多文本编辑软件(比如 Emacs)都用这样的文件名保存副本。 此外,你
可能还需要忽略 log,tmp 或者 pid 目录,以及自动生成的文档等等。
文件 .gitignore
的格式规范:
-
所有空行或者以
#
开头的行都会被 Git 忽略。 -
可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
-
匹配模式可以以(
/
)开头防止递归。 -
匹配模式可以以(
/
)结尾指定目录。 -
要忽略指定模式以外的文件或目录,可以在模式前加上叹号(
!
)取反。
查看已暂存和未暂存的修改
git diff
此命令比较的是工作目录中当前文件和暂存区域快照之间的差异。 也就是修改之后还没有暂存起来的变化内容
git diff --staged
此命令是查看已暂存的将要添加到下次提交里的内容, 这条命令将比对已暂存文件与最后一次提交的文件差异
提交更新
每次准备提交前,先用 git status
看下,你所需要的文件是不是都已暂存起来了, 然后再运行提交命令
git commit
这样会启动你选择的文本编辑器来输入提交说明,编辑器会显示类似下面的文本信息:
更详细的内容修改提示可以用 git commit -v
选项查看,这会将你所作的更改的 diff 输出呈现在编辑器中,以便让你知道本次提交具体作出哪些修改。
你也可以在 commit
命令后添加 -m
选项,将提交信息与命令放在同一行,如下所示
跳过使用暂存区域
git commit
-a
Git 就会自动把所有已经跟踪过的文件暂存起来一并提交,从而跳过 git add
步骤
移除文件
git rm
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。 可以用 git rm
命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。
如果只是简单地从工作目录中手工删除文件,运行 git status
时就会在 “Changes not staged for commit” 部分(也就是 未暂存清单)看到:
然后再运行 git rm
记录此次移除文件的操作:
删除之前修改过或已经放到暂存区的文件
git rm
-f
让文件保留在磁盘,但是并不想让 Git 继续跟踪
git rm --cached
移动文件
git mv
其实,运行 git mv
就相当于运行了下面三条命令:
查看提交历史
git log
不传入任何参数的默认情况下,git log
会按时间先后顺序列出所有的提交,最近的更新排在最上面。 正如你所看到的,这个命令会列出每个提交的 SHA-1 校验和、作者的名字和电子邮件地址、提交时间以及提交说明。
git log -p
或 --patch
显示每次提交所引入的差异(按补丁的格式输出)
git log -p -2(显示最近的两次提交)
git log --stat 提交的简略统计信息
git log --pretty
=format:"%h - %an, %ar : %s" 可以定制记录的显示格式。 这样的输出对后期提取分析格外有用——因为你知道输出的格式不会随着 Git 的更新而发生改变:
当 oneline
或 format
与另一个 log
选项 --graph
结合使用时尤其有用 这个选项添加了一些 ASCII 字符串来形象地展示你的分支、合并历史
限制输出长度
git log --since=2.weeks
还可以过滤出匹配指定条件的提交。 用 --author
选项显示指定作者的提交,用 --grep
选项搜索提交说明中的关键字。
git log -S 它接受一个字符串参数,并且只会显示那些添加或删除了该字符串的提交
撤消操作
有时候我们提交完了才发现漏掉了几个文件没有添加,或者提交信息写错了。 此时,可以运行带有 --amend
选项的提交命令来重新提交:
git commit --amend 将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令),那么快照会保持不变,而你所修改的只是提交信息。
取消暂存的文件
git reset
撤消对文件的修改
git checkout
最新版的撤销命令
git restore --staged
远程仓库的使用
查看远程仓库
git remote
git remote -v 显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL 如果你的远程仓库不止一个,该命令会将它们全部列出。
添加远程仓库
git remote add <shortname> <url>
从远程仓库中抓取与拉取
git fetch <remote>
推送到远程仓库
git push origin master
查看某个远程仓库
git remote show origin
远程仓库的重命名与移除
git remote rename
git remote remove paul
附:
如何生成SSH KEY 和 查看SSH KEY
检查本地是否有SSH Key存在
ls -al ~/.ssh
生成新的SSH key
ssh-keygen -t rsa -C "your_email@example.com"
查看SSH Key
进入 .ssh 目录
cd ~/.ssh
查看公钥
cat id_rsa.pub 或者 vim id_rsa.pub