赞
踩
以下两种方式都会在本地机器上得到一个工作就绪的Git仓库
cd
到项目目录内
git init
,该命令将创建一个名为,git的子目录,这个子目录含有你初始化的Git仓库中所有的必须文件git add [文件]
,来指定所需文件进行追踪git commit -m [分支提交说明]
git clone <url>
,默认配置下远程Git仓库中的每一个文件的每一个版本都将被拉取下来git clone <url> [名字]
工作目录下的每个文件都不外乎两种状态:已跟踪和未跟踪。
已跟踪的文件,是指那些被纳入版本控制的文件,在上一次快照中有它们的记录,在工作一段时间后,它们的状态可能是未修改,已修改或已放入暂存区。简而言之,已跟踪的文件就是Git已经知道的文件。
未跟踪的文件,它们既不存在于上次快照的记录中,也没有被放入暂存区。初次克隆某个仓库的时候,工作目录的所有文件都属于已跟踪文件,并处于未修改状态。
git status
命令查看哪些文件处于什么状态,如克隆仓库后立即使用该命令。$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Untracked files
。$ 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
命令开始跟踪一个文件,跟踪README文件,运行git commit README
git status
命令,会提示Changes to be committed
$ 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
如果修改一个已被跟踪的文件,运行git status
命令,会提示Changes not staged for commit
,并且提示我们需要把CONTRIBUTING.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)
new file: 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
往下执行,提示已暂存。
$ git add CONTRIBUTING.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)
new file: README
modified: CONTRIBUTING.md
若继续在该文件中修改内容,则需要重新放入暂存区。
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
标记一般我们总会有些文件无需纳入Git管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件。我们可以创建一个名为.gitignore
的文件,列出要忽略的文件的模式,例如:
$ cat .gitignore
*.[oa] // 告诉Git忽略所有以.o 或 .a 结尾的文件, 一般这些文件都是在编译过程中出现的
*~ // 告诉Git忽略所有名字以波浪符(~)结尾的文件
要养成一开始就为新仓库设置好.gitignore的习惯,以免将来误提交这类无用的文件。
文件.gitignore
文件的格式规范:
#
开头的行都会被git忽略glob
模式匹配,即shell所使用的简化了的正则表达式,它会递归地应用在整个工作区中/
开头防止递归/
结尾指定目录!
取反git diff
命令能通过文件补丁的格式更加具体地显示哪些行为发生了改变,比较的是工作目录中当前文件和暂存区域快照之间的差异。git diff --staged
或 git diff --cached
命令对比已暂存文件与最后一次提交的文件的差异。暂存区准备就绪了,就可以提交了。准备提交前,先用 git status
看下,你所需要的文件是不是都已暂存起来了,然后再运行提交命令 git commit
。
git commit -m
添加 -m
选项,将提交信息与命令放在同一行。提交时记录的是放在暂存区的快照。每一次运行提交操作,都是对你的项目作一次快照,以后可以回到这个状态,或者进行比较。
要从Git中移除某个文件,就必须要从已跟踪文件清单中移除(即从暂存区中移除),然后提交,可以使用 git rm
命令,并连带从工作目录中删除指定的文件。
如果要删除之前修改过或已经放到暂存区的文件,则必须使用强制删除选项 -f
。这是一种安全特性,用于防止误删尚未添加到快照的数据,这样的数据不能被Git恢复。
git rm --cached README
使用 --cached
选项,可以让文件保留在磁盘,但是并不想让Git继续跟踪。
git rm
命令后可以列出文件或者目录的名字,也可以使用 glob
模式。
同Linux系统中的 mv
操作
git log
命令,会按时间先后顺序列出所有的提交,以及SHA-1校验和、作者的名字和电子邮件、提交时间以及提交说明等,如:
$ 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
-p
或 --patch
选项,会显示每次提交所引入的差异。-n
限制显示的日志数量,如限制2条日志显示。
$ git log -p -2
--pretty
选项,可以使用不同于默认格式的方式展示提交历史。比如 online
会将每个提交放在一行显示。
$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit
format
,可以定制记录的显示格式。$ 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
format
常用选项。选项 | 说明 |
---|---|
%H | 提交完整的哈希值 |
%h | 提交简写的哈希值 |
%T | 树的完整哈希值 |
%t | 树的简写哈希值 |
%P | 父提交的完整哈希值 |
%p | 父提交的简写哈希值 |
%an | 作者的名字 |
%ae | 作者的电子邮件地址 |
%ad | 作者修订日期(可以用 --date= 选项 来定制格式) |
%ar | 作者修订日期(按多久以前的方式显示) |
%cn | 提交者的名字 |
%cd | 提交日期 |
%cr | 提交日期(距今多长时间) |
%s | 提交说明 |
--graph
选项可以可视化地显示提交的分支、合并历史。
$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 ignore errors from SIGCHLD on trap
* 5e3ee11 Merge branch 'master' of git://github.com/dustin/grit
|\
| * 420eac9 Added a method for getting the current branch.
* | 30e367c timeout code and tests
* | 5a09431 add timeout protection to grit
* | e1193f8 support for heads with slashes in them
|/
* d6016bc require time for xmlschema
* 11d191e Merge branch 'defunkt' into local
--amend
选项的提交命令来重新提交。$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
$ git add *
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
renamed: README.md -> README
modified: CONTRIBUTING.md
git reset HEAD <file>...
来取消暂存。git reset
确实是个危险的命令,如果加上了 --hard
选项则更是如此。git checkout -- <filename>
。远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。 与他人协作涉及管理远程仓库以及根据需要推送或拉取数据。 管理远程仓库包括了解如何添加远程仓库、移除无效的远程仓库、管理不同的远程分支并定义它们是否被跟踪等等。
git remote
命令,查看已经配置的远程仓库服务器。
$ git remote
origin
指定 -v
选项,会显示需要读写远程仓使用的Git保存的简写与其对应的URL。
$ git remote -v
origin https://github.com/schacon/ticgit (fetch)
origin https://github.com/schacon/ticgit (push)
git remote add <shortname> <url>
命令,添加一个新的远程Git仓库,同时指定一个方便使用的简写(shortname)。现在可以使用字符串 pb
来代替整个URL。
$ git fetch pb
remote: Counting objects: 43, done.
remote: Compressing objects: 100% (36/36), done.
remote: Total 43 (delta 10), reused 31 (delta 5)
Unpacking objects: 100% (43/43), done.
From https://github.com/paulboone/ticgit
* [new branch] master -> pb/master
* [new branch] ticgit -> pb/ticgit
现在远程仓库的master分支可以在本地通过 pb/master
访问到
git fetch <remote>
命令,从远程仓库中获得数据,注意该命令只会将数据下载到本地仓库—它并不会自动合并或修改你当前的工作。你必须使用 git pull
命令,来自动抓取后合并远程分支到当前分支。
git clone
命令会自动设置本地master分支跟踪克隆的远程仓库的 master
分支(或其他名字的默认分支)。当你想分享你的项目时,必须将其推送到上游。执行 git push <remote> <branch>
命令,将 master
分支推送到 origin
服务器。
$ git push origin master
Note:只有当你有所克隆服务器的写入权限,并且之前没有人推送过时,这条命令才能生效。当你和其他人在同一时间克隆,他们先推送到上游然后你再推送到上游,你的推送就会毫无疑问地被拒绝。你必须先抓取 fetch
它们的工作并将其合并 pull
进你的工作后才能推送。
git remote show <remote>
命令,查看某一个远程仓库的更多信息。
$ git remote show origin
* remote origin
Fetch URL: https://github.com/schacon/ticgit
Push URL: https://github.com/schacon/ticgit
HEAD branch: master
Remote branches:
master tracked
dev-branch tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
它告诉你正处于本地 master
分支。
Local branches configured for 'git pull':
dev-branch merges with remote dev-branch
master merges with remote master
Local refs configured for 'git push':
dev-branch pushes to dev-branch (up to date)
markdown-strip pushes to markdown-strip (up to date)
master pushes to master (up to date)
这个命令列出了当你在特定的分支上执行 git push
会自动地推送到哪一个远程分支。 它也同样地列出了哪些远程分支不在你的本地,哪些远程分支已经从服务器上移除了, 还有当你执行 git pull
时哪些本地分支可以与它跟踪的远程分支自动合并
git remote rename
命令,来修改一个远程仓库的简写名。
$ git remote rename pb paul // 将pb重命名为paul
$ git remote
origin
paul
git remote remove
命令, 来移除一个远程仓库
$ git remote remove paul
$ git remote
origin
一旦使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支的远程跟踪分支以及配置信息也会一起被删除。
Git可以给仓库历史中的某一个提交打上标签,以示重要。比较有代表性的是人们会使用这个功能来标记发布节点(v1.0
、v2.0
等等)。
git tag
命令,列出标签
$ git tag
v1.0
v2.0
支持shell通配符(glob模式),按照通配符列出标签需要-l
选项。如果提供一个匹配标签名的通配模式,那么 -l
就是强制使用的。
$ git tag -l "v1.8.5*"
v1.8.5
v1.8.5-rc0
v1.8.5-rc1
Git支持两种标签:轻量标签(lightweight)与附注标签(annotated)。
轻量标签很像一个不会改变的分支—它只是某个特定提交的引用。它没有保存任何其它信息。
附注标签是存储在Git数据库中的一个完整对象,它们是可以被校验的,其中包含打标签者的名字、电子邮件地址、日期时间,此外还有一个标签信息,并且可以使用 GNU Privacy Guard (GPG)签名并验证。 通常会建议创建附注标签,这样你可以拥有以上所有信息。但是如果你只是想用一个临时的标签, 或者因为某些原因不想要保存这些信息,那么也可以用轻量标签。
git tag -a
命令,创建附注标签只需要加上 -a
选项,-m
选项指定一条将会存储在标签的信息:
$ git tag -a v1.4 -m "my version 1.4"
$ git tag
v0.1
v1.3
v1.4
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 <tagname>
,不会看到额外的标签信息,只会显示出提交信息。
在之后补上标签,即在指定提交上打标签,需要在命令的末尾指定提交的校验和(或部分校验和):
$ git tag -a v1.2 9fceb02
默认情况下,git push
命令并不会传送标签到远程仓库服务器上。在创建完标签后你必须显示地推送标签到共享服务器上。可以运行git push origin <tagname>
命令。
$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
* [new tag] v1.5 -> v1.5
若想一次性推送很多标签,使用带有 --tags
选项的 git push
命令。这将会把所有不在远程仓库服务器上的标签全部传送到那里。
$ git push origin --tags
Counting objects: 1, done.
Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
* [new tag] v1.4 -> v1.4
* [new tag] v1.4-lw -> v1.4-lw
如此,当其他人从仓库中克隆或拉取,它们也能得到你的那些标签
Note:使用 git push <remote> --tags
推送标签并不会区分轻量标签和附注标签, 没有简单的选项能够让你只选择推送一种标签。
git tag -d <tagname>
,即可删掉在本地仓库上的标签。
若想要从任何远程仓库中移除这个标签,必须用 git push <remote> :refs/tags/<tagname>
:
$ git push origin :refs/tags/v1.4-lw
To /git@github.com:schacon/simplegit.git
- [deleted] v1.4-lw
删除远程标签方法二:git push origin --delete <tagname>
如果你想查看某个标签所指向的文件版本,可以使用 git checkout
命令, 虽然这会使你的仓库处于“分离头指针(detached HEAD)”的状态。
可以通过 git config
文件来轻松地为每一个命令设置一个别名:
$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit // 可以用 git ci 来代替 git commit 了
$ git config --global alias.st status
例如:
$ git config --global alias.last 'log -1 HEAD'
这样,可以轻松地看到最后一次提交:
$ git last
commit 66938dae3329c7aebe598c2246a8e6af90d04646
Author: Josh Goebel <dreamer3@example.com>
Date: Tue Aug 26 19:48:51 2008 +0800
test for current head
Signed-off-by: Scott Chacon <schacon@example.com>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。