Git代码管理的利器

280 阅读9分钟

版本控制

记录文件的内容变化,方便将来查阅指定版本的修订情况的系统

集中式版本控制系统

最大的缺点是如果共享仓库的服务(中央服务器)单点故障,则无法提交,无法协同工作了。该系统典型代表是SVN。

分布式版本控制系统

可以解决集中式控制系统中央服务器单点故障。它会将远程仓库克隆一份到本地,就有远程仓库发生了故障,也不会影响本地仓库的文件。该系统典型代表是GIT。

GIT特性

直接记录快照,而非记录差异

SVN每个版本记录的是文件与初始版本的差异

GIT每个版本记录的是文件快照。每次提交的时候,会对当时所有文件创建一个快照并保存这个快照的索引,如果文件没有修改,则不会创建快照,而只保留一个链接指向之前存储的文件

几乎所有操作都是本地执行

绝大多数操作只需访问本地资源,不需要来自网络上的其它计算机的信息。这也是git使用起来速度快的重要原因。

GIT区域

工作区:是电脑里能看到的目录

版本库:工作区里面的一个隐藏的目录.git

暂存区:.git/index文件,暂存区也叫索引(index)

工作区的文件先添加到暂存区,然后再从暂存区添加到版本库

GIT常用命令

仓库操作

获取仓库

git init
将本地为被版本控制的目录转化为Git仓库

git clone <url> <本地文件夹名字>
从远程克隆已经存在的Git仓库

查看仓库

git remote -v
查看远程仓库和url

git remote show origin
查看远程仓库的详细信息

查看文件状态

git status
文件状态的基本变化,还有已提交状态

暂存修改

git add <目录/文件名>
对于新文件,需要跟踪,即加入暂存区;对于已经被跟踪的文件,发生了修改,暂存已修改的文件

查看已暂存和未暂存的修改

当前哪些还未暂存?哪些是已经暂存但是还没有提交的? 通过git status可以查看涉及到哪些文件,但无法查看文件的修改内容,因此,需要使用git diff。

git diff
查看工作区文件和暂存区快照之间的差异

git diff --stage
查看暂存区与最后一次提交的文件之间的差异

提交更新

git commit <-m 提交描述>
将暂存区的快照提交到本地版本库中

git commit --amend
每次提交都会生成一条提交记录,如果第一次提交了,生成了提交记录,后面对同一文件做了修改,但是在提交的时候又不想生成一条提交记录,而是想和前一条合并成一条提交记录,可以使用下面命令, 进入shell并编辑描述保存退出即可。其实--amend并不一定要在有文件修改才能用,没有任何修改也可以用于修改提交描述。该命令会使得上一次提交的记录在版本库中从来没有存在过一样。

移除文件

git rm 文件名
移除暂存区的快照和工作区的文件

git rm --cache
仅移除暂存区的快照,工作区的文件保留。这个非常有用,当不想提交的文件被不小心提交了,可以通过该命令来保留工作区文件,删除暂存区快照,后续提交也删除本地版本库的文件

查看历史提交记录

git log
以时间倒序显示日志,内容包括校验和、作者、邮箱、提交时间、提交描述

git log --pretty=oneline
美化日志输出,指定以一行的方式显示

git log --pretty=oneline --graph
参数--graph可以让日志展示出分支、合并历史

撤销

撤销对文件的修改


git checkout -- 文件路径
该方式删除文件被修改但是未被暂存的修改

撤销暂存文件

git reset 文件路径
该方式是将文件从暂存区删除,但是保留工作区文件

git reset --hard 文件路径
改方式将文件从暂存区删除,也从工作区删除。慎用。

标签

查看标签

git tag
列出所有标签

git show 标签名称
列出指定标签的详细信息

打标签

标签分为轻量级标签和附注标签,轻量级标签不能使用-a/-m选项

git tag 标签名称 [版本号]
在指定版本号打一个标签,如果未指定版本号则在最新版本号打我轻量级标签

git tag -a 标签名称 [版本号] -m 标签描述
在指定版本号打一个标签,如果未指定版本号则在最新版本号打腐竹附注标签。-a表示打的是附注标签,-m表示可以添加标签木描述。通常使用附注标签。

推送到远程仓库

git push origin 标签名称
推送本地指定标签到远程仓库

git push --tags
推送所有不在远程仓库的标签推到远程

删除标签

git tag -d 标签名称
git push origin :refs/tags/标签名称
删除本地标签并推送到远程

git push --delete 标签名称
直接删除远程标签

