安装完 Git 之后,要做的第一件事就是
安装后
git配置
设置你的用户名和邮件地址。 这一点很重要,因为每一个 Git 提交都会使用这些信息,它们会写入到你的每一次提交中,不可更改:
git config user.name "liupei"
git config user.email "cumtlp@qq.com"
## 检查配置信息git config --list
# 获取帮助git help <verb>
如要获取 git config
命令手册,执行git help config
# 获取git仓库
## 已存在的目录
git init
git add .
git commit -m 'initial project version'
克隆现有仓库
克隆仓库的命令是 git clone <url>
。 比如,要克隆 Git 的链接库 libgit2
,可以用下面的命令:
git clone https://github.com/libgit2/libgit2
如果你想在克隆远程仓库的时候,自定义本地仓库的名字,你可以通过额外的参数指定新的目录名:
git clone https://github.com/libgit2/libgit2 mylibgit
记录更新
工作目录下的每一个文件都不外乎这两种状态:已跟踪
或 未跟踪
。
- 已跟踪的文件就是 Git 已经知道的文件
- 工作目录中除已跟踪文件外的其它所有文件都属于未跟踪文件
检查当前文件状态
git status
更新新文件
使文件进入暂存git add a.txt
orgit add .
状态简览
git status -s
提交更新
git commit -m '改动注释'
移除文件
git rm prj.md
移动文件
git mv file_from file_to
查看提交历史
git log
撤销操作
git commit --amend
如:
git commit -m 'init commit'
git add forgotten file
git commit --amend
最终你只会有一个提交——第二次提交将代替第一次提交的结果。
远程仓库
为了能在任意 Git 项目上协作,你需要知道如何管理自己的远程仓库。 远程仓库是指托管在因特网或其他网络中的你的项目的版本库。 你可以有好几个远程仓库,通常有些仓库对你只读,有些则可以读写。
查看远程仓库
git remote
orgit remote -v
添加远程仓库
git remote add <shortname> <url>
git remote add pb https://github.com/paulboone/ticgit
从远程仓库抓取
git fetch <remote>
这个命令会访问远程仓库,从中拉取所有你还没有的数据。 执行完成后,你将会拥有那个远程仓库中所有分支的引用,可以随时合并或查看。
如果你使用 clone 命令克隆了一个仓库,命令会自动将其添加为远程仓库并默认以 “origin” 为简写。
推送到远程仓库
git push <remote> <branch>
如:将 master 分支推送到 origin 服务器时,git push origin master
查看某个远程仓库
如果想要查看某一个远程仓库的更多信息,可以使用 git remote show <remote>
命令。 如果想以一个特定的缩写名运行这个命令,例如 origin
,会得到像下面类似的信息:git remote show origin
远程仓库的重命名与移除
你可以运行 git remote rename
来修改一个远程仓库的简写名。 例如,想要将 pb
重命名为 paul
,可以用 git remote rename 这样做:git remote rename pb paul
如果因为一些原因想要移除一个远程仓库——你已经从服务器上搬走了或不再想使用某一个特定的镜像了, 又或者某一个贡献者不再贡献了——可以使用 git remote remove
或 git remote rm
:git remote remove paul
一旦你使用这种方式删除了一个远程仓库,那么所有和这个远程仓库相关的远程跟踪分支以及配置信息也会一起被删除。
git 分支
分支创建
Git 是怎么创建新分支的呢? 很简单,它只是为你创建了一个可以移动的新的指针。 比如,创建一个 testing 分支, 你需要使用 git branch
命令:git branch testing
在本例中,你仍然在 master 分支上。 因为 git branch 命令仅仅 创建 一个新分支,并不会自动切换到新分支中去。
你可以简单地使用 git log
命令查看各个分支当前所指的对象。 提供这一功能的参数是 --decorate
。git log --oneline --decorate
正如你所见,当前 master
和 testing
分支均指向校验和以 f30ab
开头的提交对象。
分支切换
要切换到一个已存在的分支,你需要使用 git checkout
命令。 我们现在切换到新创建的 testing
分支去:git checkout testing
这样 HEAD
就指向 testing
分支了。
那么,这样的实现方式会给我们带来什么好处呢? 现在不妨再提交一次:
vim test.rb
git commit -a -m 'made a change'
如图所示,你的 testing
分支向前移动了,但是 master
分支却没有,它仍然指向运行 git checkout
时所指的对象。 这就有意思了,现在我们切换回 master
分支看看:git checkout master
这条命令做了两件事。 一是使 HEAD
指回 master
分支,二是将工作目录恢复成 master
分支所指向的快照内容。 也就是说,你现在做修改的话,项目将始于一个较旧的版本。 本质上来讲,这就是忽略 testing
分支所做的修改,以便于向另一个方向进行开发。
我们不妨再稍微做些修改并提交
vim test.rb
git commit -a -m 'made other changes'
现在,这个项目的提交历史已经产生了分叉。 因为刚才你创建了一个新分支,并切换过去进行了一些工作,随后又切换回 master
分支进行了另外一些工作。 上述两次改动针对的是不同分支:你可以在不同分支间不断地来回切换和工作,并在时机成熟时将它们合并起来。 而所有这些工作,你需要的命令只有 branch
、checkout
和 commit
。
你可以简单地使用 git log
命令查看分叉历史。 运行 git log --oneline --decorate --graph --all
,它会输出你的提交历史、各个分支的指向以及项目的分支分叉情况。
由于 Git 的分支实质上仅是包含所指对象校验和(长度为 40 的 SHA-1 值字符串)的文件,所以它的创建和销毁都异常高效。 创建一个新分支就相当于往一个文件中写入 41 个字节(40 个字符和 1 个换行符),如此的简单能不快吗?Git 中,任何规模的项目都能在瞬间创建新分支。
通常我们会在创建一个新分支后立即切换过去,这可以用 git checkout -b <newbranchname>
一条命令搞定。
分支新建与合并
参考文献: