GIT使用(整理)

这篇东西是根据我以前写的思维导图整理得来的,大致收集了几种场景以供不时之需。

简要介绍

工作区和暂存区的定义

首先我们来看一下git的基本目录结构,在你转换一个普通目录以前,是看不到.git文件夹的,git init 之后就会产生,Linux或者Mac下属于隐藏文件夹,在Windows下容易Ctrl+A随手就删掉了,删除时留心一下。

  • 工作区(Working Directory):就是你在电脑里能看到的目录
  • 版本库(Repository):工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
    Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

HEAD指针

在Git中,用HEAD表示当前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

当执行git reset命令时,git会把老的HEAD拷贝到文件.git/ORIG_HEAD中,在命令中可以使用ORIG_HEAD引用这个commit.

常用命令

  • git status 查看当前状态
  • git add 把文件修改添加到暂存区
# 单独添加文件
git add README
# 添加所有更改的文件
git add .
  • git commit 把暂存区的所有内容提交到当前分支
# 在add完之后使用,提交修改
git commit -m "注释"
# 将在跟踪中的文件一次性提交
git commit -a -m "注释"
# 使用上一次的提交信息重新提交
git commit -a -c
  • git diff
# 对比工作区和版本库里面最新版本
 git diff HEAD -- filename
  • git reset

不同参数的说明:

A. --hard:重设(reset) index和working directory,自从<commit>以来在working directory中的任何改变都被丢弃,并把HEAD指向<commit>。

B. --soft:index和working directory中的内容不作任何改变,仅仅把HEAD指向<commit>。这个模式的效果是,执行完毕后,自从<commit>以来的所有改变都会显示在git status的"Changes to be committed"中。

C. --mixed:仅reset index,但是不reset working directory。这个模式是默认模式,即当不显示告知git reset模式时,会使用mixed模式。这个模式的效果是,working directory中文件的修改都会被保留,不会丢弃,但是也不会被标记成"Changes to be committed",但是会打出什么还未被更新的报告。

D.--merge:避免在回滚时清除working tree

E. --keep:把在某一版本之后的commit清除掉,但是保持working tree不变

  • git log
# 单行 精简显示commit记录
git log --pretty=oneline --abbrev-commit

还有一些美化的用法,可以百度一下。这里不讲了


接下来讲一下,使用git开发的各种情景。在搭建好git环境以后,可以针对各种情景快速熟悉git操作。

情景一: 创建版本库

如果你已经有一个项目文件夹或者创建一个空文件夹,进入文件夹创建本地Git仓库来进行版本管理。

# 创建文件夹
mkdir floder
# 进入文件夹
cd floder
# git初始化
git init

或者你可以clone一个远程仓库到本地。

# 存在远程仓库,从远程拷贝
git clone git@github.com:michaelliao/gitskills.git
# 关联到远程的空仓库
git remote add origin git@github.com:michaelliao/learngit.git
# 将本地版本仓库推送到远程仓库
git push origin mater

情景二:提交修改

修改readme.txt文件之后,提交到本地仓库。

# 添加readme.txt到缓存区
git add readme.txt
# 提交缓存区到版本库的当前支线
git commit -m "添加一个说明文件"

添加所有修改的文件,提交到本地仓库。

# 添加所有更改到缓存区
git add .
# 提交缓存区到版本库的当前支线
git commit -m "注释"

跳过暂存,直接提交所有修改到本地仓库。

# 直接提交本地的修改到当前支线
git commit -a -m "注释"

情景三:撤销文件最近一次修改

常常发现自己错误的修改了一下文件,而它偏偏又commit了,除了查看修改进行恢复,还可以直接恢复。

# 从暂存或者版本库恢复到修改前
git checkout -- readme.txt

readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

git checkout -- file命令中的--很重要,没有--,就变成了“创建一个新分支”的命令

情景四:发现当前的修改已经背离原意,一切回到当前版本

# 放弃当前工作区以及缓存区的修改,恢复到当前版本
git reset --hard HEAD

情景五:发现之前的提交都是错误的,回到正确的版本

# 放弃当前工作区以及缓存区的修改,恢复到上一个版本
git reset --hard HEAD^
# 放弃当前工作区以及缓存区的修改,恢复到上上个版本
git reset --hard HEAD^^
# 放弃当前工作区以及缓存区的修改,恢复到特定版本
git reset --hard SHA1

情景六:并行开发

# 从当前分支中新建分支feature1-1,并切换到feature1-1分支
git checkout -b  feature1-1
# 开发..
...
# 各种commit 之后,回到master分支
git checkout master
# 将feature1-1分支合并到master分支(合并分支时,如果可能,Git会用Fast forward模式,
# 但这种模式下,删除分支后,会丢掉分支信息;git log 看不到分支的提交历史)
git merge feature1-1
# 从当前分支中新建分支feature1-1,并切换到feature1-1分支
git checkout -b  feature1-1
# 开发..
...
# 各种commit 之后,回到master分支
git checkout master
# 将feature1-1分支合并到master分支(请注意--no-ff参数,表示禁用Fast forward:)
git merge --no-ff -m "merge with no-ff" feature1-1
# 将feature1-1分支的文件filename检出到当前分支
git checkout feature1-1 -- filename

情景七:发现最近的几次提交不属于当前支线,应该另辟一条支线

# 创建新的分支feature
git branch feature1
#放弃当前分支的3次版本修改
git reset --hard~3
#切换到feature1分支继续开发
git checkout feature1

情景八:提交之后,发现代码没有完整提交,想重新编辑后提交

# 最近一次提交代码到版本库
        git commit ...
# 保持working tree不变,回到上一个版本
git reset --soft HEAD^
# 修改文件
...
# 重新使用之前那次commit的注释、作者、日期等信息,
# 把所有修改、删除的文件(不含未跟踪文件)重新提交.
git commit -a -c ORIG_HEAD

情景九:放弃最近的几个版本,需要记录此次改变

# 放弃最近的三个版本,并生成一次commit
git revert HEAD~3
# 放弃最近的第五个到第二个(不包含),但不自动生成commit,仅仅修改index和working tree
git revert -n master~5..master~2

情景十:完成分支开发,删除分支

# 删除本地分支
git branch -d  feature1-1
# 删除远程分支
git branch -D feature1-1

情景十一:标签的使用

# 在当前支线的最近commit上打上"v1.0"的标签
git tag v1.0
# 在SHA1对应的commit上打上"v1.0"的标签
git tag v1.0 SHA1
# 查看标签V1.0的信息
git show v1.0

情景十二:当前开发工作还不能提交到版本库,但迫切开启fixbug支线

# 保存当前工作空间进栈
git stash
# 切换到主线,工作区的内容丢失
git checkout master
# 进行修复工作
...
# 重新切换到之前的支线dev
git checkout dev
# 列出栈中内容
git stash list
# 工作区的内容出栈
git stash pop
git stash apply stash@{0}
git stash drop stash@{0}

情景十三:多库项目独立管理

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

推荐阅读更多精彩内容