zoukankan      html  css  js  c++  java
  • git和github的基本使用(1)

    简介

    • svn是集中式版本控制,git是分布式版本控制
    • 为什么需要版本控制?
      • 版本控制,记录某个历史的状态,然后根据某个历史状态进行处理,比如回退某个版本;
      • 团队协作时,可以使用版本控制来记录不同人对文件的操作
    • 集中式版本控制:文件和版本信息是存储在服务端,如果服务端宕机的话会出现历史数据丢失的问题(即单点故障问题)
    • 分布式版本控制:本地、服务器都可以记录版本历史,可以避免单点故障问题。

    团队内部协作

    1. 项目经理在"代码托管中心"(比如:github)中创建一个仓库,然后将自己本机的仓库push过去
    2. 程序员就可以通过"代码托管中心"获取仓库中的代码、然后提交自己的代码(不过这个过程需要项目经理授权才可以操作)
    3. 项目经理和其他程序员可以通过"代码托管中心"获取仓库中的代码

    跨团队协作

    项目经理安排了一项内容给程序员A,但是程序员A不知道如何处理,想找程序员B帮忙,程序员B则需要先复制项目(fork)、然后下拉到本地(clone)、然后提交自己的代码(push)、然后通过“远程仓库”的pull request给项目经理的仓库,项目经理对提交的代码进行合并,然后项目经理程序员A就可以通过pull下拉代码。比如:linux系统开源,如果使用过程中遇到问题可以向项目提供修复的代码,然后等待项目审核人进行审核

    git相关命令

    本地库初始化

    git init
    
    • 生成.git目录,记录本地库的相关信息,不要动

    本地库配置

    作用:配置开发人员的身份信息,方便在后续向“代码管理中心”提交内容时记录谁去提交

    局部配置

    仅当前项目有效

    配置用户名和email信息

    git config user.name maomao1
    git config user.email maomao1@qq.com
    

    查看配置

    # 方式1 
    cat .git/config
    # 方式2:git config --get name值
    git config --get user.name
    

    全局配置

    为本机进行配置

    配置用户名和email信息

    git config --global user.name maomao2
    git config --global user.email maomao2@qq.com
    

    查看配置

    cat ~/.gitconfig
    

    基本命令

    • 查看工作区、暂存区状态
    git status
    
    • 将文件添加到暂存区
    git add hello.txt
    
    • 从暂存区撤销回到工作区
    git rm --cached hello.txt
    
    • 将文件从暂存区提交到本地仓库
    # 进入vim编辑器进行提交文件说明
    git commit hello.txt
    
    # 不进入vim编辑器进行提交文件说明
    git commit -m "add hello.txt"
    
    • 查看版本历史记录

    如果版本历史记录很多的话,可以按空格向下翻页;按b向上翻页;

    q退出

    # 方式1
    git log
    # 方式2,简化显示版本历史记录、并使用长的hash值
    git log --pretty=oneline
    # 方式3,简化显示版本历史记录、并使用短的hash值
    git log --oneline
    # 方式4,HEAD@{移动到当前版本需要多少步}
    git reflog
    
    • 查看具体命令的使用
    # 语法:git help 具体的命令
    git help reset
    

    git reset命令参数

    git reset --soft 124de7c
    
    • 使用--soft参数,本地库的指针发生变化,但是文件区和暂存区的指针不会发生变化
    • 使用--mixed,文件的内容不会变化,但是暂存区和本地库会同时移动指针,而工作区不移动指针

    比较文件

    git diff aa.txt   # 将工作区和暂存区中的文件内容差异,如果删除则使用`-`,如果新增则使用`+`
    git diff HEAD aa.txt    #和本地库中的HEAD进行比较。可以和本地库的某个版本进行比较
    git diff HEAD  #比较暂存区和本地库中有文件差异的内容
    

    分支

    • 默认创建的分支是master分支,在新增功能、修复bug等不想影响原有的master分支,所以我们需要另外创建一个新的分支来进行工作
    • 一般分支名我们会起名为feature_xx;针对bug处理的分支,一般命名为hot_fix
    • 分支的好处:可以进行多个功能的开发,相互独立,互不影响;
    # 查看所有分支
    git branch -v 
    
    # 创建分支
    git branch hot_fix
    
    # 切换分支
    git checkout hot_fix
    

    情景1:合并分支不产生冲突的情况下

    创建hot_fix分支修复master分支中的bug

    # 创建分支,并切换到对应的分支下
    git branch hot_fix
    git checkout hot_fix
    
    # bug修复,并提交到本地库
    vi hello.txt
    git add hello.txt
    git commit -m "fix hello.txt"
    
    # 切换到master分支,将hot_fix分支的内容合并到当前分支
    git checkout master
    git merge hot_fix 
    

    情景2:合并分支产生冲突

    什么情况下会产生冲突?当修改同一个文件的同一行时

    # hot_fix分支上修改aa.txt第N行的内容
    git branch hot_fix
    vi aa.txt
    git add aa.txt
    git commit -m "update aa.txt by hot_fix"
    
    # 切换到master分支修改aa.txt第N行的内容
    git branch master
    vi aa.txt
    git add aa.txt
    git commit -m "update aa.txt by master"
    
    # 尝试合并分支
    git checkout hot_fix
    git merge master   
    # 冲突代码调整,然后重新提交到本地库
    vim aa.txt   
    git add aa.txt
    git commit -m "resolve confict"    注意:这里不能带有文件名
    

    注意:

    • 分支合并遇到报错时,命令行的分支名会变为"xx|yyy"这种形式
    • 分支冲突后,冲突的文件会在冲突的地方会有标记,我们需要对冲突的地方进行代码的调整。因为git不知道怎么做处理

    应用场景

    工作区文件添加到本地仓库

    git add hello.txt
    git commit -m "add hello.txt"
    

    版本回退或前进

    版本控制是由HEAD指针进行控制

    方式1:基于索引值操作【推荐】

    # 语法:git reset --hard 索引值
    git reset --hard 124de7c
    

    注意:

    • git log --pretty=onelinegit log --oneline只会记录当前版本之前的历史版本记录(即只显示历史,不显示将来)
    • git loggit reflog可以记录当前版本之前或者后的历史版本记录

    方式2:使用^符号,这种只能进行版本后退

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

    注意:HEAD后面有多少个^,就回退多少个版本

    方式3:使用~符号,回退指定个数的版本

    # 回退到前两个版本
    git reset --hard HEAD~2
    

    方式4:使用@{n}来回退或者前进到某个版本

    git reflog
    git reset --hard HEAD@{5}
    

    删除文件后找回

    删除文件

    git rm a.txt
    
    • 如果已经提交到本地库,则使用git reset --hard 指定的版本回退删除文件前的一个版本。

    • 如果还未提交到本地库,则使用git reset --hard HEAD更新当前工作区、暂存区、本地库的指针,这样本次修改则无效

  • 相关阅读:
    hdu 5387 Clock (模拟)
    CodeForces 300B Coach (并查集)
    hdu 3342 Legal or Not(拓扑排序)
    hdu 3853 LOOPS(概率DP)
    hdu 3076 ssworld VS DDD(概率dp)
    csu 1120 病毒(LICS 最长公共上升子序列)
    csu 1110 RMQ with Shifts (线段树单点更新)
    poj 1458 Common Subsequence(最大公共子序列)
    poj 2456 Aggressive cows (二分)
    HDU 1869 六度分离(floyd)
  • 原文地址:https://www.cnblogs.com/it774274680/p/15095314.html
Copyright © 2011-2022 走看看