Git 版本控制学习

git 简介

  • git 是由 C 语言编写的分布式版本控制系统
  • 集中式版本控制系统: CVSSVN
    • 定义:先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器

git 安装

  1. Linux 上安装 Git
    DebianUbuntu Linux 使用 sudo apt-get install git 指令即可安装
  2. Mac OS X 上安装 Git
  • 方法一:安装 homebrew ,然后通过 homebrew 安装 Git ,具体方法请参考 homebrew 的文档:http://brew.sh/
  • 方法二:从 AppStore 安装 XcodeXcode 集成了 Git, 不过默认没有安装,你需要运行 Xcode ,选择菜单 Xcode -> Preferences ,在弹出窗口中找到 Downloads ,选择 Command Line Tools ,点 Install 就可以完成安装了

创建版本库

  1. 创建空目录: mkdir demo
  2. 初始化为 Git 可以管理的仓库: git init
  3. 将文件添加到版本库中
  • 首先在目录中创建一个文件 touch Readme.md
  • 然后将文件添加到仓库 git add Readme.md
  • 将文件提交到仓库 git commit -m "info"

版本管理

  1. 查看历史版本 git log
  • 觉得 git log 输出太多行,可执行 git log --pretty=oneline
  • 输出的大串字符为 commit id
  1. 版本回退 git reset
  • 回退到上一个版本 git reset --hard HEAD^
  • 查看回退后的文件 cat Readme.md
  • 此时执行 git log 可以看到少了最新的版本状态
  1. 找到回退前的最新版本
  • 命令行窗口未关闭:往上翻阅,直到找到最新的版本的 commit id ,执行命令 git reset --head **** 即可找回
  • 命令行窗口关闭: git reflog 可以查看自己的每一次命令,从输出得知最新的版本的 commit id
  1. 工作区和暂存区
  • 工作区有一个隐藏目录 .git , 是 Git 的版本库
  • Git 的版本库里存了很多东西,其中最重要的就是称为 stage (或者叫 index )的暂存区
  • Git 为我们自动创建的第一个分支 master ,以及指向 master 的一个指针叫 HEAD
  1. 管理修改
  • 执行操作:第一次修改 Readme.md -> git add -> 第二次修改 Readme.md -> git commit
  • 提示不能被提交,因为工作区的第二次修改并没有被放入暂存区, git commit 只能提交暂存区的修改,所以第二次的修改不会被提交
  • 提交后,可以执行 git diff HEAD -- Readme.md 命令可以查看工作区和版本库里面最新版本的区别
  • 正确做法:执行操作:第一次修改 Readme.md -> git add -> 第二次修改 Readme.md -> git add -> git commit
  1. 撤销修改
  • 对文件撤销修改: git checkout -- file
  • 首先,对错误的代码更改,然后将文件恢复到上一个版本的状态
  • 通过 git status 查看
  • 提示通过 git checkout -- Readme.md 可以丢弃工作区的修改
  1. 删除文件
  • 方法一: rm Readme.md ,此时工作区和版本库就不一致了, git status 命令会立刻告诉你哪些文件被删除
  • 方法二: git rm Readme.md ,此方法为从版本库中删除文件,然后通过 git commit -m "删除Readme.md" 提交

远程仓库

  1. 添加远程仓库
  • GitHub 新建一个 Git
  • 本地目录中执行 git remote add origin git@github.com:yourName/demo.git
  • 将本地库的内容推送到远程库中 git push -u origin master
  • 把本地库的内容推送到远程,用 git push 命令,实际上是把当前分支 master 推送到远程
  • 由于远程库是空的,第一次推送 master 分支时,加上了 -u 参数, Git 不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取时就可以简化命令
  1. 从远程库克隆
  • git clone git@github.com:yourName/demo.git

