Git命令行
只要输入git,Git就会不带任何参数地列出它的选项和最常用的子命令。
要得到一个完整的git子命令列表,可以输入git help --all
-
显示版本号
git --version
每个git子命令的文档都可以通过使用git help subcommand、git --help subcommand或者git subcommand --help
创建初始版本库
创建初始版本库
在~/public_html目录创建你的个人网站,并把它放到Git版本库里。
$ mkdir ~/public_html
$ cd ~/public_html
$ echo 'My website is alive!' > index.html
执行git init,将~/public_html或者任何目录转化为Git版本库
$ git init
Initialiaed empty Git repository in .git/
Git不关系你是从一个完全空白的目录还是由一个装满文件的目录开始的。两种情况下,将目录转移到Git版本库的过程是一样的。
为了显示目录是要给Git版本库,git init命令创建了一个隐藏目录,在项目的顶层目录,名为.git。而CVS和SVN则将修订版本信息放在项目的每一个目录下的CVS和.svn子目录里。
~/public_html目录下的一切都保持不变。Git将这个目录当做项目的工作目录,隐藏在.git内的版本库由Git维护。
将文件添加到版本库中
git init命令创建一个新的Git版本库。最初,每个Git版本库都是空的。为了管理内容,你必须明确把它放入版本库中。这种有意识的步骤将重要文件与临时文件分离开来。
使用git add file将file添加到版本库中。
$ git add index.html
tips: 如果目录中已经有了很多文件,使用git add . 命令让Git把当前目录及子目录中的文件都添加到版本库里(参数"."、点活着UNIX说法中的"dot",是当前目录的简写)。
在add之后,Git知道index.html这个文件是要留在版本库里的。然而,到目前为止,Git还只是暂存(staged)了这个文件,这时提交之前的中间步骤。Git将add和commit这两部分开,以避免频繁变化。
运行 git status 命令,显示中间状态的 index.html
$ git status
# On branch master
# Initial commit
# Changes to be committed:
# (use "git rm --cached <file>..." to unstaged)
#
# new file: index.html
这个命令显示新文件 index.html 将在下一次提交的时候添加到版本库里。
除了目录和文件内容的实际变化,Git还会在每次提交的时候记录其他一些元数据,包括日志消息和做出本次变更的作者。一条完全限定的 git commit 命令必须提供日志消息和作者。
# 在git 1.8.3.1 版本无法在没有配置用户名和用户邮箱的情况下提交成功
$ git commit -m "Initial contents of public_html" \
--author="Jon Loeliger <jdl@example.com>"
Create initial commit 9da581b: Initial contents of public_html
1 files changed, 1 insertions(+), 0 deletions(-)
create mod 100644 index.html
在 git commit 期间让Git打开你最爱的编辑器,要设置你的GIT_EDITOR环境变量。
# 在tcsh中
$ setenv GIT_EDITOR emacs
# 在bash中
$ export GIT_EDITOR=vim
在把这次添加新文件提交到版本库后,git status 命令显示没有突出的、暂存的变更需要提交。
$ git status
# 在 master分支上
nothing to commit(working directory clean)
配置提交者
可以用 git config 命令在配置文件里保存你的身份。
# 使用 git config --global 则表示身份配置对所有项目生效
# 删除 --global 则表示身份配只对当前仓库生效
$ git config user.name "Tucci Luo"
$ git config user.email "uetucci@163.co"
也可以使用 GIT_AUTHOR_NAME 和 GIT_AUTHOR_EMAIL 环境变量来告诉 Git 你的姓名和email地址。这些变量一旦设置就会覆盖所有的配置设置。
再次提交
来提交一次对 index.html 文件的修改。打开这个文件,转换成 HTML 并保存。
$ cd ~/public_html
# 编辑 index.html 文件
# cat index.html
<html>
<body>
My web site is alive!
</body>
</html>
$ git commit index.html
因为这个文件已添加到版本库里里,没有必要再把这个文件告诉索引;此在,当在命令行里直接提交一个命名的文件时,文件的变更会自动捕捉!而使用没有命名文件的一般 git commit 就不会在这种情况下起作用。
当你的编辑器出现时,输入一条提交记录,"Convert to HTML",然后推出编辑器。现在版本库里有两个版本的 index.html了。
Convert to HTML
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# Explicit paths specified without -i nor -o; assuming --only paths...
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# modified: index.html
#
查看提交
git log 命令会产生版本库里一系列单独提交的历史
$ git log
commit a5e8a114098e5144861fa9642ebc90a29abf0d66
Author: Tucci Luo <uetucci@163.com>
Date: Wed Dec 20 22:00:43 2017 +0800
Convert to HTML
commit 55e68997f60fc626ad37205c12aac818d98bbcbd
Author: Tucci Luo <uetucci@163.com>
Date: Wed Dec 20 21:49:32 2017 +0800
Initial contents of public_html
条目按照从最新到最老的顺序罗列出来;每个条目显示了提交作者的名字和 email 地址,提交日期,变更的日志信息和提交的内部识别码。
为了查看特定提交的更加详细的信息,可以使用 git show 命令带一个提交码。
git show 55e68997f60fc626ad37205c12aac818d98bbcbd
commit 55e68997f60fc626ad37205c12aac818d98bbcbd
Author: Tucci Luo <uetucci@163.com>
Date: Wed Dec 20 21:49:32 2017 +0800
Initial contents of public_html
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..34217e9
--- /dev/null
+++ b/index.html
@@ -0,0 +1 @@
+My website is alive!
如果在执行 git show 命令的时候没有显示指定提交码,它将只显示最近一次提交的详细信息。
另一种查看方式是使用 show-branch,提交当前开发分枝简介的但航摘要。
$ git show-branch --more=10
[master] Convert to HTML
[master^] Initial contents of public_html
参数"--more=10"表示额外10个版本(在默认显示一个基础的上在多显示10个),master这个名字是默认的分支名。
查看提交差异
为了查看 index.html 的两个版本之间的差异,使用两个提交的全 ID 名并且运行 git diff。
$ git diff 55e68997f60fc626ad37205c12aac818d98bbcbd \
a5e8a114098e5144861fa9642ebc90a29abf0d66
diff --git a/index.html b/index.html
index 34217e9..8638631 100644
--- a/index.html
+++ b/index.html
@@ -1 +1,5 @@
+<html>
+<body>
My website is alive!
+</body>
+</html>
按照惯例,名为 55e68997f60fc626ad37205c12aac818d98bbcbd 的第一次修订版本是早起版本,名为 a5e8a114098e5144861fa9642ebc90a29abf0d66 的第二次修订版本是较新的版本。因为,每行新内容前面都有一个加号(+)。
版本库内文件的删除和重命名
从版本库里删除一个文件与添加一个文件是类似的,除了使用的命令是 git rm 。 假设在你的网站里有一个不再需要的文件:poem.html,你可以这样做。
$ cd ~/public_html
# ls
index.html poem.html
$ git rm poem.html
rm 'poem.html'
$ git commit -m "Remove a poem"
[master 451bd56] Remove a poem
1 file changed, 1 deletion(-)
delete mode 100644 poem.html
和添加操作一样,删除操作也需要两步: git rm 表示你想要删除这个文件的意图并暂存这个变更,接着 git commit 在版本库里实现这个变更。同样,可以省略 -m 选项,然后在你最喜欢的文件编辑器中以交互方式输入日志消息。
可以通过git rm 和 git add 组合命令来间接为一个文件重命名,也可以更快而直接地通过 git mv命令来做到。这里是前者的一个例子。
$ mv foo.html bar.html
$ git rm foo.html
rm 'foo.html'
$ git add .bar.html
在这个序列里,必须先执行 mv foo.html bar.html,以防 git rm 命令会把 foo.html 从文件系统中永久删除
这是使用 git mv 的相同操作
git mv foo.html bar.html
在任一情况下,暂存的变更必须随后进行提交。
git commit -m "Moved foo to bar"
Create commit 8805821: Moved foo to bar
1 filles changed, 0 insertions(+), 0 deletions(-)
rename foo.html => bar.html (100%)
Git 在对文件的移动操作上鱼与其他同类系统不同,它利用一个基于两个文件版本内容相似度的机制。
创建版本库副本
如果按照上述步骤操作,并且在 ~/public_html 目录中已经建立了一个初始版本库,就可以通过 git clone 命令创建一个完整的副本,或叫克隆。
在主目录里建立一个副本,并命名为my_website
$ cd ~
$ git clone public_html my_website
虽然这个两个 Git 版本库现在包含相同的对象、文件和目录,但是还有一些细微的差别。如果你想要探索其中的不同之处,可以使用一下这些命令。
$ ls -lsa public_html my_website
$ diff -r public_html my_website
在这样的一个本地文件系统中,使用 git clone 命令来创建一个版本库副本和使用 cp -a 或 rsync 非常相似。但是,Git 支持一组丰富的版本库源,包括网络名。
一旦复制了一个版本库,就有修改这个复制版本、做出新的提交、查看它的日志和历史等。这是一个有着完整历史等版本库。
配置文件
Git 的配置文件全都是简单的.ini文件风格的文本文件。
Git支持不同层次的配置文件。按照优先级递减的顺序,它们如下所示。
.git/config
版本库特定的配置设置,可用 --file 选项修改,是默认选项。这些设置拥有最高优先级。
~/.gitconfig
用户特定的配置设置,可用 --global 选项修改。
/etc/gitconfig
这是系统范围的配置设置,如果你有它的UNIX文件写权限,你就可以用 --system 选项修改它。这些设置的优先级最低
例如,要建立一个作者名和 email 地址,用于你对所有版本库的所有提交,可以用 git config --global 命令给在 $HOMT=E/.gitonfig 文件里的 user.name 和 user.email 赋值。
$ git config --global user.name "Jon Loeliger"
$ git config --global user.email "Jdl@example.com"
或者,为了设置一个版本库特丁的名字和 email 地址,覆盖 --global 的设置,只需要省略 --global 标志。
$ git config user.name "Jon Loeliger"
$ git config user.email "jdl@special-project.example.com"
使用 git config -l 列出在整组配置文件里共同查找的所有变量的设置值。
# 新建一个空版本库
$ mkdir /tmp/new
$ cd /tmp/new
$ git init
# 设置一些配置值
$ git config --global user.name "Jon Loeliger"
$ git config --global user.email "jdl@example.com"
$ git config user.email "jdl@special-project.example.com"
$ git config -l
user.name=Jon Loeliger
user.email=jdl@example.com
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
user.email=jdl@special-project.example.com
因为配置文件只是简单的文本文件,所以可以通过cat命令来查看其内容。也可以通过你最喜欢的文件编辑器来编辑它。
可以使用 --unset 选项来移除设置。
$ git config --unset --global user.email
配置别名
如果你经常输入一条常用而复杂的 Git 命令,可以考虑为它设置一个简单的 Git 别名。
$ git config --global alias.show-gragh \
'log --graph --abbrev-commit --pretty=nonline'