Git学习总结

Part 1 Git基本介绍

版本控制基本功能

所有的版本控制系统,只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了什么内容,版本控制系统不知道,也没法知道。

Git优势

  1. 适合分布式开发,每一个个体都可以作为服务器。每一次Clone就是从服务器上pull到了所有的内容,包括版本信息。
  2. 公共服务器压力和数据量都不会太大。
  3. 速度快、灵活,分支之间可以任意切换。
  4. 任意两个开发者之间可以很容易的解决冲突,并且单机上就可以进行分支合并。
  5. 离线工作,不影响本地代码编写,等有网络连接以后可以再上传代码,并且在本地可以根据不同的需要,本地新建自己的分支。
  6. 在本机可以对同一个文件将它进行签出及修改,并在最终签入时,选择保留哪一段代码,如果在同一文件同一行有冲突时,可以对冲突进行选择保留哪一个版本。
  7. 免费。

Part 2 Git基本操作

本地操作

创建版本库

  • Step 1: 创建项目目录,进入目录。

    $ mkdir myproject
    $ cd myproject
    
  • Step 2: 初始化本地仓库。

    myproject $ git init
    myproject $ git add .
    myproject $ git commit -m "add myproject"
    

提交添加和修改操作

  • Step 1: 添加项目文件。创建文件example.txt,输入文本This is an example.

  • Step 2: 提交修改。

    myproject $ git add example.txt
    myproject $ git commit -m "add example.txt"
    

查看仓库状态

  • 可以随时查看仓库的状态

    myproject $ git status
    
  • 若仓库状态告知有修改,可以使用下属命令查看具体修改内容

    myproject $ git diff example.txt
    

版本退回

  • Step 1: 查看版本记录。使用--pretty=oneline参数使显示更简洁。

    myproject $ git log --pretty=oneline
    
  • Step 2: HEAD表示当前版本,HEAD^表示上一版本,HEAD^^表示上上一版本,往上100个版本HEAD~100

    # 退回上一版本
    myproject $ git reset --hard HEAD^
    # 退回上上一个版本
    myproject $ git reset --hard HEAD^^
    

    或者通过git log查看提交历史,找到每个版本的commit id,如xxxxx...,xxxxxcommit_id的前5位,则可以退回到xxxxx...对应的版本

    myproject $ git reset --hard xxxxx
    

    若想再次返回到最新版,但却找不到最新版的commit id,则使用以下命令查看命令历史

    myproject $ git reflog
    

    找到最新版本的commit id,再次使用git reset --hard commit_id即可返回最新版本

对比工作区文件与版本库最新版本

  • 查看工作区和版本库里面最新版本的区别

    myproject $ git diff HEAD -- example.txt
    

撤销操作

  • Scenario 1: 当改乱了工作区某个文件的内容,想直接丢弃工作区的修改时

    myproject $ git checkout -- example.txt
    
  • Scenario 2: 当不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步

    • 使用以下命令回到Scenario 1
    myproject $ git reset HEAD example.txt
    
    • 按照Scenario 1中的命令撤销操作
  • Scenario 3: 在没有推送到远程库而已经提交了不合适的修改到本地版本库时,想要撤销本次提交, 参考版本退回*操作。

删除文件

  • Step 1: 删除文件

    myproject $ rm example.txt
    
  • Step 2.1: 确认删除

    myproject $ git rm example.txt
    myproject $ git commit -m "remove example.txt"
    
  • Step 2.2: 撤销删除,把误删的文件恢复到最新版本。

    myproject $ git checkout -- example.txt
    

    git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除