分支管理

  1. 创建、合并与删除分支
  • 创建 dev 分支,并切换到 dev 分支: git checkout -b dev ( -b 参数表示创建并切换)
  • git branch 命令查看当前分支,当前分支前面会标一个 *
  • 此时修改 Readme.md 文件并提交: git add Readme.mdgit commit -m "info"
  • 此时切换回 master 主分支: git checkout master
  • dev 分支的工作成果合并到 master 分支上: git merge dev
  • git merge 命令用于合并指定分支到当前分支
  • 合并完成后,可以放心地删除 dev 分支: git branch -d dev
  • 删除后,查看 branch ,就只剩下 master 分支: git branch
  1. 解决冲突
  • 创建 dev1 分支,并切换到 dev1 分支: git checkout -b dev1
  • 修改 Readme.md 文件并提交: git add Readme.mdgit commit -m "info"
  • 切换回 master 主分支: git checkout master
  • Git 会自动提示我们当前 master 分支比远程的 master 分支要超前1个提交
  • 修改 Readme.md 文件并提交: git add Readme.mdgit commit -m "info"
  • 此时: master 分支和 dev1 分支各自都分别有新的提交, Git 无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突
  • 尝试: git merge dev1Git 告诉我们, Readme.md 文件存在冲突,必须手动解决冲突后再提交, git status 也可以告诉我们冲突的文件
  • Git<<<<<<<,=======,>>>>>>> 标记出不同分支的内容,修改后保存: git add Readme.mdgit commit -m "info"
  • 用带参数的 git log 也可以看到分支的合并情况
  • 删除 dev1 分支: git branch -d dev1
  • git log --graph 命令可以看到分支合并图
  1. 分支管理策略
  • 合并分支时,如果 GitFast forward 模式,删除分支后,会丢掉分支信息;如果要强制禁用 Fast forward 模式, Git 就会在 merge 时生成一个新的 commit ,这样,从分支历史上就可以看出分支信息
  • 首先,仍然创建并切换 dev 分支:git checkout -b dev
  • 修改 Readme.md 文件并提交一个新的 commitgit add Readme.mdgit commit -m "info"
  • 切换回 mastergit checkout master
  • 准备合并 dev 分支,请注意 --no-ff 参数,表示禁用 Fast forwardgit merge --no-ff -m "merge with no-ff" dev
  • 合并后,我们用 git log 看看分支历史: git log --graph --pretty=oneline --abbrev-commit
  1. Bug 分支
  • 将未提交的代码通过 git stash 将当前工作现场“存储”起来: git stash
  • git status 查看工作区,是干净的,可以放心地创建分支来修复bug
  • 确定要在哪个分支上修复 bug ,假定在 master 分支上修复,创建临时分支: git checkout mastergit checkout -b issue-101
  • 现在修复 bug ,然后提交: git add Readme.mdgit commit -m "info"
  • 修复完成后,切换到 master 分支,并完成合并: git checkout master
  • 最后删除 issue-101 分支: git merge --no-ff -m "merged bug fix 101" issue-101
  • 回到dev分支干活: git checkout dev
  • git stash list 命令看刚才的工作现场存在哪
  • 工作现场还在, Gitstash 内容存在某个地方了,但是需要恢复一下,有两个办法:
    • 一是用 git stash apply 恢复,但是恢复后, stash 内容并不删除,你需要用 git stash drop 来删除
    • 二是用 git stash pop ,恢复的同时把 stash 内容也删了
  • 再用 git stash list 命令就看不到任何stash内容了
  • 可以多次 stash ,恢复的时候,先用 git stash list 查看,然后恢复指定的 stash ,用命令: git stash apply stash@{0}
  1. Feature 分支
  • 添加一个新功能时,新建一个feature分支: git checkout -b feature-vulcan
  • 开发成功后提交 : git add Readme.mdgit commit -m "info"
  • 切换 dev 分支,准备合并:git checkout dev
  • 如果客户脑子瓦特,又不要新功能了,删除新分支(丢弃一个没有被合并过的分支): git branch -D feature-vulcan
  1. 多人协作
  • 查看远程库的详细信息: git remote -v
  • 推送分支:把该分支上的所有本地提交推送到远程库
    • 推送时,要指定本地分支,这样, Git 就会把该分支推送到远程库对应的远程分支上: git push origin master
    • 如果要推送其他分支,比如 dev ,就改成: git push origin dev
  • 抓取分支:多人协作时,大家都会往 masterdev 分支上推送各自的修改
    • 如果推送失败,则因为远程分支比你的本地更新,需要先用 git pull 试图合并
    • 如果合并有冲突,则解决冲突,并在本地提交
    • 没有冲突或者解决掉冲突后,再用 git push origin <branch-name> 推送就能成功
    • 如果 git pull 提示 no tracking information ,则说明本地分支和远程分支的链接关系没有创建,用命令 git branch --set-upstream-to <branch-name> origin/<branch-name>
  • 在本地创建和远程分支对应的分支,使用 git checkout -b branch-name origin/branch-name ,本地和远程分支的名称最好一致,如 git checkout -b dev origin/dev
  • 建立本地分支和远程分支的关联,使用 git branch --set-upstream branch-name origin/branch-name,如 git branch --set-upstream-to=origin/dev dev
  1. Rebase
  • git log 命令查看: git log --graph --pretty=oneline --abbrev-commit
  • 提交历史分叉时,如果现在把本地分支 push 到远程,历史不能变成直线
  • 使用 git rebase 后提交,再用 git log --graph --pretty=oneline --abbrev-commit 查看,变成了一条直线

