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 [email protected]:yourName/demo.git
  • 将本地库的内容推送到远程库中 git push -u origin master
  • 把本地库的内容推送到远程,用 git push 命令,实际上是把当前分支 master 推送到远程
  • 由于远程库是空的,第一次推送 master 分支时,加上了 -u 参数, Git 不但会把本地的 master 分支内容推送的远程新的 master 分支,还会把本地的 master 分支和远程的 master 分支关联起来,在以后的推送或者拉取时就可以简化命令
  1. 从远程库克隆

分支管理

  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 推送就能成功
    • 如果 git pull 提示 no tracking information ,则说明本地分支和远程分支的链接关系没有创建,用命令 git branch --set-upstream-to origin/
  • 在本地创建和远程分支对应的分支,使用 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 就可以打一个新标签
  • 可以用命令 git tag 查看所有标签,默认标签是打在最新提交的 commit 上的
  • 如果忘记打标签,找到历史提交的 commit id ,然后打上就可以了: git tag v0.9 f52c633
  • 再用命令 git tag 查看,标签不是按时间顺序列出,而是按字母排序的。可以用 git show 查看标签信息: git show v0.9
  • 还可以创建带有说明的标签,用 -a 指定标签名, -m 指定说明文字: git tag -a v0.1 -m "version 0.1 released" 1094adb
  • 用命令 git show 可以看到说明文字
  1. 操作标签
  • 如果标签打错了,也可以删除: git tag -d v0.1
  • 因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除
  • 如果要推送某个标签到远程,使用命令 git push origin
  • 一次性推送全部尚未推送到远程的本地标签: git push origin --tags
  • 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除: git tag -d v0.9
  • 然后,从远程删除。删除命令也是 push ,但是格式如下: git push origin :refs/tags/v0.9
  • 要看看是否真的从远程库删除了标签,可以登陆 GitHub 查看

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

你可能感兴趣的:(Git 版本控制学习)