Git

Git是一款开源的分布式版本控制系统,由linus领头开发,初衷是用其管理Linux内核庞大的开源代码.

1. Git 基本概念
  • 工作拷贝(work copy):也称为工作区,用于存放产品开发数据本地工作目录

  • 索引(index): 用于存放待提交数据的缓存区

  • 本地库 : 远端库的一个完整的拷贝,包括所有文件的修改记录,分支等

  • 远端库 : 本地库clone的来源

  • 中心库 : 远端库的一种,公司级存放某个项目所有产品数据的仓库

  • 快照(snaoshot) : 版本库某个时间点所有文件集合

  • 全球版本号(commitID) : Git库的版本号是通过 SHA-1算法根据库中的所有内容计算出一个40位的哈希值,这个哈希值是全球唯一的,基本只要前六位就可以唯一标识了

  • 文件状态介绍 :

    • untracked files : 未被跟踪的文件,一般指新添加的文件
    • Change not staged for commit : 已修改的文件,包括modified和deleted状态
    • change to be commit : 已缓冲的文件,即已 add 的文件,包括 modified,deleted 和 new file 状态
    • Noting to commit : 已提交的文件
git.png

2. 常见操作
  • 克隆中心库到本地
    git clone 中心库名称地址 本地工作目录名称

  • 新增或修改文件,将需添加的文件转移至缓存区
    git add

  • 提交, 将所有缓存区的修改提交到本地版本库
    git commit
    git commit --amend : 修改最新一次的提交,保持change ID不变

  • 取消已缓存的修改(回退)
    git rm --cached 文件名 : 将新添加的文件返回到未被追踪的状态,即从缓冲区删除,但不影响本地内容
    git reset HEAD 文件名 : 回退库上的提交 ,同样不影响本地内容

  • 删除文件
    git rm 文件名 : 只是删除文件并将删除的信息转移至缓存区

  • 取消本地文件的修改,包括删除的文件
    git checkout -- 文件名 : 删除本地修改未上传的文件
    git clean -f : 删除本地未被跟踪的文件

  • 重命名文件或目录
    git mv 原文件名 新文件名 : mv后直接到缓存区

  • 查看文件状态
    git status

  • 比较文件
    git diff
    git diff OldcommitID NewcommitID(前6位)
    git diff HEAD/master

  • 查看修改日志
    git log

  • 创建私有分支
    git branch 分支名 commitID
    git checkout -b 分支名 commitID
    注:此操作是基于commitID 拉出新分支,如果没有则基于当前分支的HEAD拉出新分支。
    git checkout -b 分支名 commitID = git branch 分支名 commitID + git checkout 分支名

  • 合并分支
    1、直接合并 : git merge 分支名
    注:此操作是将“分支名”指示的分支合并到当前所在的分支,所以合并前必须切换到目标分支。
    2、拣选合并 : git cherry-pick commitID
    注:将某次特定提交合并到当前分支,首先合并前必须切换到目标分支。

  • 查看分支
    git branch :查看当前git库中的所有分支,“-r”是查看git库中对应的远程分支参照。

  • 检查分支是否合并到当前分支
    git branch ––merged :查看已经合并到当前分支的所有分支。
    git branch ––no-merged :查看还没有合并到当前分支的所有分支。

  • 删除私有分支
    git branch –d/-D 分支名
    注:此操作”-d”删除分支前会检查分支中的内容是否都已经合并到其他分支,如果没有,则命令不执行;
    ” -D”不进行检查,直接删除分支。

  • 重命名分支
    git branch -m oldbranch newbranch
    注:此操作是将oldbranch分支的名称改成newbranch。如果需要拉出分支,并同时切换到新分支可以用git checkout –b oldbranch newbranch

  • 上传修改到中心库
    git push 远端库名称 本地分支名称 :远程分支的名称
    注:此操作是将本地库的修改同步到中心库,如果本地分支的名称和远程分支的名称相同,则远程分支名称可省略。
    git push origin new:new_br

  • 更新当前模块(不推荐用git pull命令强制将更新合并到本地)
    git fetch 远端库名称 : 获取远端库的更新到本地库
    例如 : git fetch origin
    git merge 远程库名称/分支名称 : 将中心库的更新合并到本地工作目录中
    例如: git merge origin/new_br

  • 修改提交信息
    git commit –m “新的提交信息” –-amend
    注:此操作只能修改最新的一次提交,之前的提交无法修改。

  • 回退某一历史版本,然后提交到本地库
    git revert 全球版本号 :此操作将回退记录到历史的某一节点,并作为一次新的提交到库中。

  • 回退操作
    1、需要重新提交,修改的内容保持不变。使用git reset commit-id(上一个节点的commit-id)
    2、撤销提交:使用git reset –hard HEAD~1(HEAD^)
    注:上面两个reset的区别是,修改的内容是否需要保留;

  • 暂存本地修改
    git stash : 将本地未提交的修改暂存起来,并将文件状态恢复到HEAD,如果要恢复暂存的修改,运行git stash pop即可,非常适合临时插入的紧急bug修改

  • 变基
    git rebase 目标分支 原分支 :此操作将原分支变基到目标分支HEAD上。

  • 解冲突
  1. git feach 拉回来的代码与本地发生冲突
  2. git status . 和 git diff . 查看冲突的文件及其具体位置
  3. vim 修改具体的冲突
  4. git status . 解冲突后的状态
  5. git add . :将解好冲突的文件add到暂存区(stage)
  6. git cherry-pick --continue : cherry-pick 一下
  7. git commit --amend : commit到本地仓
    辅助:git status . ; git show HEAD 瞄一眼检查一下修改处
  8. repo upload . : 将解决的冲突上传到 Gerrit
  • Git帮助查询
    git help
    git help cmd