分支管理

  • 查看当前分支

    $ git branch
    
  • 创建分支

    $ git branch <branch_name>
    
  • 切换分支

    $ git checkout <branch_name>
    
  • 创建分支并切换

    $ git checkout -b <branch_name>
    
  • 删除分支

    # 无修改或完成所有提交下
    $ git branch -d <branch_name>
    # 有修改或有未完成的提交,需要强行删除
    $ git branch -D <branch_name>
    
  • 合并分支,合并指定分支到当前分支

    $ git merge <branch_name>
    
  • 查看分支合并情况

    $ git log --graph --pretty=oneline --abbrev-commit
    
  • 普通模式合并。合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。

    $ git merge --no-ff -m "some infos" <branch_name>
    
  • 储存当前工作区。当前工作尚未提交,但又接到比较紧急的任务,需要储存当前工作区,在完成紧急任务后读取之前储存的工作区,继续工作。

    • 储存工作区
    $ git stash
    
    • 查看所储存的工作区
    $ git stash list
    
    • 恢复工作区

      • 恢复后,stash内容不删除,需要手动删除
      # 恢复
      $ git stash apply
      # 删除
      $ git stash drop
      
      • 恢复切自动删除stash中的内容
      $git stash pop
      
      • 若储存了多个工作区,需要先使用git stash list查看stash内容,再使用下列命令恢复
          git stash apply stash@{0}
      

解决冲突

在当前分支修改了一文件,在某一分支对同一文件的同一地方做了修改,当把该分支合并到当前分支时,由于是对同一个文件的同一个地方做了修改,会发生冲突。

解决方案:修改当前分支的文件,使其结果与合并后的相同,再提交。

标签管理

  • 新建标签

    # 默认为HEAD
    $ git tag <tagname>
    # 可以指定 commit id
    $ git tag <tagname> commit_id
    
  • 指定标签信息

    $ git tag -a <tagname> -m "some infos"
    
  • 查看所有标签

    $ git tag
    
  • 删除标签

    # 删除本地标签
    $ git tag -d <tagname>
    # 删除远程仓库标签
    $ git tag -d <tagname>
    $ git push origin :refs/tags/<tagname>
    
  • 推送某个标签到远程

    # 推送标签到远程
    $ git push origin <tagname>
    # 推送全部未推送过的本地标签
    $ git push origin --tags
    

忽略特殊文件

当出于保密等需求需要保留一些文件不推送它们时,需要使用忽略特殊文件。

  • Step 1: 在项目根目录下新建文件.gitignore
  • Step 2: 将需要忽略的文件名或后缀添加在.gitignore

官方标配.gitignore文件: https://github.com/github/gitignore

  • 需要强制加入被忽略的文件

    $ git add -f <file>
    

本地-远程交互操作

与远程库建立联系

  • Step 1: 生成密钥,可以全部设置为默认值。

    $ cd
    ~ $ ssh-keygen -t rsa -C "email@domain.com"
    
  • Step 2: 复制明码到远程仓库

    ~ $ cat .ssh/id_rsa.pub
    

    id_rsa.pub中的内容复制,登陆远程仓库如github.com,建立新的密钥,建立完成后可以直接通过命令行推送本地仓库到远程仓库。

添加远程仓库

  • Step 1: 在远程仓库新建Repository名为myproject

  • Step 2: 把一个已有的本地仓库myproject与远程仓库的myproject关联。

    $ git remote add origin git@github.com:Account/myproject.git
    

    其中,AccountGithub账户名,origin为远程库的默认名字

  • Step 3: 把本地仓库的所有内容推送到远程库上

    $ git push -u origin master
    

    使用git push命令把当前分支master推送到远程origin中。参数-u,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来。

  • Step 4: 完成本地提交后,使用以下命令将本地master分支的最新修改推送至Github

从远程库Clone到本地库

  • Step 1: 准备好远程库的仓库,如,account/myproject

  • Step 2: 将远程库account/myproject克隆到本地

    $ git clone git@github.com: account/myproject
    

从本地仓库推送(push)到远程仓库

  • 已经关联远程库origin,需要将本地仓库的分支同步到远程仓库的分支

    $ git push origin <branch_name>
    

从远程仓库拉回(pull)到本地仓库

  • 已经关联远程库origin,需要将远程仓库的分支同步到本地仓库的分支

    $ git pull origin master
    

