赞
踩
内容来自Git官网,本文做学习记录,更多了解请见官网git-book
Git 自带一个 git config
的工具来帮助设置控制 Git 外观和行为的配置变量。
你可以通过以下命令查看所有的配置以及它们所在的文件:
$ git config --list --show-origin
安装完 Git 之后,要做的第一件事就是设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改:
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com
再次强调,如果使用了 --global
选项,那么该命令只需要运行一次,因为之后无论你在该系统上做任何事情, Git 都会使用那些信息。 当你想针对特定项目使用不同的用户名称与邮件地址时,可以在那个项目目录下运行没有 --global
选项的命令来配置。
我们展示了如何创建可以展开为长选项序列的短命令,以便你不用每次都输入它们。
通过 git config
文件来轻松地为每一个命令设置一个别名。 这里有一些例子你可以试试:
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
执行 git pull
命令时,使用此命令来将 --rebase
作为默认选项。
如果你习惯使用 git pull
,同时又希望默认使用选项 --rebase
,你可以执行这条语句 git config --global pull.rebase true
来更改 pull.rebase
的默认配置。
HTTP 协议每一个连接都是需要用户名和密码的。 这在使用双重认证的情况下会更麻烦,因为你需要输入一个随机生成并且毫无规律的 token 作为密码。
我们使用它来为你的 HTTP 密码设置一个默认的存储区域。
Git 拥有一个凭证系统来处理这个事情。 下面有一些 Git 的选项:
设置 Git 的配置来选择上述的一种方式
$ git config --global credential.helper cache
git help
命令用来显示任何命令的 Git 自带文档。 但是我们仅会在此附录中提到大部分最常用的命令,对于每一个命令的完整的可选项及标志列表,你可以随时运行 git help <command>
命令来了解。
要了解更多有关自定义 shell 的信息,请运行 git help shell
。
你只需要简单地运行 git init
就可以将一个目录转变成一个 Git 仓库,这样你就可以开始对它进行版本管理了。
git clone
实际上是一个封装了其他几个命令的命令。 它创建了一个新目录,切换到新的目录,然后 git init
来初始化一个空的 Git 仓库, 然后为你指定的 URL 添加一个(默认名称为 origin
的)远程仓库(git remote add
),再针对远程仓库执行 git fetch
,最后通过 git checkout
将远程仓库的最新提交检出到本地的工作目录。
git add
命令将内容从工作目录添加到暂存区(或称为索引(index)区),以备下次提交。 当 git commit
命令执行时,默认情况下它只会检查暂存区域,因此 git add
是用来确定下一次提交时快照的样子的。
git status
命令会显示工作区及暂存区域中不同状态的文件。 其中包含了已修改但未暂存,或已经暂存但没有提交的文件。 在一般的显示形式中,它会给你一些如何在这些暂存区之间移动文件的提示。
当需要查看任意两棵树的差异时,可以使用 git diff
命令。 此命令可以查看你工作环境与你的暂存区的差异(git diff
默认的做法),你暂存区域与你最后提交之间的差异(git diff --staged
),或者比较两个提交记录的差异(git diff master branchB
)。
使用 --check
选项来检查可能存在的空白字符问题。
使用 -b
选项来过滤掉空白字符的差异,及通过 --theirs
、--ours
和 --base
选项来比较不同暂存区冲突文件的差异。
使用此命令合 --submodule
选项来有效地比较子模块的变化。
当你不想使用内置的 git diff
命令时。git difftool
可以用来简单地启动一个外部工具来为你展示两棵树之间的差异。
git commit
命令将所有通过 git add
暂存的文件内容在数据库中创建一个持久的快照,然后将当前分支上的分支指针移到其之上。
使用 -a
标志来跳过 git add
这一步,及如何使用 -m
标志通过命令行而不启动一个编辑器来传递提交信息。
使用 --amend
选项来重做最后的提交。
使用 -S
标志来为提交签名加密。
git reset
命令主要用来根据你传递给动作的参数来执行撤销操作。 它可以移动 HEAD
指针并且可选的改变 index
或者暂存区,如果你使用 --hard
参数的话你甚至可以改变工作区。 如果错误地为这个命令附加后面的参数,你可能会丢失你的工作,所以在使用前你要确定你已经完全理解了它。
我们使用 git reset --hard
来取消一个合并,同时我们也使用了 git merge --abort
命令,它是 git reset
的一个简单的封装。
git rm
是 Git 用来从工作区,或者暂存区移除文件的命令。 在为下一次提交暂存一个移除操作上,它与 git add
有一点类似。
用 --cached
选项来只移除暂存区域的文件但是保留工作区的文件。
要从 Git 中移除某个文件,就必须要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),然后提交。 可以用 git rm
命令完成此项工作,并连带从工作目录中删除指定的文件,这样以后就不会出现在未跟踪文件清单中了。
如果只是简单地从工作目录中手工删除文件,运行 git status
时就会在 “Changes not staged for commit” 部分(也就是 未暂存清单)看到:
$ rm PROJECTS.md
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: PROJECTS.md
no changes added to commit (use "git add" and/or "git commit -a")
然后再运行 git rm
记录此次移除文件的操作:
$ git rm PROJECTS.md
rm 'PROJECTS.md'
$ 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)
deleted: PROJECTS.md
下一次提交时,该文件就不再纳入版本管理了。 如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f
(译注:即 force 的首字母)。 这是一种安全特性,用于防止误删尚未添加到快照的数据,这样的数据不能被 Git 恢复。
另外一种情况是,我们想把文件从 Git 仓库中删除(亦即从暂存区域移除),但仍然希望保留在当前工作目录中。 换句话说,你想让文件保留在磁盘,但是并不想让 Git 继续跟踪。 当你忘记添加 .gitignore
文件,不小心把一个很大的日志文件或一堆 .a
这样的编译生成文件添加到暂存区时,这一做法尤其有用。 为达到这一目的,使用 --cached
选项:
$ git rm --cached README
git rm
命令后面可以列出文件或者目录的名字,也可以使用 glob
模式。比如:
$ git rm log/\*.log
注意到星号 *
之前的反斜杠 \
, 因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开。 此命令删除 log/
目录下扩展名为 .log
的所有文件。 类似的比如:
$ git rm \*~
该命令会删除所有名字以 ~
结尾的文件。
git mv
命令是一个便利命令,用于移到一个文件并且在新文件上执行git add
命令及在老文件上执行git rm
命令。
要在 Git 中对文件改名,可以这么做:
$ git mv file_from file_to
其实,运行 git mv
就相当于运行了下面三条命令:
$ mv README.md README
$ git rm README.md
$ git add README
git clean
是一个用来从工作区中移除不想要的文件的命令。 可以是编译的临时文件或者合并冲突的文件。
可以使用 git clean
命令去除冗余文件或者清理工作目录。 使用 git clean -f -d
命令来移除工作目录中所有未追踪的文件以及空的子目录。
如果只是想要看看它会做什么,可以使用 --dry-run
或 -n
选项来运行命令, 这意味着“做一次演习然后告诉你 将要 移除什么”。
$ git clean -d -n
Would remove test.o
Would remove tmp/
默认情况下,git clean
命令只会移除没有忽略的未跟踪文件。 任何与 .gitignore
或其他忽略文件中的模式匹配的文件都不会被移除。 如果你也想要移除那些文件,例如为了做一次完全干净的构建而移除所有由构建生成的 .o
文件, 可以给 clean 命令增加一个 -x
选项。
$ git status -s
M lib/simplegit.rb
?? build.TMP
?? tmp/
$ git clean -n -d
Would remove build.TMP
Would remove tmp/
$ git clean -n -d -x
Would remove build.TMP
Would remove test.o
Would remove tmp/
git branch
命令实际上是某种程度上的分支管理工具。 它可以列出你所有的分支、创建新分支、删除分支及重命名分支。
查看当前所在分支
git branch
删除分支
本地删除
git branch -d 分支
远程删除使用push 见push命令
创建一个 testing 分支, 你需要使用 git branch
命令:
$ git branch testing
git checkout
命令用来切换分支,或者检出内容到工作目录。
要切换到一个已存在的分支,你需要使用 git checkout
命令。 我们现在切换到新创建的 testing
分支去:
$ git checkout testing
这样 HEAD
就指向 testing
分支了。
使用 --track
标志来开始跟踪分支。
用此命令和 --conflict=diff3
来重新介绍文件冲突。
相当于git checkout
git merge
工具用来合并一个或者多个分支到你已经检出的分支中。 然后它将当前分支指针移动到合并结果上。
将 hotfix
分支合并回你的 master
分支来部署到线上。 你可以使用 git merge
命令来达到上述目的:
$ git checkout master
$ git merge hotfix
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
1 file changed, 2 insertions(+)
但是 merge
命令只有几个变种,一般只是 git merge <branch>
带上一个你想合并进来的一个分支名称。
git log
命令用来展示一个项目的可达历史记录,从最近的提交快照起。 默认情况下,它只显示你当前所在分支的历史记录,但是可以显示不同的甚至多个头记录或分支以供遍历。 此命令通常也用来在提交记录级别显示两个或多个分支之间的差异。
-p
和 --stat
选项来了解每一个提交引入的变更,及使用--pretty
和 --online
选项来查看简洁的历史记录。
git stash
命令用来临时地保存一些还没有提交的工作,以便在分支上不需要提交未完成工作就可以清理工作目录。
git tag
命令用来为代码历史记录中的某一个点指定一个永久的书签。 一般来说它用于发布相关事项。
Git 支持两种标签:轻量标签(lightweight)与附注标签(annotated)。
轻量标签很像一个不会改变的分支——它只是某个特定提交的引用。
在 Git 中列出已有的标签非常简单,只需要输入 git tag
(可带上可选的 -l
选项 --list
):
$ git tag
v1.0
v2.0
在 Git 中创建附注标签十分简单。 最简单的方式是当你在运行 tag
命令时指定 -a
选项:
$ git tag -a v1.4 -m "my version 1.4"
$ git tag
v0.1
v1.3
v1.4
-m
选项指定了一条将会存储在标签中的信息。 如果没有为附注标签指定一条信息,Git 会启动编辑器要求你输入信息。
通过使用 git show
命令可以看到标签信息和与之对应的提交信息:
$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date: Sat May 3 20:19:12 2014 -0700
my version 1.4
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
输出显示了打标签者的信息、打标签的日期时间、附注信息,然后显示具体的提交信息。
另一种给提交打标签的方式是使用轻量标签
。 轻量标签本质上是将提交校验和存储到一个文件中——没有保存任何其他信息。 创建轻量标签,不需要使用 -a
、-s
或 -m
选项,只需要提供标签名字:
$ git tag v1.4-lw
$ git tag
v0.1
v1.3
v1.4
v1.4-lw
v1.5
这时,如果在标签上运行 git show
,你不会看到额外的标签信息。 命令只会显示出提交信息:
$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
git fetch
命令与一个远程的仓库交互,并且将远程仓库中有但是在当前仓库的没有的所有信息拉取下来然后存储在你本地数据库中。
从远程仓库中获得数据,可以执行:
$ git fetch <remote>
这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
如果你使用 clone
命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。 所以,git fetch origin
会抓取克隆(或上一次抓取)后新推送的所有工作。 必须注意 git fetch
命令只会将数据下载到你的本地仓库——它并不会自动合并或修改你当前的工作。 当准备好时你必须手动将其合并入你的工作。
如果你的当前分支设置了跟踪远程分支, 那么可以用 git pull
命令来自动抓取后合并该远程分支到当前分支。 默认情况下,git clone
命令会自动设置本地 master 分支跟踪克隆的远程仓库的 master
分支(或其它名字的默认分支)。 运行 git pull
通常会从最初克隆的服务器上抓取数据并自动尝试合并到当前所在的分支。
git pull
命令基本上就是 git fetch
和 git merge
命令的组合体,Git 从你指定的远程仓库中抓取内容,然后马上尝试将其合并进你所在的分支中。
git push
命令用来与另一个仓库通信,计算你本地数据库与远程仓库的差异,然后将差异推送到另一个仓库中。 它需要有另一个仓库的写权限,因此这通常是需要验证的。
使用 --delete
标志和 git push
命令来在删除一个在服务器上的分支。
假设你已经通过远程分支做完所有的工作了——也就是说你和你的协作者已经完成了一个特性, 并且将其合并到了远程仓库的 master
分支(或任何其他稳定代码分支)。 可以运行带有 --delete
选项的 git push
命令来删除一个远程分支。 如果想要从服务器上删除 serverfix
分支,运行下面的命令:
$ git push origin --delete serverfix
To https://github.com/schacon/simplegit
- [deleted] serverfix
基本上这个命令做的只是从服务器上移除这个指针。 Git 服务器通常会保留数据一段时间直到垃圾回收运行,所以如果不小心删除掉了,通常是很容易恢复的。
git remote
命令是一个是你远程仓库记录的管理工具。 它允许你将一个长的 URL 保存成一个简写的句柄,例如 origin
,这样你就可以不用每次都输入他们了。 你可以有多个这样的句柄,git remote
可以用来添加,修改,及删除它们。
一般是以 git remote add <name> <url>
这样的标准格式。
如果想查看你已经配置的远程仓库服务器,可以运行 git remote
命令。 它会列出你指定的每一个远程服务器的简写。
显示所有远程仓库:
git remote -v
git archive
命令用来创建项目一个指定快照的归档文件。使用 git archive
命令来创建一个项目的归档文件用于分享。
git submodule
命令用来管理一个仓库的其他外部仓库。 它可以被用在库或者其他类型的共享资源上。 submodule
命令有几个子命令, 如(add
、update
、sync
等等)用来管理这些资源。
git show
命令可以以一种简单的人类可读的方式来显示一个 Git 对象。 你一般使用此命令来显示一个标签或一个提交的信息。
git shortlog
是一个用来归纳 git log
的输出的命令。 它可以接受很多与 git log
相同的选项,但是此命令并不会列出所有的提交,而是展示一个根据作者分组的提交记录的概括性信息
git describe
命令用来接受任何可以解析成一个提交的东西,然后生成一个人类可读的字符串且不可变。 这是一种获得一个提交的描述的方式,它跟一个提交的 SHA-1 值一样是无歧义,但是更具可读性。
git bisect
工具是一个非常有用的调试工具,它通过自动进行一个二分查找来找到哪一个特定的提交是导致 bug 或者问题的第一个提交。
git blame
命令标注任何文件的行,指出文件的每一行的最后的变更的提交及谁是那一个提交的作者。 当你要找那个人去询问关于这块特殊代码的信息时这会很有用。
git grep
命令可以帮助在源代码中,甚至是你项目的老版本中的任意文件中查找任何字符串或者正则表达式。
Git 提供了一个 grep
命令,你可以很方便地从提交历史、工作目录、甚至索引中查找一个字符串或者正则表达式。
git cherry-pick
命令用来获得在单个提交中引入的变更,然后尝试将作为一个新的提交引入到你当前分支上。 从一个分支单独一个或者两个提交而不是合并整个分支的所有变更是非常有用的。
git rebase
命令基本是是一个自动化的 cherry-pick
命令。 它计算出一系列的提交,然后再以它们在其他地方以同样的顺序一个一个的 cherry-picks
出它们。
单个提交的merge
检出 experiment
分支,然后将它变基到 master
分支上:
$ git checkout experiment
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: added staged command
git revert
命令本质上就是一个逆向的 git cherry-pick
操作。 它将你提交中的变更的以完全相反的方式的应用到一个新创建的提交中,本质上就是撤销或者倒转。
使用此命令来撤销一个合并提交。
git svn
可以使 Git 作为一个客户端来与 Subversion 版本控制系统通信。 这意味着你可以使用 Git 来检出内容,或者提交到 Subversion 服务器。
对于其他版本控制系统或者从其他任何的格式导入,你可以使用 git fast-import
快速地将其他格式映射到 Git 可以轻松记录的格式。
git gc
命令在你的仓库中执行 “garbage collection”,删除数据库中不需要的文件和将其他文件打包成一种更有效的格式。
此命令一般在背后为你工作,虽然你可以手动执行它-如果你想的话。
git fsck
命令用来检查内部数据库的问题或者不一致性。
git reflog
命令分析你所有分支的头指针的日志来查找出你在重写历史上可能丢失的提交。
git filter-branch
命令用来根据某些规则来重写大量的提交记录,例如从任何地方删除文件,或者通过过滤一个仓库中的一个单独的子目录以提取出一个项目。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。