git使用总结

git使用总结

概念

1.Git的四个组成部分

在这里插入图片描述

2.文件的几个状态

按大类划分,分为两种状态:Tracked(已跟踪)和Untracked(未跟踪),
依据是:该文件是否已加入版本控制

流程简述:

假设某个项目已加入版本控制系统

  1. 新建一个文件,该文件处于 Untracked 状态;
  2. 通过git add命令添加到缓存区,此时文件处于Tracked状态。又或者说
    此时这个文件已经被版本控制系统所跟踪,而且他处于Staged(暂存)状态;
  3. 通过git commit命令把暂存区的文件提交提交到本地仓库,此时文件
    处于Unmodified(未修改)状态;
  4. 此时如果去编辑这个文件,文件又会变成Modified(修改)状态;

本地操作命令

1.相关配置【git config】

区分global 和 local,前者代表 全局设置,就是设置了在整个系统中,所有的带Git版本管理的项目都是这样的配置;后者代表 本地设置即在某个项目中独立的设置,后者优先级高于前者。比如全局设置的用户名是"Coder-pig",本地设置的是"Jay",commit的时候author就是Jay而不是Coder-pig。除了通过命令行修改,还可以直接修改

全局配置文件:etc/gitconfig (Mac下是隐藏文件,用户/.gitconfig)
本地配置文件:当前仓库/.git/config

// 安装完Git后第一件要做的事,设置用户信息(global可换成local在单独项目生效):
git config --global user.name "用户名"          // 设置用户名
git config --global user.email "用户邮箱"       // 设置邮箱
git config --global user.name                  //  查看用户名是否配置成功
git config --global user.email                 //  查看邮箱是否配置

//  其他查看配置相关
git config --global --list                     // 查看全局设置相关参数列表
git config --local --list                      // 查看本地设置相关参数列表
git config --system --list                     // 查看系统配置参数列表
git config --list                              // 查看所有Git的配置(全局+本地+系统)
2.添加文件到暂存区/文件跟踪标记【git add】

可以使用git add 文件名,将工作空间的文件添加到暂存区,或批量添加文件

git add 文件名      // 将工作区的某个文件添加到暂存区   
git add .          // 将当前工作区的所有文件都加入暂存区
git add -u         // 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件
git add -A         // 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件
git add -i         // 进入交互界面模式,按需添加文件到缓存区
3.将暂存区内容提交到本地仓库【git commit】
git commit -m "提交说明"       // 将暂存区内容提交到本地仓库
git commit -a -m "提交说明"    // 跳过缓存区操作,直接把工作区内容提交到本地仓库
4.查看工作区与缓存区的状态【git status】
git status         // 查看工作区与暂存区的当前情况
git status -s      // 让结果以更简短的形式输出
5.差异对比(内容变化)【git diff】
git diff                 // 工作区与缓存区的差异
git diff 分支名           // 工作区与某分支的差异,远程分支这样写:remotes/origin/分支名
git diff HEAD            // 工作区与HEAD指针指向的内容差异
git diff 提交id 文件路径  // 工作区某文件当前版本与历史版本的差异
git diff --stage         // 工作区文件与上次提交的差异(1.6 版本前用 --cached)
git diff 版本TAG         // 查看从某个版本后都改动内容
git diff 分支A 分支B      // 比较从分支A和分支B的差异(也支持比较两个TAG)
git diff 分支A...分支B    // 比较两分支在分开后各自的改动
 // 另外:如果只想统计哪些文件被改动,多少行被改动,可以添加 --stat 参数
6.查看历史提交记录【git log】
git log                   # 查看所有commit记录(SHA-A校验和,作者名称,邮箱,提交时间,提交说明)
git log -p -次数           # 查看最近多少次的提交记录
git log --stat            # 简略显示每次提交的内容更改
git log --name-only        # 仅显示已修改的文件清单
git log --name-status      # 显示新增,修改,删除的文件清单
git log --oneline          # 让提交记录以精简的一行输出
git log –graph –all --online  # 图形展示分支的合并历史
git log --author=作者        # 查询作者的提交记录(和grep同时使用要加一个--all--match参数)
git log --grep=过滤信息      # 列出提交信息中包含过滤信息的提交记录
git log -S查询内容          # 和--grep类似,S和查询内容间没有空格
git log fileName           # 查看某文件的修改记录,找背锅专用