查看分支

git branch 
查看被检出的本地分支列表

git branch -r
查看远程分支列表

新建分支

方式一:
git banch <分支名>
新建分支
git checkout <分支名>
切换分支

方式二:
git checkout -b <分支名>
创建分支并切换分支

推送&跟踪分支

git push --set-upstream origin <分支名>
如果本地新建了分支,要分享这个分支需要推送到远程仓库

拉取远程仓库数据

git fetch
仅拉取本地没有的数据,但是不会修改工作目录的内容,需要自己合并

git pull
相当于git fetch+git merge操作

合并分支

合并有两种模式:Fast-forward和no Fast-forward

Fast-forward:直接移动指针到最新的提交版本

no Fast-forward:基于两个分支的末版本和两分支的最近的共同祖先版本,共3个版本生成一个新的提交

git merge <分支名>
将“分支名”分支修改合并到当前分支

查看分支是否已合并为master

git branch --merged <分支名>
列出已经合并到<分支名>中的分支,如果未指定分支则表示当前分支
git branch --no-merged <分支名>
列出未合并到<分支名>中的分支,如果未指定分支则表示当前分支

通过查看,如果分支已经合并了,那么如果不在使用,则可以删除分支

删除分支

git branch -d <分支名>
删除本地分支,删除之前检查merge状态,即被删除分支是否与上游分支合并了,未合并则报错
git branch -D <分支名>
强制删除本地分支,不检查merge状态

git push origin --delete <分支名>
删除远程分支

重命名分支

git branch -m oldName newName
重命名本地分支

重命名远程分支
git branch -m oldName newName
git push origin --detele oldName 
在oldName分支执行git push --set-upstream origin 备份分支名
在newName分支执行git push --set-upstream origin newName

变基

合并不同分支的内容有两种方式:合并和变基

git rebase <分支名>
将当前分支变基到“分支名”分支

git checkout <分支名>
git merge 切分支前分支名

变基原理:找到两个分支的共同祖先,然后将当前分支从共同祖先之后的修改形成临时文件,然后将当前分支指针指向指定“分支名”分支的目标基底,最后应用临时文件到“分支名”并移动当前分支的指针。

金科玉律:如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。

贮藏与清理

如果在一个分支工作了一段时间,有些修改没有提交,那么想切换到另一个分支工作,那么先贮藏,然后切换分支去工作

git stash
将即跟踪文件的修改与暂存的改动存到栈上

git stash list
查看栈中贮藏的内容列表(栈的内容列表)

git stash apply <贮藏名>
应用栈中指定贮藏内容,如果未指定<贮藏名>则应用最新的贮藏内容。这个命令,会发现原先暂存的内容并没有在应用后重新暂存,而是在工作区。

git stash apply <贮藏名> --index
通过添加--index使得原先暂存的内容在应用后重新暂存,即能保证和git stash的状态一致

git stash drop <贮藏名>
从栈中删除指定的贮藏内容

git stash pop <贮藏名>
应用栈中指定的贮藏内容并删除

重置揭秘

重置到某个版本

git reset --soft <版本号>
将版本库还原到指定的版本号,暂存区和工作区不变

git reset [--mixed] <版本号>
将版本库和暂存区还原到指定的版本号,工作区不变.--mixed可以省略

git reset --hard <版本号>
将版本库、暂存区和工作区还原到指定的版本号

通过路径来重置

git reset <file>
从暂存区删除file,工作区保留

git add <file>
将file加入到暂存区

这两个操作刚好相反

撤销某一次操作

git revert <版本号>
该操作之前和之后的commit和history都会保留,并且把这次撤销
作为一次最新的提交

git仓库迁移到另一个git仓库

迁移仓库不仅仅要要留代码,还要保留分支、历史提交记录等信息

克隆裸库并镜像推送

1.git仓库创建新仓库test_admin_new

自行创建,略

2.克隆一个裸仓库,即不带工作区的仓库

git clone --bare git-server:/mm/test_admin
$ ls
test_admin.git/

3.进入裸仓库

$ cd test_admin.git/

3.以镜像的方式将代码推送到新仓库test_admin_new

git push --mirror git-server:/mm/test_admin_new

设置remote url并推送

1.git仓库创建新仓库test_admin_new

自行创建,略

2.查看远程仓库

git remote -v

3.设置本地文件中的remote url

git remote set-url origin git-server:/mm/test_admin_new
该命令修改的是.git/config文件的url配置,origin依据第二步查询到的结果

4.推送所有分支到远程

git push --all