zoukankan      html  css  js  c++  java
  • git的学习笔记(一):git本地操作

    1.Git介绍

    • Git是一个开源的分布式版本控制软件,用以有效、高速的处理从很小到非常大的项目版本管理。
    • Git 最初是由Linus Torvalds设计开发的,用于管理Linux内核开发。
    • Git 是根据GNU的GPL(通用公共许可证)V2的条款分发的自由/免费软件,安装参见:http://git-scm.com/
    • Git本身可以做到版本控制,但其所有版本记录只能保存在本机,如果想要将文件内容以及版本记录同时保存在远程,则需要结合GitHub来使用。
    • GitHub是一个基于Git的远程文件托管平台(同GitCafe、BitBucket和GitLab等)。

    集中式版本控制系统与分布式版本控制系统的区别

    • 集中式

      版本库是集中存放在中央服务器,用户客户端只有文件的某个版本.
      需要的时候,用户先从中央服务器下载最新版本的文件到本地电脑,然后开始修改,修改完成后再把自己修改后的版本推送给中央服务器。
      集中式版本控制系统最大的毛病就是必须联网才能工作,如果客户端到中央服务器的网络不好的时候,就会很影响工作的效率.

    • 分布式

      远程服务器保存所有版本,用户客户端也可以保存所有版本
      分布式版本控制系统中每个人的电脑上都有一个完整的版本库.需要的时候,可以不需要联网,因为版本库就在你自己的电脑上。
      多人协同工作的时候,一个用户在自己电脑上改了文件A,另一个人在他的电脑上改了文件B,工作结束只需把各自的修改推送给对方,就可以互相看到对方的修改了。

    2. 配置git的用户信息

    git config --global user.name 'your_name'
    git config --global user.email 'your_email'
    

    git config的三个作用域

    缺省等同于local

    git config --local			# 只对某个git仓库有效
    git config --global			# global对当前用户所有仓库有效
    git config --system			# system对系统所有登录的用户有效
    

    显示config的配置,加--list

    git config --list --local
    git config --list --global
    git config --list --system
    

    3.git仓库管理

    3.1 初始化git仓库

    1.把已有的项目代码纳入git管理

    cd 项目代码所有文件夹
    git init
    

    2.新建的项目直接用git管理

    cd 某个文件夹
    git init your_project		# 会有当前路径下创建和项目名称同名的文件夹
    cd your_project
    

    3.2 往仓库里添加文件

    git add files       # 添加文件
    git add .           # 把工作区所有文件移动在暂存区
    git commit          # 提交信息,加上 -a 选项可以把暂存区里的所有文件都进行提交
    

    3.3 文件重命名和删除

    git mv old_file_name new_file_name
    git rm file_name
    

    3.4 通过git log查看版本演变历史

    查看版本演变历史的命令

    git log
    
    可添加的选项:
        --oneline       # 以每一行的方式查看当前分支的所有提交日志
        --pretty=online # 用commit id(版本号)显示修改记录,减少log文件的输出,使每条记录只输出一行
        -n4             # 以每一行的方式查看当前分支最近的4条提交日志
        --all           # 查看所有分支的提交日志
        --graph         # 以图形化方式查看提交日志
    

    可以通过gitk图形界面工具来查看版本历史

    3.5 查看git仓库的信息

    git status                      查看当前git仓库的状态
    git diff *                      检查上一次对文件所做的修改内容
    git log                         查看版本库的修改历史记录
    git reflog                      用来记录每一次命令(查询某次修改的版本号)
    

    3.6 git的区域状态说明

    工作区:

    工作区(word directory)就是在电脑上能看到的目录
    当前开发程序所在的目录为工作区,该区域的文件会有状态变化且状态由git自动检测
    目录中的文件的任何变化(增,删,改),git都会检测到,可以使用git status命令查看
    

    版本库:

    版本库(repository)工作区有一个隐藏目录.git,保存的就是git的版本库
    工作区检测到有文件发生变化,那么意味着文件状态被改变,这时就可以当做一个版本进行提交
    

    工作区的代码通过git add来加入到暂存区,使用git commit命令把暂存区的文件加入到当前分支的(一般为git自动创建master的分区)

    git的版本库中一个区域,称之为stage(或者叫index)的暂存区.
    在工作区的文件被修改,使用`git status`查看状态时,显示文件的颜色为红色
    使用`git add`把文件从工作区移到暂存区,再使用`git status`查看状态时,显示文件的颜色为绿色
    

    3.7 git区域操作

    git checkout --filename         撤销工作区的修改,把工作区的文件恢复到暂存区的状态
        如果文件修改后还未放到暂存区,撤消修改就回到未修改之前的状态
        如果文件修改后已添加到暂存区,撤消修改就回到添加进暂存区时的状态
    git reset HEAD filename         把暂存区的修改撤消掉,重新放回到工作区,这条命令是在把修改后的文件提交到暂存区之后又后悔了,使文件恢复到版本库的状态
    git reset HEAD                  取消暂存区所有文件
    git reset HEAD -- index.html    把暂存区中的index.html恢复成跟工作区一样,可以添加多个文件
    git checkout -- index.html      把工作区恢复成和暂存区一样
    git stash                       储存当前工作现场
    git stash list                  查看stash区域的所有信息
    git stash apply                 取出stash区域中的文件放到当前工作区,但是文件还保存在stash区域中,可以反复使用
    git stash drop                  删除最近一次储存的stash
    git stash pop                   取出stash区域中的文件放到当前工作区中,文件不会继续保存到stash区域中
    git stash stash@{num}           恢复指定stash
    
    • 注意

      • 若误删文件时,使用git checkout --filename 来恢复到未删除之前的状态
      • 确实要删除一个文件,使用git rm filename将其从git版本库中删除
      • git checkout和git reset都是在将文件add到暂存区,没有commit时的撤消修改
      • 若已经将文件从暂存区commit到版本库而未推送到远程时,可以回退到上一个版本
      • 若文件已经被推送到远程,则无法撤消

    需要注意的是,git是对文件更改的管理,不是基于文件的管理

    4.git分支及合并操作

    git branch                                  # 查看当前分支并且看到在哪个分支下工作
    git branch -v                               # 查看本地git分支
    git branch -av                              # 查看所有分支及其详细信息,如果添加远程仓库,会显示远程仓库上的分支
    git branch dev                              # 创建一个dev分支
    git checkout -b dev                         # 创建dev分支并切换到dev分支上工作
    git checkout -b temp 5ccb4b3                # 基于5ccb4b3这个版本创建一个temp的分支
    git checkout -b branch2 branch1             # 基于branch1分支创建并切换到branch2分支
    git checkout dev                            # 切换到dev分支
    git checkout master                         # 切换回master分支
    git branch -d dev                           # 删除dev分支,删除分支时,分支相关的信息也会被删除
    git branch -D branch_name                   # 删除指定分支,删除分支时,分支相关的信息也会被删除
    git checkout --*                            # 把文件返回到修改之前的状态
    git merge dev                               # 把dev分支合并到当前分支
    git merge --no-ff -m "commit_message" dev   # 不使用fast forward模式合并dev分支到当前分支
    

    需要注意的是:

    • 1.合并分支的时候如果出现冲突,那么将会出现冲突提醒,此时修改文件,解决冲突后再次提交就可以了
    • 2.可以使用git log或者git log --graph指令来查看分支与分支合并情况
    • 3.通常在合并分支时,一般都是用fast forward模式,但是不能执行快速合并而且不会起冲突,这时合并之后就会做一次新的提交.
    • 4.当基于某个远程分支创建并切换到新的分支修改并commit之后,如果要提交到远程分支时,可以直接使用 git push 把本地分支的修改同步到远程仓库的指定分支(如果不是基于远程master分支创建则同步到远程仓库时也会同步到远程非master分支)
    • 5.修复bug时,需要新建并切换到bug分支.bug修复并提交后,合并到主分支,然后将临时bug分支删除.此时把临时bug分支快速合并到主分支后,临时bug分支里的提交信息就会消失,此时可以不使用快速合并,使用递归合并的方式将临时bug分支提交到主分支,这样临时bug分支里的提交信息也可以保留

    5.版本回退

    git reset --hard HEAD^          回退到上一个版本
    git reset --hard HEAD^^         回退到上两个版本
    git reset --hard 123456         回退到版本号为123456的版本
    git reset --hard commit_id^     回退到指定commit_id的版本
    
    • 注意

      • HEAD^为上上一个版本,HEAD表示当前版本
      • 使用git reset命令回退后,再使用log命令将只能获得当前HEAD版本之前的版本,此时可以使用git reflog找到比当前版本新的版本的commit id就可以回滚回去了
      • log命令可以查看提交历史,reflog可以查看命令历史

    6.忽略文件的推送

    有的时候,提交推送的时候不想提交某些文件,此时可以在这个项目根目录下新建一个名为.gitignore的文件,

    在这个文件里可以进行配置提交的时候忽略哪些文件,配置使用正则表达式的形式.
    比如:

    *.py                忽略所有的以py结尾的文件
    test/a.*            忽略test目录下所有的以a开头的文件
    test/[abc].py       忽略test目录下a.py或b.py或c.py这三个文件
    [abc]               忽略根目录下a或b或c这三个文件
    test/*              忽略test目录下的所有文件
    !test/a.py          忽略test目录下不是a.py以外的所有文件,即只提交a.py这个文件
    

    配置完成后,需要清除本地缓存,然后再次提交.

    清除本地缓存的命令:

    git rm -f --cached .
    

    7.git diff命令

    git diff                                    # 比较工作区和暂存区所有文件的差异
    git diff 3c6fab966158f9 72ec71f3c2aa        # 比较两次提交的差异
    git diff HEAD HEAD~1                        # git上一次提交与上上一次提交的差异
    git diff HEAD HEAD^1^1                      # git上一次提交与前两次提交的差异
    git diff HEAD HEAD~2                        # git上一次提交与前两次提交的差异
    git diff HEAD HEAD^1                        # git上一次提交与上上一次提交的差异
    git diff HEAD HEAD^1 -- index.html          # git上一次提交与上上一次提交中index.html文件的不同
    git diff -- index.html                      # 比较工作区和暂存区中的index.html文件的差异
    git diff --cached                           # 修改文件后,把修改的文件添加到暂存区中,查看暂存区和HEAD文件的差异
    git diff master dev                         # 比较master分支和dev分支的差异
    git diff master dev -- index.html           # 比较index.html文件在master分支和dev分支的差异
    

    两个分支的位置不同,显示文件的加减是不同的

    8.修改提交的commit

    git commit --amend                      # 修改最新提交的commit信息
    

    9.git rebase操作

    9.1 修改任何commit的message信息的步骤

    1.列出所有的提交日志

    git log --oneline               # 每行显示一条提交记录
    git log --pretty=oneline
    gitk                            # 图形化显示所有提交记录
    

    2.进入修改交互模式

    git rebase -i 版本号 
    

    这里的版本号为:要修改提交信息的版本号的上一个版本号。例如:按提交顺序从1到6,如果想修改版本4的提交信息,则此处的版本号应该为第3个版本号
    3.进入交互模式后,会有如下提示:

    # p, pick <commit> = use commit
    # r, reword <commit> = use commit, but edit the commit message
    # e, edit <commit> = use commit, but stop for amending
    # s, squash <commit> = use commit, but meld into previous commit
    # f, fixup <commit> = like "squash", but discard this commit's log message
    # x, exec <command> = run command (the rest of the line) using shell
    # d, drop <commit> = remove commit
    # l, label <label> = label current HEAD with a name
    # t, reset <label> = reset HEAD to a label
    # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
    

    并列出在进入交互式模式时输入的版本号后的所有提交信息,把想修改的信息之前的pick修改为 r 或者 reword,然后:wq保存并退出

    此时会打开想修改的commit的message信息,按vim编辑器的用法修改保存就可以
    4.查看修改之后的commit message

    git log --oneline
    

    前提是必须要配置全局用户名和用户邮箱

    9.2 把连续的多个commit合并成一个commit

    1.查看所有提交记录

    git log --oneline
    

    2.进入git交互式模式

    git rebase -i 版本号
    

    这里的版本号为:要修改提交信息的版本号的上一个版本号。例如:按提交顺序从1到6,如果想合并版本4和版本5的提交信息,则此处的版本号应该为第3个版本号
    3.进入交互模式后,会有如下提示:

    # p, pick <commit> = use commit
    # r, reword <commit> = use commit, but edit the commit message
    # e, edit <commit> = use commit, but stop for amending
    # s, squash <commit> = use commit, but meld into previous commit
    # f, fixup <commit> = like "squash", but discard this commit's log message
    # x, exec <command> = run command (the rest of the line) using shell
    # d, drop <commit> = remove commit
    # l, label <label> = label current HEAD with a name
    # t, reset <label> = reset HEAD to a label
    # m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
    

    并列出在进入交互式模式时输入的版本号后的所有提交信息,把被合并的版本号的commit信息前的pick换成 s 或 squash,然后保存并退出

    此时会打开合并后的commit提交信息窗口,按vim编辑器的用法修改保存就可以

    4.查看修改之后的commit message

    git log
    

    可以看到把多个commit合并成一个commit后,所有提交的版本号都改变了

    例子:现在有多次提交的版本号v1,版本号v2,版本号v3,版本号v4,版本号v5,版本号v6,想把v2和v3,v4这三次提交合并成一个新的提交,操作步骤:

    git rebase -i v1
    在打开的文件中,把v2和v3前面的pick修改成s,然后保存并退出
    在新打开的窗口中,把未注释的行的内容修改为合并后想要的新内容,然后保存并退出
    使用git log命令查看,就可以看到合并后的提交信息了
  • 相关阅读:
    WCF 第四章 绑定 在多个绑定上暴露一个服务契约
    WCF 第五章 行为 事务跨操作事务流
    WCF 第五章 导出并发布元数据(服务行为)
    WCF 第五章 行为 通过配置文件暴露一个服务行为
    WCF 第五章 不支持会话的绑定的默认并发和实例
    WCF 第五章 并发和实例(服务行为)
    WCF 第五章 行为 总结
    WCF 第四章 绑定 绑定元素
    WCF 第五章 行为 事务之选择一个事务协议OleTx 或者WSAT
    WCF 第四章 绑定 比较各种绑定的性能和可扩展性
  • 原文地址:https://www.cnblogs.com/renpingsheng/p/7553552.html
Copyright © 2011-2022 走看看