Git
Git是目前世界上最常见的分布式版本控制系统,另外还有CVS、SVN等集中式控制系统。
-
集中式 vs 分布式
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
分布式版本控制系统可以没有“中央服务器”,每个人的电脑上都是一个完整的版本库,安全性要高很多。分布式版本控制系统通常会把一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
-
版本库
什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
-
初始化
初始化一个Git仓库,使用git init命令。
添加文件到Git仓库,分两步:
-
一、使用命令
git add <file>
,注意,可反复多次使用,添加多个文件; -
二、使用命令
git commit -m <message>
,完成。
-
-
工作区和暂存区
工作区,就是在电脑里能看到的目录,工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
git 命令详解
-
git 初始化配置
-
配置用户和email(全局配置,影响所有的git项目,不加–global则只影响本git项目)
git config --global user.name "用户名"
git config --global user.email "Email"
git config --local user.email "Email"
// 修改本项目的email配置git config --global push.default simple
// 修改全局配置中push的默认方式 -
查看所有的配置
git config --list
-
push提示log中有不符合规定的邮箱 撤销不符合规定的commitid,或者还原后重新commit,方能push到远端
-
-
git 克隆源码
-
克隆代码
git clone git@github.com:username/repository.git
git clone https://username:password@github.com/username/repository.git
-
抓取代码
git fetch
远端抓取代码
git pull
远程抓取并合并,相当于git fetch和git merge两步
git pull origin branch-name
抓取指定分支代码
-
-
git 提交源码
-
添加改动到本地库
git add .
或者git add -file
file: 文件的完整路径名称 -
查看改动状态
git status
-
提交改动
git commit [-a] -m "message"
message: 提交记录信息
git commit -am "message"
相当于git add .
+ commit 可选参数 -a: 表示保护内容修改和增删 -
同步到服务端
git push
指定了分支,可省略后面参数
可选参数 -f: 表示强制覆盖
git push origin HEAD:<name-of-remote-branch>
或者git push origin lbranch-1:refs/rbranch-1
// 将当前分支推送到源存储库中的远程引用匹配主机。 这种形式方便推送当前分支,而不考虑其本地名称。git push origin branch-name
不存在的远端分支:git push origin localBranch:remoteBranch
-
-
git 合并代码
- 合并任意分支的commitId
git merge commitId
合并分支中某一提交记录
- 合并任意分支的commitId
-
git 比较代码
-
比较分支的差异
git diff master develop
比较master分支和develop分支的差异 -
查看修改内容
git diff
查看详细修改内容
git show
显示某次提交的内容 -
比较缓存区和上次提交差异
git diff --cached
比较上次提交和git add后的缓存的文件差距
-
-
git 撤销操作
-
回滚提交
git reset <file>
某个文件索引会回滚到最后一次提交, C → B, 也即是重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
git reset --hard [commit]
重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
git reset [commit]
重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
git checkout .
恢复暂存区的所有文件到工作区
git checkout [commit] [file]
恢复某个commit的指定文件到暂存区和工作区
git checkout [file]
恢复暂存区的指定文件到工作区
git reset --hard
重置暂存区与工作区,与上一次commit保持一致
git reset --hard origin/master
重置暂存区和工作区,与远端master保持一致,包括版本号git reset --hard HEAD^
回滚到上一个版本git reset --hard HEAD^^
回滚到上上个版本 -
暂存数据 – (暂存本地修改,工作区还原到上次提交)
git stash
暂存工作区代码到本地栈git stash apply ${0}
恢复栈内最近暂存的数据到工作区git stash pop
恢复最近暂存
-
-
git 分支管理
-
新建分支
git branch branch-new-name
新建分支
git checkout -b branch origin/new-name
切换分支,新建一个branch的本地分支,并且依赖于远端origin库的new_name分支,不存在就新建分支
git checkout -b [分支名] [远程名]/[分支名] -
切换分支
git checkout branch-name
切换到已经存在的分支git checkout -b branch origin/new-name
新建本地分支并映射到对应的远端分支 -
跟踪分支(依赖分支)
git branch --track develop origin/develop
新建一个tracking指向远端developgit branch --set-upstream-to=origin/<branch> [develop]
将已经存在的分支指向远端,push/pull不用指向远端了,直接连接指定的远端分支 或者git branch --set-upstream master origin/master
git branch --set-upstream-to origin/master
git push -u origin develop
这个操作在push的同时会指定当前分支的upstream。git中存在upstream和downstream,简言之,当我们把本地仓库A中某分支x的代码push到远端仓库B分支y,此时仓库B的这个分支y就叫做A中x分支的upstream,而x则被称作y的downstream,这是一个相对关系,每一个本地分支都相对地可以有一个远程的upstream分支(注意这个upstream分支可以不同名,但通常我们都会使用同名分支作为upstream)。
-
删除分支
git push origin :develop
删除远端分支developgit checkout -d/-D develop
删除本地分支developgit checkout -d/-D -r origin/develop
删除一个tracking的远端branch, 并未push -
查看HEAD指向分支
cat .git/HEAD
或者git show-ref
-
git文件的三种状态
-
已修改(modified)
已经修改了工作区的某些文件。 -
已暂存(staged)
已经执行了add操作,但还没有提交,只是暂存在提交清单里。 -
已提交(commited)
已经提交到本地仓库里,但还没push到远端仓库。
git config –global push.default详解
-
1.nothing 不推送任何东西并有错误提示,除非明确指定分支引用规格。强制使用分支引用规格来避免可能潜在的错误。
-
2.current 推送当前分支到接收端名字相同的分支,在远程同名分支不存在的情况下自动创建同名分支
-
3.upstream 推送当前分支到上游@{upstream}。这个模式只适用于推送到与拉取数据相同的仓库,比如中央工作仓库流程模式。
-
4.simple 在中央仓库工作流程模式下,拒绝推送到上游与本地分支名字不同的分支。也就是只有本地分支名和上游分支名字一致才可以推送,就算是推送到不是拉取数据的远程仓库,只要名字相同也是可以的。在GIT 2.0中,simple将会是push.default的默认值。simple只会推送本地当前分支。
-
5.matching 推送本地仓库和远程仓库所有名字相同的分支。这是git 1.x版本的缺省值,执行 git push 但没有指定分支,它将 push 所有你本地的分支到远程仓库中对应匹配的分支。
-
配置push.default的命令如下:
`git config --global push.default simple`