1. Git是什么
Git是目前世界上最先进的分布式版本控制系统(没有之一)。版本控制系统就是可以记录每次文件改动的系统。版本控制系统目前分为两种,一种是集中式版本控制系统(cvs,svn),一种是分布式版本控制系统(git)。集中式版本管理系统的原理是将版本库存放到一台中央服务器上,到了要干活的时候,再从中央服务器上去取得最新的版本,干完活后,再将最新的版本推送给中央服务器。集中式版本控制系统最大的毛病是要联网才能工作,而分布式版本管理系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,多个人协作只要互相推送就好了,在实际使用分布式版本控制系统时,受网络影响,还是需要一台充当“中央服务器的电脑”,但这个服务器的作用仅仅是用来方便交换大家的修改,没有他大家也一样的干活,只是交换修改不方便而已。Git还有极其强大的分支管理,后面再说。
2.如何在各个系统上安装Git
1.1 在Linux上安装Git
root@localhost$: git //尝试输入git,大部分Linux系统会友好的告诉你Git有没有安装以及怎么安装Git
也可通过源码安装,先从Git官网下载源代码,然后解压,依次输入: ./config , make , make install 。
1.2 在MacOS上安装Git
两种方法:
- 第一种是安装homebrew,具体参考文档
- 第二种是直接从 AppStore 安装 Xcode,Xcode 集成了 Git,不
过默认没有安装,你需要运行 Xcode,选择菜单“Xcode”->“Preferences”,在弹出窗口中找到“Downloads”,选择“Command Line Tools”,点“Install”就可以完成安装了。
1.3 在windows上安装Git
下载msysgit,按默认选项安装即可。 安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明 Git 安装成功! 安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
3. 创建Git版本库
3.1 什么叫版本库
版本库又名仓库,英文名 repository,你可以简单理解成一个目录,这个目录 里面的所有文件都可以被 Git 管理起来,每个文件的修改、删除,Git 都能跟踪,以便任何时刻都可以 追踪历史,或者在将来某个时刻可以“还原”。
3.2 创建Git版本库
- 选择一个合适的地方,创建一个空目录
- 通过
git init 命令把这个目录变为Git可以管理的仓库。
创建成功后会有一个隐藏的.git 目录
3.3 将文件添加到版本库
git add xxx.txt (单个文件)、git add . (所有文件)git commit -m "注释内容"
第一步,把文件添加到仓库,第二步,把文件提交到仓库。commit可以一次提交很多文件。add可以多次添加不同文件。
4. Git版本回退及修改删除
4.1 查看当前状态
git status 查看当前仓库状态 git diff 查看修改内容
4.2 版本回退
git log 显示从最近到最远的提交日志 git reset --hard HEAD^ 版本回退到上一个版本 git reset --hard HEAD^ 回退到上上一个版本 git reset --hard commit id 回退到指定版本 git reflog 记录你的每一次命令
版本号没必要写全,Git会自动寻找,Git 的版本回退速度非常快,因为 Git 在内部有个指向当前版本的 HEAD 指针,当你回退版本的时候,Git 仅仅是把 HEAD 从指向 现在版本 改为指向 历史版本。
- HEAD 指向的版本就是当前版本,因此,Git 允许我们在版本的历史之间穿梭,使用命令
g it reset --hard commit_id 。 - 穿梭前,用
git log 可以查看提交历史,以便确定要回退到哪个版本。 - 要重返未来,用
git reflog 查看命令历史,以便确定要回到未来的哪个版本。
4.3 工作区和暂存区
就是你电脑里能看到的目录。
工作区有一个隐藏目录.git,这个不算工作区,而是 Git 的版本库。Git 的版本库里存了很多东西,其中最重要的就是称为 stage(或者叫 index)的暂存区,还有 Git 为我们自动创建的第一个分支master,以及指向 master 的一个指针叫 HEAD。
结合前面把文件往Git版本库添加的时候,是分两步执行的:
git add 实际上是将文件添加到暂存区。git commit 实际上是将暂存区的所有内容添加到当前分支。
4.4 删除文件
git checkout -- file 丢弃工作区的修改,回到最近一次 git commit 或 git add 时的状态。
git checkout -- file 命令中的–很重要,没有–,就变成了“创建一个新分支”的命令,我们在后 面的分支管理中会再次遇到 git checkout 命令。
- 场景一 :当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout - file 。 - 场景二:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,
第一步用命令 git reset HEAD file ,就回到了场景 1,第二步按场景 1 操作。 - 场景三:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前
提是没有推送到远程库。
5. Git远程仓库
假设你已经有了一个Gitee账号 参考Gitee提交提交第一行代码的示例:https://gitee.com/help/articles/4122
6. Git分支管理
6.1 创建与合并分支
在git里主分支叫master,HEAD是指向master的,一开始的时候,master 分支是一条线,Git 用 master 指向最新的提交,再用 HEAD 指向 master,就能确定当前分支,以及当前分支的提交点。
每次提交,master 分支都会向前移动一步,这样,随着你不断提交,master 分支的线也越来越 长。当我们创建新的分支,例如 dev 时,Git 新建了一个指针叫 dev,指向 master 相同的提交,再把 HEAD 指向 dev,就表示当前分支在 dev 上。
合并分支其实就是将master指向dev的当前提交,从而完成合并。
合并完之后甚至可以删除dev分支,其实就是删除dev指针,从始至终,变得只有git的指针所指向的提交,所以git修改,删除,添加分支都非常快。
git checkout -b dev 创建dev分支并切换当前分支为dev git checkout dev 切换当前分支为dev git branch dev 创建dev分支 git branch 查看当前分支 git merge dev 用于合并指定分支到当前分支 git branch -d dev 删除dev分支
6.2 解决冲突
当 Git 无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。 用 git log --graph 命令可以看到分支合并图。
6.3 分支管理策略
通常,合并分支时,如果可能,Git 会用 Fast forward 模式,但这种模式下,删除分支后,会丢掉 分支信息,如果要强制禁用 Fast forward 模式,Git 就会在 merge 时生成一个新的 commit,这样,从分支历史上就可以看出分支信息。
git merge --no-ff -m "merge with no-ff" dev 提交禁用 Fast forward策略
6.4 Bug分支
修复 bug 时,我们会通过创建新的 bug 分支进行修复,然后合并,最后删除。当手头工作没有完成时,先把工作现场 git stash 一下,然后去修复 bug,修复后,再 git stash pop ,回到工作现场。
git stash 隐藏当前工作区工作 git stash list 查看隐藏工作区列表 git stash apply 恢复隐藏工作区工作但不删除隐藏工作区内容 git stash pop 恢复隐藏工作区工作同时删除内容 git remote -v 查看远程库消息
6.5 推送分支
git push origin master 推送分支到远程库上的master分支
并不是每个分支都要往远程分支上推送的:
- master分支是主分支,必须推送。
- dev分支是开发分支,必须远程推送。
- bug分支只用于在本地解决bug使用,没必要推送远程,除非领导想知道你解决了几个bug。
总之,在git中,分支完全可以本地藏着自己玩,是否推送,视你的心情而定!
6.6 抓取分支
- 从本地推送分支,使用
git push origin branch-name ,如果推送失败,先用 git pull 抓 取远程的新提交。 - 在本地创建和远程分支对应的分支,使用
git checkout -b branch-name origin/branch-n ame ,本地和远程分支的名称最好一致。 - 建立本地分支和远程分支的关联,使用
git branch --set-upstream branch-name origin/ branch-name 。 - 从远程抓取分支,使用 git pull,如果有冲突,要先处理冲突。
6.7 创建标签
Git 的标签虽然是版本库的快照,但其实它就是指向某个 commit 的指针(跟分支很像对不对?但 是分支可以移动,标签不能移动),所以,创建和删除标签都是瞬间完成的。
git tag v1.0 创建一个v1.0的标签 git tag 查看所有标签
默认标签是打在最新提交的 commit 上的。 如果忘记打标签了,怎么办? 方法是找到历史提交的 commit id,然后打上就可以了
git tag v0.9 6224937 在6224937的提交上添加标签 git show <tagname> 查看标签信息 git tag -a v0.1 -m "version 0.1 released" 3628164 创建带有说明的标签,用-a 指定标签名,-m 指定说明文字 git tag -s v0.2 -m "signed version 0.2 released" fec145a 通过-s 用私钥签名一个标签
如果标签打错了,怎么办? git tag -d v0.1 删除本地某个标签
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删 除。
git push origin <tagname> 推送某个标签到远程 git push origin --tags 一次性推送全部尚未推送到远程的本地标签
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除 git tag -d v0.9 然后,从远程删除。删除命令也是 push,但是格式如下 git push origin :refs/tags/<tagname> 删除一个远程标签
7. 自定义Git
7.1 配置别名
git config --global alias.st status 告诉 Git,以后 st 就表示 status: git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Crese t -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit" 查看提交日志的自定义配置。
7.2 忽略特殊文件
在 Git 工作区的根目录下创建一个特殊的.gitignore 文件,然后把要忽略的文件名填进去,Git 就会自动忽略这些文件。
忽略文件的原则是:
- 忽略操作系统自动生成的文件,比如缩略图等;
- 忽略编译生成的中间文件、可执行文件等,也就是如果一个文件是通过另一个文件自动
生成的,那自动生成的文件就没必要放进版本库,比如 Java 编译产生的.class 文件; - 忽略你自己的带有敏感信息的配置文件,比如存放口令的配置文件。
|