Git常用命令集合整理

Git基础命令 说明
git init 初始化新项目
git status 查看文件状态
git add 将文件添加至暂存区
git commit 提交暂存区文件
git log 查看提交历史
git config --global user.name "<name>" 配置用户name

例子

使用 Git 创建项目流程
mkdir testProject
cd testProject
git init
touch README
git add README
git commit -m 'first commit'
git remote add origin git@192.168.1.1:test.git
git push -u origin master
// 获取现有的项目
git clone git@192.168.1.2:test.git


基于分支的提交流程 说明
git checkout -b myfeature 新建并切换到新功能分支 myfeature
git add files 添加新文件到暂存区
git commit -a -m "修改原因" 将暂存区所有修改提交
git checkout develop 切换回开发分支develop
git merge myfeature 合并新功能分支
git branch -d myfeature 删除新功能分支
git pull 获取并合并远程服务器最新代码
git push 推送本地分支到远程服务器对应分支

注 : 养成先 pull 再 push 的好习惯


Git分支管理
  • 主要分支(长期存在) :
    master 主分支(除非重大bug,会分出hotfix分支)
    develop 开发分支(用来另外分支出 Release,Feature)
  • 次要分支
    Feature功能分支(由develop直接分支,开发新功能)
    Realease预发布分支(由develop直接分支,开发下一版Release)
    Hotfixs(由master直接分支,修复bug)
Git分支管理 - 特性功能分支 说明
git checkout -b myfeature develop 新建并切换到新功能分支myfeature
git add .
git commit -a -m "修改注释" 修改代码后commit
git checkout develop 切换回开发分支develop
git merge --no-ff myfeature 合并新功能分支
git branch -d myfeature 删除新功能分支
git pull 获取并合并远程服务器最新代码
git push origin develop 推送本地分支到远程服务器对应分支

Git分支管理 - 发布功能分支 说明
git checkout -b release-1.1 develop 新建并切换到新功能分支
git add .
git commit -a -m "Update:release 1.1" add & commit
git checkout master 切回master分支,并合并release-1.1分支
git merge --no-ff release-1.1 合并
git tag -a v1.3 -m "Release v1.1 Tag" 在master 上面加上新tag
git checkout develop 切回develop分支,并合并release-1.1分支
git merge --no-ff release-1.1 合并
git push 上传
git push origin v1.1 将新 TagV1.1 更新到 origin/master

查看、添加、提交、删除、找回,重置修改文件
Git命令列表 说明
git help <command>
git show 显示某次提交的内容
git show $id
git checkout -- <file> 抛弃工作区file的修改
git checkout .
git add 工作区add到暂存区
git rm <file> 从版本库中删除文件
git rm <file> --cached 从版本库中删除文件,但不删除文件
git reset 从暂存区恢复到工作文件
git reset -- .
git reset --hard 恢复最后一提交的状态
git commit <file>
git commit -a 将 git add , git rm 和 git commit等操作都合并在一起做
git commit -am "comments" 有注释的commit
git commit --amend 与上次提交同commitId
git revert <$id> 恢复某次提交的状态,恢复动作本身也创建一次提交对象
git revert HEAD 恢复最后一次提交的状态

查看文件diff 命令列表 说明
git diff <file> 比较当前文件和暂存区文件差异
git diff <id1> <id2> 比较两次提交之间的差异
git diff <branch1>..<branch2> 比较两个分支之间的差异
git diff --staged 比较暂存区和版本库的差异
git diff --cached 比较暂存区和版本库的差异
git diff --stat 仅仅比较统计信息