文件恢复/版本回退

1.Tracked文件从暂存区恢复至工作区【git checkout】

如果在工作区直接删除被Git Tracked的文件,但是还未通过git add添加到暂存区,暂存区中还会存在原来的文件,此时键入:git status,会是这样:
在这里插入图片描述
Git告诉你工作区的文件被删除了,你可以 删掉暂存区里的文件恢复被删文件

// 删除暂存区中的文件:
git rm 文件名
git commit -m "提交说明"

// 误删恢复文件
git checkout -- 文件名
// 另外注意:git checkout会抛弃当前工作区的更改!!!不可恢复!!!务必小心!!!

// 或者使用git restore <文件名>可实现同样的恢复文件功能
git restore <文件名>
2.修改的文件已提交至暂存区【git reset HEAD】

如果更改后add到了暂存区,想恢复原状,下述指令可以让文件恢复原状:

git reset HEAD 文件名   
git checkout 文件名
3.版本回退(已commit)【git reset --hard】

文件已经commit了,想恢复成上次commit的版本或者上上次,有如下3种方法:

  1. git reset HEAD^
git reset HEAD^      // 恢复成上次提交的版本
git reset HEAD^^     // 恢复成上上次提交的版本,^的数量就是后退的步数
  1. git reset HEAD~n
git reset HEAD~1    //恢复成上次提交的版本
git reset HEAD~2    // 恢复成上上次提交的版本,n就是后退的步数
  1. git reset --hard 版本号
git reset --hard 版本号     // git reflog查看到的SHA1值,取前七位即可,根据版本号回退

reset命令其实就是:重置HEAD指针,让其指向另一个commit
而这个动作可能会对工作区与缓存区造成影响,举个例子

  • 本来的分支线:- A - B - C (HEAD, master)
  • git reset B后:- A - B (HEAD, master)
    解释:看不到C了,但是他还是存在的,可以通过git reset C版本号找回,前提是
    C没有被Git当做垃圾处理掉(一般是30天)。

reset三个可选参数解析:

  • –soft:只是改变HEAD指针指向,缓存区和工作区不变;
  • –mixed:修改HEAD指针指向,重置暂存区,工作区不变;
  • –hard:修改HEAD指针指向,重置暂存区和工作区;
4.查看输入指令记录【git reflog】

Git会记住你输入的每个Git指令,比如上面的git reset 切换成一个旧的commit,然后git log后发现新提交的记录没了,想切换回新的那次commit,可以先调git reflog 获取新commit的SHA1码,然后git reset 回去。

git reflog

在这里插入图片描述
注意:这个指令记录不会永久保存!Git会定时清理用不到的对象!!

5.撤销某次提交【git revert】

有时可能我们想撤销某次提交所做的更改,可以使用revert命令

git revert HEAD     // 撤销最近的一个提交
git revert 版本号     // 撤销某次commit

不是真的把提交给撤销了,而是生成一个新的提交来覆盖旧的提交,被撤销的提交和新的提交记录都会保存!!!不信你再调一次revert HEAD 会发现被撤销的更改又变回来了,另外,每次revert后,都需要发起新的commit!简单点说,撤销的只是文件变化,提交记录依旧是存在的!

6.查看某次提交修改内容【git show】
git show 提交id     // 查看某次commit的修改内容
7.查看某个分支的版本号【git rev-parse】
git rev-parse 分支名     // 查看分支commit的版本号,可以写HEAD
8.找回丢失对象的最后一点希望【git fsck】

因为你的某次误操作导致commit丢失,如果git reflog都找不到,你可以考虑使用git fsck,找到丢失的对象的版本id,然后恢复即可。

git fsck --lost-found

在这里插入图片描述


分支

1.分支概念

