序:
书本地址 git-scm.com/book/zh
此书本内容丰富且形象生动,是学习git的好材料。以下是部分学习笔记。
第一章 git 大局观
git有三种状态。已提交(committed)、已修改(modified)和已暂存(staged)。 已提交表示数据已经安全的保存在本地数据库中。 已修改表示修改了文件,但还没保存到数据库中。 已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。
Git 项目的三个工作区域的概念:Git 仓库、工作目录以及暂存区域。
基本的 Git 工作流程如下:
1. 在工作目录中修改文件。
2. 暂存文件,将文件的快照放入暂存区域。
3. 提交更新,找到暂存区域的文件,将快照永久性存储到 Git 仓库目录。
如果 Git 目录中保存着的特定版本文件,就属于已提交状态。 如果作了修改并已放入暂存区域,就属于已暂存状态。 如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
第二章 git基本操作
1)
Git 获取仓库的方式有两种:一种是直接本地初始建仓;另一种是克隆已有的仓库到本地。
1.第一种方法直接在相应的文件夹下输入 :
$ git init
则会自动生成一个.git文件夹,用于管理仓库信息。
2.第二种方法直接在远程仓库中克隆到本地:
$ git clone <url>
Git 支持多种数据传输协议。 包括 https:// 协议 和 git:// 协议,或者使用 SSH 传输协议,比如 user@server:path/to/repo.git 。
2)
文件状态的生命周期如下:
查看当前仓库的文件状态可输入:
$ git status
跟踪新文件:
$ git add <filename>
为了忽略一些不想跟踪的文件,可以在本地仓库下新建 .gitignore 文件。用法举例如下:
查看文件之间的改动可以采用git diff命令:
$ git diff #查看工作区文件和暂存区文件的区别
$ git diff —cached #查看暂存区文件和分支文件的区别
提交文件,同时附加说明:
$ git commit -m “xxxxxxxx”
删除文件(从暂存区和工作区中移除):
$ git rm <filename>
如果删除之前已经修改过文件但未暂存则需要加-f:
$ git rm -f <filename>
单纯从工作区移除则是:
$ rm <filename>
如果想从暂存区删除文件,但本地想保留,可以考虑设置.gitignore文件
移动文件,对文件改名:
$ git mv <filenameA> <filenameB>
查看提交历史:
$ git log
显示每次提交的具体改动 -p, 显示最近2次的改动 -2:
$ git log -p -2
显示每次提交的改动统计信息:
$ git log —stat
3)撤销操作
当commit之后,发现漏了要提交某个文件,可以利用—amend:
$ git commit -m “xxxxx”
$ git add <forgotten_filename>
$ git commit —amend
当你想把某个文件从暂存区撤出:
$ git reset HEAD <filename>
当你不想保留工作区修改过的文件,想让其回到提交时的样子:
$ git checkout — <filename>
4)远程仓库
查看远程仓库:
$ git remote
同时显示url:
$ git remote -v
显示更多信息,例如分支信息等:
$ git remote show <remotename>
在仓库中添加其他远程仓库:
$ git remote add <shortname> <url>
从远程仓库获取更新数据:
$ git fetch <remotename>
推送到远程仓库:
$ git push <remotename> <branchname>
远程仓库重命名:
$ git remote rename <oldname> <newname>
移除远程仓库:
$ git remote rm <remotename>
5)打标签
列出已有标签:
$ git tag
第三章 Git分支
查看所有分支:
$ git branch
在上一次的提交对象中创建分支:
$ git branch <branchname>
在本地 HEAD 会指向当前分支,切换分支:
$ git checkout <branchname>
查看项目分叉历史:
$ git log —oneline —decorate —graph —all
删除分支:
$ git branch -d <branchname>
假设当前项目分叉如下:
如果想将master分支合并到hotfix分支上:
$ git checkout master
$ git merge hotifx
这时不会产生新的snapshots,master指向C4
假设当前项目开发到如下:
如果想将iss53分支合并入master分支,这时会利用到3个snapshots,分别是各自的snapshots C4, C5以及共同祖先C4,然后创建一个新的提交:
但这时候可能会遇到合并冲突,因为在不同分支上,我们可能会对同一个文件做不同的修改,此时可以先查看那些因冲突而尚未被合并(unmerged)的文件:
$ git status
然后进入相应的文件中手动解决冲突。
在文件中,会出现以下情况:
然后手动修改,保留想要的代码。
等所有冲突都解决了,需要重新提交代码:
$ git commit
如果想采用图形化工具更便捷的解决冲突,可以输入:
$ git mergetool
例如:BeyondCampare可以方便整理
当你将本地的分支xxxx push到远程仓库的时候:
$ git push origin xxxx
远程仓库也会多一个分支 origin/xxxx
此时,当别人从远程仓库中fetch的时候:
$ git fetch origin
在别人的本地仓库中也会获得origin/xxxx的数据以及多了一个origin/xxxx分支指针,但本地不会多一个xxxx分支指针,只有一个不可修改的 origin/xxxx分支指针
可以将其合并到自己指定的分支上:
$ git merge origin/xxxx
也可以新建一个本地的分支 xxxx,此时的xxxx可以进行不同的命名,如命名为yyyy,此时的yyyy和prigin/xxxx是关联的:
$ git checkout -b yyyy origin/xxxx
又或者采用跟踪分支命令,直接新建一个本地分支xxxx:
$ git checkout —track origin/xxxx
查看跟踪分支情况:
$ git branch -vv
删除远程分支:
$ git push origin —delete xxxx
变基是一种可以让分支合并更加线性简介的合并方式,例如以下情况:
如果直接采用merge的方法会得到结果如下:
如果采用变基(rebasing)的方法:
$ git checkout experiment
$ git rebase master
则会对比 C3到C2 和C4到C2 的区别,根据这个区别生成临时文件,同时在C3的后面生成一个新的分支节点C4’:
然后我们再回到master分支,将master合并入experiment中:
$ git checkout master
$ git merge experiment
此时的项目结构就显得线性简介,push到远程仓库上,远程仓库也方便管理
第四章 服务器上的Git
Git服务器通常使用SSH公钥进行认证。
公钥文件为id_rsa.pub,一般在 ~/.ssh 目录下,
若没有,则可以生成:
$ ssh-keygen -t rsa -C “xxx@yyy.com"
如果本地还没有远程仓库相关的文件,你可以直接clone下来。
如果本地已经有了一些文件,你想将相应的文件夹和远程仓库关联,可以输入:
$ git remote add gitlab https://xxxx/xxxx/xxxx.git
附录 代理
export http_proxy=http://10.x.xx.xxx:3128/
export https_proxy=http://10.x.xx.xxx:3128/