概述
Git支持多种协议:
ssh git@github.com:michaelliao/gitskills.git
https https://github.com/michaelliao/gitskills.git
Git行为:
git remote 远程与本地
git branch 分支
git merge 合并
git push 推送
概念:
FETCH_HEAD: 是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本。
commit-id:在每次本地工作完成后,都会做一个git commit 操作来保存当前工作到本地的repo, 此时会产生一个commit-id,这是一个能唯一标识一个版本的序列号。 在使用git push后,这个序列号还会同步到远程仓库。
Git生产环境常用命令
协作开发
-创建本地仓库
git init
-关联本地仓库与远程仓库
git remote add origin <url>
-将 开发时 远程主分支拉到本地主分支
git pull origin master
-创建本地 yangpeng 分支
git checkout -b yangpeng
-在本地 yangpeng 分支进行开发
...developing...
-添加到暂存区
git add .
-生成快照
git commit -m 'instruction'
-本地 yangpeng 分支开发完成
-将 开发完成时最新 远程分支拉到本地 yangpeng 分支
git pull origin master
-解决冲突
-此时最新master+your project ,推到远程 yangpeng 分支
git push origin yangpeng
-切换到本地master分支,拉取远程 yangpeng 分支
git pull origin yangpeng
-本地 master 为最新代码后,推到远程 master 分支
push origin master
- git 自动把本地的master分支和远程的master分支对应起来,默认远程仓库的名称是origin
git clone <url>
- 在本地创建和远程分支对应的分支
git checkout -b yangpeng origin/yangpeng
- 建立本地分支与远程分支的关联
git branch --set-upstream branch-name origin/branch-name
- 推送分支
把当前分支上的所有本地快照推送到远程库。推送时要指定本地分支,Git会把该分支推送到远程库对应的远程分支上。
git push origin master
git push origin dev
Git命令积累
检查git安装成功
git --version
初始化本地git仓库
cd <directory>
git init
配置用户名
git config --global user.name "xxx"
配置邮件
git config --global user.email "xxx@xxx.com"
克隆远程仓库主分支
git clone <URL>
查看当前版本状态(是否修改)
git status
添加文件至暂存区
git add <file>
添加当前子目录下所有更改过的文件至暂存区
git add .
提交,形成快照
git commit -m 'instruction'
将add和commit合为一步
git commit -am 'instruction'
显示提交日志
git log
显示所有未添加到暂存区的变更
git diff
显示所有添加到暂存区未形成快照的变更
git diff --cached
比较与上一个版本的差异
git diff HEAD^
关联远程仓库
git remote add origin <URL>
显示本地分支
git branch
显示所有分支
git branch -a
显示所有远程分支
git branch -r
显示所有已合并到当前分支的分支
git branch --merged
创建分支
git branch <分支名称>
切换分支
git checkout <分支名称>
创建并切换分支
git checkout -b <分支名称>
合并分支(在主分支下,执行合并将其它分支合并到主分支)
(master) -> git merge <分支名称>
删除分支
git branch -d <分支名称>
从远程分支创建本地新分支(可重命名)并检出
git checkout -b dev origin/dev
合并远程master至当前分支
git merge origin/master
将当前分支push到远程master分支
git push origin master
获取所有远程分支
git fetch
获取远程分支master并merge到当前分支
git pull origin master
参考:git常用命令
Git fetch & Git pull 区别
git fetch 从远程获取最新分支代码,不会自动merge
git fetch origin master:tmp //从远程仓库master分支获取最新,在本地建立tmp分支
git diff tmp //將當前分支和tmp進行對比
git merge tmp //合并tmp分支到当前分支
git pull 从远程获取最新代码,并且自动merge
什么是git?
– git 是分布式版本管理系统
git的优点
– Git跟踪并管理的是修改,而非文件。
– 版本回滚
– 远程仓库
版本控制系统的用途
– 1备份
(记录多个版本文件的功能), 2记录操作时间线
(查看历史操作,进行版本回滚、前进的功能),3多端共享代码
(代替各种云盘的功能),4‘自动’合并
(解决多人开发冲突问题)
分布式与集中式的区别?
– CVS 和 SVN 是集中式版本管理系统
,速度慢,需要联网使用。
集中式版本管理系统的版本库是集中存放在中央服务器
的,每个人使用时需要先从中央服务器取得最新版本,工作完成再上传至服务器。
分布式版本管理系统中不存在中央服务器,每个人的电脑都是一个版本库。与集中式版本管理系统相比,安全性更好。有一个“中央服务器”是用于大家进行交换修改。
什么是版本库?
– 版本库又叫仓库(repository)
,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。
版本库里有什么?
– Git的版本库里存了很多东西,其中最重要的就是称为stage
(或者叫index)的暂存区
,还有Git为我们自动创建的第一个分支master
,以及指向master的一个指针叫HEAD
。
– git add
命令实际上就是把要提交的所有修改放到暂存区(Stage)
,然后,执行git commit
就可以一次性把暂存区的所有修改提交到分支
。
命令
*创建git仓库$ git init
*将文件添加到仓库共两步
– 将指定文件交由git管理,推到缓存区$ git add <file>
– 推入目录下全部文件$ git add .
– 将文件推到仓库,形成快照commit,-m为说明信息$ git commit -m<info>
– 就像游戏存档
查看仓库版本状态$ git status
文件是否修改,是否提交
查看详细修改内容
– 比较工作区和缓存区的差别$ git diff<file>
– 比较缓存区和仓库区$ git diff --cached
– 比较工作区和仓库区$ git diff HEAD
查看版本的历史信息$ git log
版本回滚
– 版本回滚实际上是切换HEAD指针的指向。
– 指针指向上一个版本:$ git reset --hard HEAD^
– HEAD
是当前版本,HEAD^
是上一个版本,HEAD~100
上100个版本
版本前滚
– 1查看历史命令:$ git reflog
– 2查看对应版本ID
– 3改变指针:$ git reset --hard commit_id
撤销修改
– 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
,缓存区覆盖工作区
。
– 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD <file>
仓库区覆盖缓存区
,就回到了场景1,第二步按场景1操作。或者用命令git checkout HEAD <file>
仓库区覆盖缓存区和工作区
。
– 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
关联远程仓库$ git remote add origin git@github.com:username/filename
将本地分支推送到远程仓库
推送分支全部内容$ git push -u origin master
推送分支最新修改$ git push origin master
从远程仓库克隆到本地
首先必须知道仓库的地址,然后使用git clone <address>
命令克隆。
分支
git里存在一个主分支master
,master
指向提交
,HEAD
实际上指向当前分支
。
每次提交,master分支
都会向前移动一步,这样,随着你不断提交,master分支的线
也越来越长。
当我们创建新的分支,例如dev
时,Git新建了一个指针叫dev
,指向master
相同的提交,再把HEAD
指向dev
,就表示当前分支在dev
上:
Git创建一个分支很快,因为除了增加一个dev
指针,改改HEAD
的指向,工作区的文件都没有任何变化!
不过,从现在开始,对工作区的修改和提交就是针对dev
分支了,比如新提交一次后,dev
指针往前移动一步,而master
指针不变:
我们在dev
上的工作完成了,就可以把dev
合并到master
上。Git怎么合并呢?最简单的方法,就是直接把master
指向dev
的当前提交,就完成了合并:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
分支合并出现冲突
由于两个分支内容有冲突,无法进行快速合并,所以需要手动合并。
Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容。
分支策略