一、什么是GitHub ?

svn:中央服务器的单点故障 (服务器宕机)
git——linus:分布式版本控制系统(去中央化服务器)

  • 记录版本的索引而不是差异,快速回溯到指定版本。

【Git】 == 分布式版本控制工具
【GitHub】 == 代码托管
  Gitee:码云
  GitLab:局域网内的GitHub

工作区:放project 的地方 git add
暂存区:git commit后就有历史版本
本地库:历史版本 推送远程库push
远程库: 代码托管中心 git remote

Git Bash Here :进入github终端

二、git常用命令 ——本地库自己玩

基本命令

$ git --version
$ clear

$ git init 
(指定目录下初始化git,指针指向master分支)

$ git status
(标红的是未被追踪的文件,在工作区)

$ git config --global user.name "XXX"
$ git config --global user.email "will@qq.com"
$ git add xxx
$ git commit -m "这是分支x" xxx
【查看文件 ——Linux】
vim haha.txt 		//新建文件
ll  				//(浏览当前目录)
cat haha.txt  		//查看文件
tail -n 1 haha.txt 	//看最后一行写了什么

【展示日志】:分屏 (下一页:空格;上一页: b)
$ git log 
$ git log --pretty=oneline
$ git log --oneline
$ git reflog
多了引用信息:HEAD@{num}

【2】版本切换 == reset

Git切换版本是依靠的HEAD指针移动,指针指向不同的分支

【reset命令】:
$ git reset --hard  [索引]
1、放弃所有改变,回归到commit指定版本后的状态

$ git reset --mixed [索引]
1、默认模式,保持工作区不变,tmp和本地库都 指向指定版本

$ git reset --soft  [索引]
if 为了撤销更改并分享给别人,我们需要使用 `git revert`。
	reset是将head往后退而revert执行后head继续前行(不消除已有的commit记录)。
	revert = 回复 = to reply
	
	git reset :
	git revert :

Git Reset 三种模式
本地库就是我们能够操作的,其他的都是黑窗

查看与指定版本之间的差异:

$ git diff file1.txt
1、 比较该文件在【工作区】 和 【temp】 的差别
2、 若 git add 之后,工作区提交后则无差别

$ git diff [索引] [文件]

三、协作开发 ing —— branch

$ git branch -v
查看分支信息

$ git branch newBranch
创建新的分支

$ git checkout branch01
切换分支到 branch01

在这里插入图片描述

【4】合并:merge、rebase

【建议】在分支merge master,而不是在主干merge分支!!!!

git checkout bugFix
git merge master

在这里插入图片描述

第二种合并分支的方法是 git rebase

Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方逐个的放下去。

把支线上面的东西 [自从分开之后到最新的成果] 都对master一一道来

git rebase master
合理利用 rebase和merge 来避免git历史提交里的无意义的“交织”
eg: Azure Devops,【强制pull request merge时squash changes】

Squash merge pull requests
在这里插入图片描述

【5】分离的 HEAD

【意思】:将HEAD指针指向C4(应该是个Hash值)
git checkout C4

使用 ^ 向上移动 1 个提交记录
使用 ~<num> 向上移动多个提交记录,如 ~3

【意思】:move master 到HEAD~3的地方去
git branch -f master HEAD~3

【6】开心挑选cherry pick、交互式 rebase

【场景】我正在解决某个特别棘手的 Bug,为了便于调试而在代码中添加了一些调试命令并向控制台打印了一些信息。我们就可以很方便的使用cherry-pick和rebase -i来使得有用的修改得到保留

有【提交记录(并且还知道这些提交记录的哈希值)】时, 用 cherry-pick 是最简单的方式。
git cherry-pick <hashcode>
【意思】:通过rebase来更改编辑他们之间的顺序,并且重新创建一个分支。
--interactive 带有交互式的 rebase 命令, 简写为 -i
git rebase -i master~4

在这里插入图片描述
【7】技巧

【意思】:重新修改之后还在原来的分支旁边,做一个小修改的时候有用
git commit --amend

cherry-pick 可以将提交树上任何地方的提交记录取过来追加到 HEAD 上(只要不是 HEAD 上游的提交就没问题)。

分支很容易被人为移动,并且当有新的提交时,它也会移动。分支很容易被改变,大部分分支还只是临时的,并且还一直在变。所以我们引出了tag来做标记……

【意思】:给结点做标记的方法tag
git tag v0 [hashcode]

【git describe】 的​​语法是:
git describe <ref>
<ref> 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(HEAD)。
它输出的结果是这样的:
<tag>_<numCommits>_g<hash>
tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。
当 ref 提交记录上有某个标签时,则只输出标签名称

四、远程库 ——冲突解决

$ git remote -v
查看本地保存的所有的 远程库 简写

$ git remote add origin https://github.com/willorn/GitResp.git
$ git remote add origin_ssh git@github.com/willorn/GitResp.git

$ git push origin master分支
推送到远程仓库中(有权限才能成功)

$ git clone https://github.com/willorn/GitResp.git
直接把项目复制到当前.git管理的目录下

在这里插入图片描述

【 pull == fetch + merge 】

$ git fetch origin master
从 [远程库] 拉取 [指定的分支]

=====================================
$ git checkout origin/master
$ ll
$ cat xxx.txt
查看当前远程库里面的内容
=====================================

$ git merge origin/master
一定要切回现在的master,然后再去 merge远程库的master分支

人为解决提交冲突之后 再加入暂存区 然后再提交
冲突来源:push、merge

在这里插入图片描述

避免冲突的方法:

【1】团队开发的时候避免在一个文件中改代码
【2】在修改一个文件前,在push之前,先pull操作

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