查看提交记录 命令列表 说明
git log
git log <file> 查看该文件每次提交记录
git log -p <file> 查看每次详细修改内容的diff
git log -p -2 查看最近两次详细修改内容的diff
git log --stat 查看提交统计信息

查看、切换、创建和删除分支 命令列表 说明
git branch -r 查看远程分支
git br <new_branch> 创建新的分支
git br -v 查看各个分支最后提交的信息
git br --merged 查看已经被合并到当前分支的分支
git br --no-merged 查看尚未被合并到当前分支的分支
--- ---
git checkout <branch> 切换到分支branch
git co -b <new_branch> 创建新的分支并且切换过去
git co -b <new_branch> <branch> 基于branch创建新的new_branch
git co $id 把某次历史提交记录checkout出来,但无分支信息,切换到其他分支会自动删除
git co $id -b <new_branch> 把某次历史提交记录checkout出来,并创建一个新的分支
--- ---
git br -d <branch> 删除某个分支
git br -D <branch> 强制删除某个分支(未被合并的分支被删除的时候需要强制)
--- ---
git merge <branch> 将 branch 分支合并到当千分之
git merge origin/master --no-ff 不要 Fast-Foward 合并,这样可以生成 merge 提交
git rebase master <branch> 将master rebase 到 branch,相当于 git co <branch> && git rebase master && git co master && git merge <branch>


Git暂存管理 命令列表 说明
git stash 暂存
git stash list 列所有的stash
git stash apply 恢复暂存的内容
git stash pop 恢复暂存的内容
git stash drop 删除暂存的内容

Git远程分支管理 命令列表 说明
git pull 抓取远程仓库所有分支更新并合并到本地
git pull --no-ff 抓取远程仓库所有分支更新并合并到本地,不要快进合并
git fench origin 抓取远程仓库更新
git merge origin/master 将远程主分支合并到本地当前分支
git co --track origin/master 跟踪某个远程分支创建相应的本地分支
git co -b <local_branch> origin/<remote_branch> 基于远程分支创建本地分支,功能同上
git push push所有分支
git push origin master 将本地主分支推到远程主分支
git push -u origin master 将本地主分支推到远程主分支(如无远程主分支则创建,用于初始化远程仓库)
git push origin <local_branch> 创建远程分支,origin是远程仓库名
git push origin <local_branch>:<remote_branch> 创建远程分支
git push origin:<remote_branch> 先删除本地分支(git br -d <branch>),然后再push删除远程分支

Git远程仓库管理 命令列表 说明
git remote -v 查看远程服务器地址和仓库名称
git remote show origin 查看远程服务器仓库状态
git remote add origin git@github:robbin/robbin_site.git 添加远程仓库地址
git remote set-url origin git@github.com:robbin/robbin_site.git 设置远程仓库地址(用于修改远程仓库地址)
git remote rm <repository> 删除远程仓库
创建远程仓库
- git clone --base robbin_site robbin_site.git  # 用带版本的项目创建纯版本仓库
scp -r my_project.git git@git.csdn.net:~  # 将纯仓库上传到服务器
- mkdir robbin_site.git && cd robbin_site.git && git --bare init # 在服务器创建纯仓库
git remote add origin git@github.com:robbin/robbin_site.git   # 设置远程仓库地址
git push -u origin master # 客户端首次提交
git push -u origin develop # 首次将本地develop分支提交到远程develop分支,并且track
git remote set-head origin master #设置远程仓库的HEAD指向master分支

写在最后 : 实践是检验灵活使用工具的唯一标准
教程推荐 : Git教程-廖雪峰

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • 简介 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 与常用的版本控制工具 ...
    闽越布衣阅读 2,737评论 0 18
  • git 使用笔记 git原理: 文件(blob)对象,树(tree)对象,提交(commit)对象 tree对象 ...
    神刀阅读 3,759评论 0 10
  • 这篇博文是自己在学习git过程中的思考总结。本文仅仅代表个人的看法,如有不妥地方还请本文文末留言。 😊 原文链接g...
    Ming_Hu阅读 1,060评论 4 18
  • 声明:这篇文章来源于廖雪峰老师的官方网站,我仅仅是作为学习之用 Git简介 Git是什么? Git是目前世界上最先...
    横渡阅读 3,946评论 3 27
  • 朋友整理的,放这里偶尔过来看看 一、基本介绍 首先,Git作为版本控制系统,他的原理与SVN为首的集中式版本控制系...
    allenzhan阅读 986评论 0 3