提交记录串成的时间线,默认初始创建的分支(时间线) —— master分支,
如果不切换到其他分支上,每次commit生成的快照都会串在这条分支上!
另外还有个 —— HEAD指针,该指针指向正在工作的本地分支,前面的版
本回退其实修改的就是这个HEAD指针的指向!

比如:在master分支上执行四次commit,分支的状态图如下
在这里插入图片描述
不难发现这样的规律:

  • 每次commit,master都会向前移动一步,指向最新的提交
  • HEAD则指向正在工作的本地分支,而git reset修改的就是HEAD指针的指向!
2.分支管理策略

为了解决只有一个master分支引起的问题,可以引入分支管理,最简单的一种策略如下:

master分支上开辟一个新的develop分支,然后我们根据功能或者业务,再在develop
分支上另外开辟其他分支,完成分支上的任务后,再将这个分支合并到develop分支上!
然后这个功能分支的任务也到此结束,可以删掉,而当发布正式版后,再把develop分支
合并到master分支上,并打上TAG。

masterdevelop分支都作为长期分支,而其他创建的分支作为临时性分支
简述各个分支的划分:

  • master分支:可直接用于产品发布的代码,就是正式版的代码
  • develop分支:日常开发用的分支,团队中的人都在这个分支上进行开发
  • 临时性分支:根据特定目的开辟的分支,包括功能(feature)分支,或者预发布(release)分支
    又或者是修复bug (fixbug)分支,当完成目的后,把该分支合并到develop分支,
    然后删除 该分支,使得仓库中的常用分支始终只有:master和develop两个长期分支!
3.分支创建与切换【git branch】
git branch 分支名               // 创建分支
git branch                     // 查看本地分支

比如在master分支上创建develop分支,此时的分支状况如下:
在这里插入图片描述
在这里插入图片描述

git checkout 分支名                 // 切换分支
git checkout -b 分支名              // 创建分支同时切换到这个分支

切换到develop分支后,改点东西,再commit,此时的分支状况如下:
在这里插入图片描述
在这里插入图片描述
git checkout master 切回master分支,打开之前修改的文件,发现内容并没有发生更改,因为刚刚的更改是在develop上提交的,而master上没有变化,此时的分支状况如下:
在这里插入图片描述

4.分支的合并【git merge】 VS 【git rebase】

Git中,可以使用 git merge 和 git rebase 两个命令来进行分支的合并

git merge合并分支
合并的方式分为两种:快速合并普通合并,两者的区别在于:
前者合并后看不出曾经做过合并,而后合并后的历史会有分支记录,如图:
快速合并:在这里插入图片描述普通合并:在这里插入图片描述

示例:

快速合并,把develop分支合并到master分支上,来到master分支后,键入下述命令

git merge develop

在这里插入图片描述打开文件:在这里插入图片描述
普通合并,切到develop分支下,修改note_2.txt的内容,再通过下述指令合并分支:
注:–no-ff参数表示禁用快速合并

git merge --no-ff -m "合并的信息(TAG)" develop

在这里插入图片描述
分支线情况:在这里插入图片描述

git reabse合并分支
参考原教程小猪的git使用总结

5.解决合并冲突

在我们合并分支的时候,有时会遇到合并冲突,然后合并失败的问题,此时需要我们先解决冲突后才进行合并,个人开发倒很少会遇到,多人开发的时候遇到合并冲突则是家常便饭。

一个最简单的例子,A和B在develop分支上开辟出两个分支来完成相关的功能,A做完了,把自己的分支合并到develop分支,此时develop分支向前移动了几次commit,接着B也完成了他的功能,想把自己分支合并到develop分支,如果改动的文件和和A改动的文件相同的话,此时就会合并失败,然后需要处理完冲突,才能够继续合并!

merge分支后处理冲突
在这里插入图片描述在这里插入图片描述
打开冲突文件,然后处理冲突部分,保留什么代码你自己决定,处理完后把
<<< 和 >>> 这些去掉:
在这里插入图片描述处理后的文件:在这里插入图片描述

然后add,然后commit即可,合并结束:
在这里插入图片描述
此时的分支线:
在这里插入图片描述

6.删除分支