标签管理

  1. 创建标签
  • 在Git中打标签非常简单,首先,切换到需要打标签的分支上: git checkout master
  • 敲命令 git tag <name> 就可以打一个新标签
  • 可以用命令 git tag 查看所有标签,默认标签是打在最新提交的 commit 上的
  • 如果忘记打标签,找到历史提交的 commit id ,然后打上就可以了: git tag v0.9 f52c633
  • 再用命令 git tag 查看,标签不是按时间顺序列出,而是按字母排序的。可以用 git show <tagname> 查看标签信息: git show v0.9
  • 还可以创建带有说明的标签,用 -a 指定标签名, -m 指定说明文字: git tag -a v0.1 -m "version 0.1 released" 1094adb
  • 用命令 git show <tagname> 可以看到说明文字
  1. 操作标签
  • 如果标签打错了,也可以删除: git tag -d v0.1
  • 因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除
  • 如果要推送某个标签到远程,使用命令 git push origin <tagname>
  • 一次性推送全部尚未推送到远程的本地标签: git push origin --tags
  • 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除: git tag -d v0.9
  • 然后,从远程删除。删除命令也是 push ,但是格式如下: git push origin :refs/tags/v0.9
  • 要看看是否真的从远程库删除了标签,可以登陆 GitHub 查看

注:笔记为学习廖雪峰老师的官网:官网

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

推荐阅读更多精彩内容

  • 安装Git Git的下载地址:Git官网下载地址 Git本地仓库和命令 配置用户 下载完Git后,右键会有一个Gi...
    TokyoZ阅读 4,438评论 1 7
  • PS:小白的入门笔记,希望能有用,主要参考廖君Git教程 操作环境说明: github仓库 https://git...
    呆呆的张先生阅读 558评论 3 2
  • git 使用笔记 git原理: 文件(blob)对象,树(tree)对象,提交(commit)对象 tree对象 ...
    神刀阅读 3,714评论 0 10
  • 其实使用git已经有两年多时间了,但是对Git的概念一直懵懵懂懂,平时常用的命令就那么几个,而且大部分的时候都是直...
    Claire_wu阅读 572评论 0 5
  • “越长大越孤单,越长大越不安。”我高中前也听说过这句话,却在很久以后才真正理解“孤单”的含义。 我印象中的第一次孤...
    逸黎阅读 826评论 11 17