远程仓库操作

  • 查看远程仓库名字

    $ git remote
    
  • 查看远程仓库详细信息

    $ git remote -v
    
  • 删除已关联的远程仓库

    # origin为远程仓库名字
    $ git remote rm origin
    
  • 关联多个远程仓库。假设当前没有任何关联的远程仓库。

    # 先关联Github的远程仓库
    $ git remote add github git@github.com: Acount/repository_name.git
    # 再关联Gitee的远程仓库
    $ git remote add gitee git@gitee: Acount/repository_name.git
    # 推送到Github 
    $ git push github master
    # 推送到Gitee
    $ git push gitee master
    

Part 3 使用Git开发常见工作流

开源多人协作

  • Step 1: 选择远程仓库,如github.com,gitee.com等,注册公用账户,新建项目Repository,将本地仓库与远程仓库建立联系,将本地代码推送到远程。详细操作步骤参阅Part 2中的本地-远程交互操作远程库建立联系添加远程仓库小节。
  • Step 2: 每个开发者在相同的远程仓库注册个人账户,将远程仓库Clone到本地库。详细步骤参阅Part 2中的本地-远程交互操作从远程库Clone到本地库小节。
  • Step 3: 远程仓库的master分支一般为发行版,或稳定版;新建分支dev为开发版,各个开发者在开发过程中推送本地的dev到远程,项目管理人定期或不定期从dev中更新master
  • Step 4: 开发者试图用git push origin <branch-name>推送自己的修改。
  • Step 5: 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;如果合并有冲突,则解决冲突,并在本地提交。
  • Step 6: 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功。
  • Step 7: 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>

闭源多人协作

与前文开源多人协作的不同之处是,闭源多人协作需要搭建私有Git服务器。搭建Git服务器需要准备一台运行Linux的机器,推荐使用Ubuntu。

  • Step 1: 安装git

    $ sudo apt-get install git
    
  • Step 2: 创建一个git用户,用来运行git服务

    $ sudo adduser git
    
  • Step 3: 创建证书登录。收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。此步骤原理类似前文本地-远程交互操作中的与远程库建立联系

  • Step 4: 初始化仓库。选定一个目录作为Git仓库,如/srv/sample.git

    $ cd /srv
    srv $ sudo git init --bare sample.git
    # 限制用户直接登录服务器修改仓库
    srv $ sudo chown -R git:git sample.git
    
  • Step 5: 出于安全考虑,禁用shell登陆。编辑/etc/passwd文件完成。找到类似下面的一行:

    git:x:1001:1001:,,,:/home/git:/bin/bash
    

    修改为

    git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
    

    则git用户可以正常通过ssh使用git,但无法登录shell。

之后步骤同前开源多人协作中的Step 2~Step 7

个人开发

个人开发单纯基于本地仓库,不涉及到与远程仓库的交互。

  • Step 1: 选择项目目录myproject,初始化仓库,详情参阅前文本地操作中的创建版本库
  • Step 2: 其他操作诸如添加、删除、修改新文件、添加新特性、修改bug等参考前文本地操作

Part 4 参考资料

站在巨人的肩膀上学习。

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

推荐阅读更多精彩内容

  • 安装Git Git的下载地址:Git官网下载地址 Git本地仓库和命令 配置用户 下载完Git后,右键会有一个Gi...
    TokyoZ阅读 4,485评论 1 7
  • Git for windows 本文只是自己的一些学习总结,方便自己查看,如果对您阅读不适,抱歉!!! 常用命令(...
    Lxs_597阅读 329评论 0 0
  • 昨天开始学习git,摸索一天,记下若干要点,权当学习笔记,以备查漏补缺。 GIT配置 ** 安装 **window...
    风间莫一阅读 207评论 2 1
  • Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一)。作为一个开发者,git这样的技能基本上是...
    ikook阅读 2,874评论 12 129
  • 有一天, 恰恰在追问麻麻, 到底喜欢什么虫子? 于是,一场爆笑问答开始啦! 麒羽的麒言妙羽, 有文、有画、有故事、...
    麒羽记阅读 304评论 0 3