对于合并完的分支,基本都没什么作用了,可以使用下述命令删除:

git branch -d 分支名      // 删除分支,分支上有未提交更改是不能删除的
git branch -D 分支名      // 强行删除分支,尽管这个分支上有未提交的更改
7.恢复误删分支

两步,找出被删除分支的最新commit的版本号,然后恢复分支

git log --branches="被删除的分支名"     // 找到被删分支最新的commitb版本号
git branch 分支名 版本号(前七位即可)     // 恢复被删分支
8.切换分支时保存未commit的更改【git stash】

有时我们可能在某个分支上正编写着代码,然后有一些突发的情况,需要我们暂时切换到其他分支上,比如要紧急修复bug,或者切换分支给同事review代码,此时如果直接切换分支是会提示切换失败的,因为这个分支上做的更改还没有提交,你可以直接add后commit,然后再切换,不过我们习惯写完某个功能再提交,我们想:

先暂存这个分支上的改动,切去其他分支上搞完事,然后回来继续
继续在之前的改动上写代码。
那么可以使用:

git stash              // 保存当前的改动

然后放心的切换分支,然后再切换回来,接着使用:

git stash apply       // 恢复保存改动

另外有一点一定要注意!!!可以stash多个改动!!如果你切换到另一个分支又stash了,然后切换回来stash apply是恢复成另一个分支的stash!!!

如果你这样stash了多次的话,我建议你先键入:

git stash list        // 查看stash列表

找到自己想恢复的那个
在这里插入图片描述
比如我这里恢复的应该是network上的stash,而第一个stash是devlop上的
直接git stash apply恢复的就是这个,然而恢复的应该是network的那个stash:

git stash apply stash@{1}

就是这样,按自己需要恢复即可!

9.分支重命名
git branch -m 老分支名 新分支名             // 分支重命名
10.分支基本操作命令汇总
git branch //查看本地所有分支 

git branch -r //查看远程所有分支

git branch -a //查看本地和远程的所有分支

git branch <branchname> //新建分支

git branch -d <branchname> //删除本地分支

git branch -d -r <branchname> //删除远程分支,删除后还需推送到服务器
git push origin:<branchname>  //删除后推送至服务器

git branch -m <oldbranch> <newbranch> //重命名本地分支
/**
*重命名远程分支:
*1、删除远程待修改分支
*2、push本地新分支到远程服务器
*/

//git中一些选项解释:

-d
--delete:删除

-D
--delete --force的快捷键

-f
--force:强制

-m
--move:移动或重命名

-M
--move --force的快捷键

-r
--remote:远程

-a
--all:所有

远程仓库与远程分支

1.关联远程仓库

首先建立好与本地仓库同名的远程仓库,然后复制下远程仓库的地址,比如:

键入下述命令关联本地与远程仓库

git remote add origin 远程仓库地址 

可以键入下述命令可查看远程仓库状况(git remote / git remote -v)
在这里插入图片描述
接着把本地仓库推送到远程仓库,这里的 -u参数 作为第一次提交使用,
作用是把本地master分支和远程master分支关联起来(设置默认远程主机),
后续提交不需要这个参数!

git push -u origin master

另外,如果想修改远程仓库地址,可键入:

git remote set-url origin 远程仓库地址
// 也可以先删除origin后再添加
git remote rm origin    // 删除仓库关联
git remote add origin 远程仓库地址 // 添加仓库关联

或直接修改.git文件夹中的config文件,直接替换圈住位置
在这里插入图片描述
还要说明一点,origin 并不是固定的东西,只是后面仓库地址的一个 别名!!
可以写成其他的东西,然后你也可以设置多个仓库关联,用不同的别名标志,比如:

git remote add github https://github.com/coder-pig/SimpleTea.git
git remote add osc git@git.oschina.net:coder-pig/SimpleTea.git
2.推送本地仓库到远程仓库【git push】

基本语法

git push <远程主机名> <本地分支名>:<远程分支名> 

例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名,第一个master是本地分支名,第二个master是远程分支名。

常见用法
1.

git push origin master

如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
2.

