GitHub基础



一.git配置

优先级:--local > --global > --systemgit

用了--global这个参数,表示你这台机器上全部的Git仓库都会使用这个配置github

1.配置git用户名和邮箱

git config --global user.name        # 查看
git config --global user.name 用户名  # 修改
git config --global user.email       # 查看
git config --global user.email 邮箱   # 修改
git config -l #查看
git config --global core.quotepath false #git status 乱码解决

二.仓库

1.建立git仓库

git init 仓库名  #建立一个git仓库
git init        #将一个项目转化为使用git管理(建立.git目录)
git clone git185@192.168.1.411:./test185.git

示例:web

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j3rytJij-1581218159170)(…/Linux/pic/git-1.png)]bootstrap

目录结构:vim

project
|------.git
         |--------branches
         |--------config        #仓库的配置文件
         |--------description
         |--------HEAD
         |--------hooks
         |--------info
         |--------objects
         |--------refs

隐藏目录.git不算工做区,而是Git的版本库bash

2.查看仓库状态

git status

3.远程仓库

最先,确定只有一台机器有一个原始版本库,此后,别的机器能够“克隆”这个原始版本库,并且每台机器的版本库其实都是同样的,并无主次之分服务器

实际状况每每是这样,找一台电脑充当服务器的角色,天天24小时开机,其余每一个人都从这个“服务器”仓库克隆一份到本身的电脑上,而且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交app

GitHub就是提供Git仓库托管服务的,因此,只要注册一个GitHub帐号,就能够免费得到Git远程仓库,即Github为咱们的git仓库提供了一个远程仓库,有了这个远程仓库,妈妈不再用担忧个人硬盘了ssh

1)为本地与GitHub的通讯配置ssh

本地git仓库和GitHub上的远程仓库之间的传输是经过SSH加密的,因此,须要一点设置svg

  1. 建立ssh key

    ssh-keygen -t rsa -C "youremail@example.com"
  2. 登陆你的GitHub账号,Settings -> SSH and GPG keys -> new SSH key ,将id_rsa.pub的内容复制进去

为何GitHub须要SSH Key呢?由于GitHub须要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,因此,GitHub只要知道了你的公钥,就能够确认只有你本身才能推送

2)让本地git仓库和远程仓库同步

在有了本地git仓库后,还需建立对应的远程仓库

  1. 在GitHub上建立远程仓库(若是已有则省略)

  2. 为本地仓库设置远程仓库信息(若是同时须要为本地仓库添加多个远程仓库(若是github+码云),则能够将origin分别换成githubgitee,推送操做时也要修改origin。添加后,远程库的名字就是origin,这是Git默认的叫法,也能够改为别的,可是origin这个名字一看就知道是远程库)

    git remote add origin https://github.com/用户名/仓库名
    • 删除本地仓库的远程仓库信息git remote remove origin
    • 修改远端地址git remote set-url 新地址
    • 查看远程仓库信息git remote -v
  3. 将本地git仓库push到远程仓库

    # 因为远程库是空的,咱们第一次推送master分支时,加上了-u参数,Git不但会把本地的
    # master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master
    # 分支关联起来,在之后的推送或者拉取时就能够简化命令
    git push [-u] origin 分支名

并非必定要把本地分支往远程推送。哪些分支须要推送、哪些不须要呢?

  • master:主分支,要时刻与远程同步
  • dev:开发分支,团队全部成员都须要在上面工做,全部也须要与远程同步
  • bug:只用于在本地修复bug,就不必推送到远程了,除非老板要看看你每周修复了几个bug
  1. 直接修改配置文件:

  2. 进入 SingTel/.git 目录
    
    vim config
    
    修改 [remote “origin”]下面的url便可

4.协同工做

拉取分支:

git pull

git clone时,默认状况下只能看到本地的master分支。若是要在dev分支上开发,就必须建立远程origindev分支到本地,可使用以下命令建立本地dev分支:

git checkout -b dev

将本地dev分支与远程origin/dev分支关联起来:

git branch --set-upstream dev origin/dev

5.使用GitHub

Bootstrap的官方仓库twbs/bootstrap、你在GitHub上克隆的仓库my/bootstrap,以及你本身克隆到本地电脑的仓库,他们的关系就像下图显示的那样:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kuCmGEwH-1581218159171)(…/Linux/pic/git-2.png)]

若是你想修复bootstrap的一个bug,或者新增一个功能,马上就能够开始干活,干完后,往本身的仓库推送

若是你但愿bootstrap的官方库能接受你的修改,你就能够在GitHub上发起一个pull request。固然,对方是否接受你的pull request就不必定了


三.版本控制

隐藏目录.git不算工做区,而是Git的版本库。版本库里存了不少东西,其中最重要的就是称为stage(或者叫index)的暂存区。还有Git为咱们自动建立的第一个分支master,以及指向master的一个指针叫HEAD

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zDHBHGSp-1581218159171)(…/Linux/pic/git-3.png)]

1.添加或删除修改

  • 将修改添加到暂存区:
git add 文件/目录
  • 从暂存区删除修改:
git rm --cached 文件/目录
  • 如下命令能够将暂存区的修改重置,暂存区的改变会被移除到工做区:
git rest HEAD [文件名]
  • 如下命令能够丢弃工做区的修改:
git checkout -- [文件名]
  • 若是刚对一个文件进行了编辑,能够撤销文件的改变,回到编辑开始。命令其实起到“一键恢复”的做用,还可用于“误删恢复”。能够在 git reset HEAD [文件名] 后使用

2.提交版本

若是修改了readme.txt,添加了文件LICENSE,并将2者添加到暂存区后,暂存区的状态就变成这样:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZCbTAFCs-1581218159172)(…/Linux/pic/git-4.png)]

  • 使用commit提交修改,实际上就是把暂存区的全部内容提交到当前分支:
git commit -m '信息'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3NesbVEb-1581218159172)(…/Linux/pic/git-5.png)]

commit至关于游戏里面一次存档。对应一个版本

3.改动查询

git diff [选项]           # 查看工做区中的修改
git diff [选项] --staged   # 查看已添加到暂存区的修改
git diff [选项] HEAD       # 查看当前全部未提交的修改

选项:
 --color-words: 颜色
 --stat:        不显示具体修改,只显示修改了的文件

4.版本回退

git reset --hard 版本ID/HEAD形式的版本

git reset --hard HEAD      # 当前版本
git reset --hard HEAD^     # 上一个版本
git reset --hard HEAD^^    # 上上个版本
git reset --hard HEAD~n    # 前n个版本
git log --prtty=oneline	   # 查看最近到最远提交日志
git reset --hard 3628df	   # 回退版本号码:回退版本commit id为3628df
git reflog                 # 想要恢复:使用命令记录来找回commit id回退

若是回到过去的版本,想要回到原来新的版本:

  • 若是终端未关,能够找到新版本的id,经过上述命令回去新版本
  • 若是终端已关,git reflog查看版本,再经过上述命令回去新版本

5.查看历史提交

git log [选项]

选项:
 --online:只显示提交提示信息
 --stat:添加每次提交包含的文件信息
 --path:查看每次提交改变的内容
 --graph

加文件名能够显示具体文件相关的全部提交信息

四.文件控制

1.撤销修改

———>              git add files              git commit  
working directory--------------stage-------------history
<———         git checkout --files         git reset --files

2.删除文件

rm read.txt
(从版本库中删除)
git rm read.txt
git commit -m "delete"
(删错了)
git checkout -- read.txt

3.分支

(分支名字dev)
建立分支:git branch dev
切换分支:git checkout dev
建立+切换分支:git checkout -b dev
查看当前分支:git branch
切换回master分支:git checkout master
合并指定分支到当前分支:git merge dev
(fast-forward 快进模式)
删除分支:git branch -d dev

4.解决冲突

(分支名字fea)
冲突缘由:master和Dev同时增加。
git checkout -b fea
(修改Creating a new branch is quick AND simple.)
git add read.txt
git commit -m "fea"
git checkout master
(修改Creating a new branch is quick & simple.)
git addread.txt
git commit -m "master"
(此时造成了master和fea各自指着一个分支)
git merge fea
(合并错误,git status , cat read.txt能够查看)
(修改read.txt的文本内容 Creating a new branch is quick and simple.)
git add read.txt
git commit -m “conf”
(如今master和fea指向同一我的点了,git log可查看合并状况)
git branch -d fea

5.分支管理策略

(--no-ff)(分支名字dev 文件名字read.txt)
git checkout -b dev
git add read.txt
git commit -m "dev"
git checkout master
(注意下个参数--no-ff,表示禁用fast forward)
(fast forward合并看不出曾经作过合并,而--no-ff参数合并后的历史有分支,negative看出曾经作过合并)
git merge --no-ff -m "merge with --no-ff" dev
(查看分支历史 git log --graph --pretty=oneline --abbrev-commit)

6.bug分支

(bugg分支为要解决bug的分支)
思想:当手头还有工做时,先将工做现场git stash(避免bug修复好后将为完成的工做一块儿提交),而后修复bug、提交以后,在用git stash pop将原来的工做显示在工做区 。
(git status查看状态)
git stash
git checkout -b bugg
(修改bug后)
git add bugg.txt
git commit -m "fixed bug"
git checkout master
git merge --no-ff -m "merge bug" bugg
git branch -d bugg
(接下来回到dev上继续工做)
git checkout dev
(查看工做区git status)
(用git stash list查看)
git stash list
(恢复的第一种方法:恢复的同时把stash内容同时删除)
git stash pop
(恢复的第二种方法:恢复的同时不删除stash内容)
git stash apply
(若使用第二种方法想删除stash则用git stash drop)
(如果多个文件stash 可用git stash apply stash@{0}恢复指定的stash)

7.feature分支

(分支为dev)
(在没彻底完成合并时强行删除)
git branch -D dev

8.多人协做

(查看远程库信息)
git remote
(查看远程库更详细信息)
git remote -v
推送dev分支
git push origin dev

9.抓取分支

(克隆)
git clone git@github.com:TaylorApril/test.git
(查看能见分支 git branch)
(在dev分支上开发,建立远程origin的dev分支到本地)
git checkout -b dev origin/dev
(修改后,进行提交)
git commit -m "add"
git push origin dev
(在他提交以后你再push的状况时)
(指定本地dev分支与远程origin分支连接)
git branch
git pull
git commit -m "fixed"
git push

10.报错

报错1

$ git push -u origin master
To git@github.com:TaylorApril/test.git
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@github.com:TaylorApril/test.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.


解决:
git pull --rebase origin master
git push -u origin master
报错2

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)

解决:
git push