git push origin :refs/for/master 

如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git push origin --delete master
3.

git push origin

如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
4.

git push

如果当前分支只有一个远程分支,那么主机名都可以省略,形如 git push,可以使用git branch -r ,查看远程的分支名

3.克隆远程仓库【git clone】

把项目推送到远程仓库后,其他开发者就可以把项目clone到本地

git clone 仓库地址 # 克隆项目到当前文件夹下
git clone 仓库地址 目录名 # 克隆项目到特定目录下
4.同步远程仓库更新【git fetch】VS【git pull】

关于获取远程服务器更新的方式有两种,他们分别是fetch和pull,尽管都可以获取远程服务器更新,但是两者却又是不一样的。

git fetch

概述
理解 fetch 的关键, 是理解 FETCH_HEAD.
这里需要解释下什么是FETCH_HEAD?

FETCH_HEAD指的是: 某个branch在服务器上的最新状态’.
每一个执行过fetch操作的项目’都会存在一个FETCH_HEAD列表,
这个列表保存在 .git/FETCH_HEAD 文件中, 其中每一行对应于远程服务器的一个分支.
当前分支指向的FETCH_HEAD, 就是这个文件第一行对应的那个分支.

一般来说, 存在两种情况:

  • 如果没有显式的指定远程分支, 则远程分支的master将作为默认的FETCH_HEAD
  • 如果指定了远程分支, 就将这个远程分支作为FETCH_HEAD

基本用法
常见的git fetch 使用方式包含以下四种:

  1. git fetch

这一步其实是执行了两个关键操作:

  • 创建并更新所有远程分支的本地远程分支
  • 设定当前分支的FETCH_HEAD为远程服务器的master分支 (上面说的第一种情况)

需要注意的是: 和push不同, fetch会自动获取远程所有分支.

  1. git fetch origin
    同上, 只不过手动指定了remote.
  2. git fetch origin branch1
    设定当前分支的 FETCH_HEAD’ 为远程服务器的branch1分支`.
    注意: 在这种情况下, 不会在本地创建本地远程分支, 这是因为这个操作是git pull origin branch1的第一步, 而对应的pull操作,并不会在本地创建新的branch.
    一个附加效果是:这个命令可以用来测试远程主机的远程分支branch1是否存在, 如果存在, 返回0, 如果不存在, 返回128, 抛出一个异常.
  3. git fetch origin branch1:branch2
    只要明白了上面的含义, 这个就很简单了
  • 首先执行上面的fetch操作
  • 使用远程branch1分支在本地创建branch2(但不会切换到该分支),
    如果本地不存在branch2分支, 则会自动创建一个新的branch2分支,
    如果本地存在branch2分支, 并且是`fast forward’, 则自动合并两个分支, 否则, 会阻止以上操作.

git fetch origin :branch2 等价于: git fetch origin master:branch2

案例
仅仅只是从远处服务器获取到最新版本到本地,假如你不去合并(merge)的话,本地工作空间是不会发生变化的!比如:我们在Github上创建一个README.md文件,然后调 git fetch 去获取远程仓库的更新。

git pull

git pull命令的作用是:取回远程主机某个分支的更新,再与本地的指定分支合并。git pull是git fetch和git merge两步操作的结果,即git pull = git fetch + git merge
git fetch不会进行合并执行后需要手动执行git merge合并分支,而git pull拉取远程分之后直接与本地分支进行合并。更准确地说,git pull使用给定的参数运行git fetch,并调用git merge将检索到的分支头合并到当前分支中。
基本用法:

git pull <远程主机名> <远程分支名>:<本地分支名>

例如执行下面语句:

git pull origin master:brantest

表示将远程主机origin的master分支拉取过来,与本地的brantest分支合并。
后面的冒号可以省略:

git pull origin master

表示将远程origin主机的master分支拉取过来和本地的当前分支进行合并。注意,省略冒号后面的分支后留下的是远程分支。
上面的pull操作用fetch表示为:

git fetch origin master:brantest

git merge brantest

结语

以上内容如有侵权,请联系删除!

参考文章:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值