git 常用点,详解

from my typora

这一类: git add、git commit 、git push、git status、git init

但是注意第一次初始化本地库,最好用git clone,强调,不要git init git pull。

再补充一下,其实pull = merge + fetch

包括 git config user.name 、git config user.email 以及–global参数。

我就跳过了

保存现场:https://blog.csdn.net/qq_36791569/article/details/82716694

git 模式解析

git中,几大空间,依此的关系,分别是:

工作区 — 暂存区 — 本地库 — 远程库

工作区:就是写代码的地方;

暂存区:是一共中转站,通过git add 到达;

本地库:一个比较稳定的地方了,add之后,通过commit到达。

远程库:通过push、pull进行交互。

其中几种撤销我就略过了:比如工作区修改撤销,暂存区修改撤销,比较鸡肋,有兴趣看这两段话:

https://blog.csdn.net/qq_36791569/article/details/82694577

删除文件

方式一:

rm test.txt 先删除工作区的test.txt
git add test.txt (我的理解是,将删除test.txt这个动作add上去,告诉本地版本库)
git commit -m “删除了test.txt”

方式二:

rm test.txt 先删除工作区的test.txt
git rm text.txt 提交一个git动作,删除本地版本库中的text.txt但是只是记录了动作,还没有commit提交到本地的版本库中
git commit -m “删除了test.txt”

远程库

# 增
# 添加远程库
# 不一定要叫origin,只是我们习惯叫origin,下同!
git remote add origin https://gitee.com/yaoguai1998/LearnGit.git # 删
# 删除远程库
# 远程库库名叫什么,就删什么!
git remote rm origin # 查
# 查看所有远程库的缩略信息
git remote
# 查看所有远程库的完整信息
git remote -v # 改
# 改变远程库的url,这里写的是git@为ssh协议,不是http协议,但是均可
git remote set-url origin git@gitee.com:yaoguai1998/LearnGit.git

配置忽略文件

在我们协同的时候,经常因为项目中的一些.class文件,target目录,.project一类类似的文件冲突,这种东西我们要让git去忽略它,不进行同步

  • 首先准备一个忽略文件(*.gitignore)
# Java.gitignore,随便放哪里,我放在用户家目录下的
# Java.gitignore:文件名随便取
# Java.gitignore文件内容如下
# -------------------
# Compiled class file
*.class # Log file
*.log # BlueJ files
*.ctxt # Mobile Tools for Java (J2ME)
.mtj.tmp/ # Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid* .factorypath
.classpath
.project
.settings
target jdbc.properties
# -------------------
  • 单库方式
# 找到当前本地库文件夹中的.git文件夹
# 打开其中的config文件
# 添加以下内容
[core]
# 这个是你的gitignore文件的路径,因为我是放家目录的
excludesfile = C:/Users/Administrator/Java.gitignore
  • 全局方式
# 到用户家目录下,找到.gitconfig文件
# win在 C:\Users(用户组)\Administrator(当前用户目录) 下
# ubuntu一类linux,在 /home/用户/ 下
# 同样添加以上内容
[core]
# 这个是你的gitignore文件的路径,因为我是放家目录的
excludesfile = C:/Users/Administrator/Java.gitignore

查看版本库日志,以及版本回退

git log

# 空格向下翻页,b向上翻页,q退出
git log # 显示所有日志的所有信息,较多并且较为繁琐
git log --pretty=oneline # 以较好的格式输出 两个斜杠
git log --oneline # 显示简略信息 两个斜杠
推荐使用:git reflog 显示简略信息,但是相对于上面直接的 git log –oneline多了一个head移动步数,推荐使用这种:git reflog # 最推崇的方式:
git log --graph --pretty=oneline --abbrev-commit
查看日志 分支合并图 一行显示 缩减commitId的长度 git log --graph --pretty=oneline --abbrev-commit

版本回退:

# 别记那么多,版本回退就用 git reset --hard 版本号
git reset --hard c17e52f # [c17e52f:是局部索引值]可以回退到特定的版本

解决冲突

在我们进行分支合并的时候,本地两个分支:

1.切换到我们需要合并的分支上。

2.进行merge操作,如果没有冲突则会直接成功,如果出现冲突,则会:

git 是一个好工具,就是门槛比较高。
<<<<<<< HEAD
这是我在master上add,commit的内容
=======
这是我在mzy上add,commit的内容
>>>>>>> mzy
可以看出git在这种无法自动处理的冲突上,使用了
<<<<<<<
=======
>>>>>>>
进行标识
<<<<<<<HEAD:固定的表示当前HEAD指向的,不一定是master。
=======:用于冲突之间分隔
>>>>>>>:被合并分支名称
内容一定是当前分支在HEAD下,被合并分支在后面。 手动修改这些文件,去掉其中的分隔符号,并且把内容修改成你想要的样子,
再次 git add readme.txt,git commit -m "合并分支mzy,并且解决了冲突"
我们可以让日志显示格式改一改,看到其中的合并步骤:
git log --graph --pretty=oneline --abbrev-commit * 3b15b8e (HEAD -> master) conflict fixed
|\
| * dbee345 (mzy) AND simple
* | b1d6af5 在主分支上进行提交
|/
* fd4ceae 修改了readme.txt文件
* c5687b8 删除test.txt[C
* b71048d 提交test.txt
* 88726c9 提交了readme.txt中的修改
* e4deff9 git change readme.txt add tracks change of files
* 9a3670d add LICENSE to res
* c3e7dc7 加上了GPL
* c17e52f 加上了一些新玩意儿distributed
* 9f6ffb9 第一次提交readme.txt

合并之后,怎么让另一个分支也享受被合并的愉悦呢?(因为我们分支合并只能体现在当前分支,被合并分支不能体现出来)

你应该反过来想,既然已经合并, 为什么不把原来的分支删除了,按照新分支的样子创建一个新的分支呢?在当前分支的基础上?这样不就行了吗?

替换我们常用的直接merge的方式:

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息(即:原来这个分支的做了什么在log中体现不出来)。

为了让我们的版本库更清晰,我们可以使用普通合并方式:

# 普通合并
git merge --no-ff -m "把dev分支上的内容合并到master上,使用普通合并" dev
git merge --no-ff -m "把dev分支上的内容合并到master上,使用普通合并" dev
$ git log --graph --pretty=oneline --abbrev-commit
* 8fc444b (HEAD -> master) merge with no-ff
|\
| * 1601be9 (dev) add merge
|/
* 4aa96bc 修改了readme.txt
* 68f4f31 修改LICENSE
* 6653ea8 Merge branch 'yao' into mzy

分支处理

创建分支:

# 如何创建一个本地分支?
# git branch 分支名
# 例如创建一个dev分支
git branch dev
# 注意噢,如果不带参数,就是查看当前有多少分支
$ git branch
dev
master
tb1
* tb2 # 但是以上的方式,只能创建分支,不能切换到创建的分支上
git checkout -b dev # 不仅创建了dev分支,并且切换到了dev分支上 # 如上就引出了,切换分支的命令
# git checkout 分支名
git checkout mzy # 切换到mzy分支上

删除一个本地分支呢?

# 上面讲了创建一个分支 直接:git branch 分支名
# 删除的话,就是git branch -d 分支名
git branch -d dev # 就删除了dev分支
# 注意以上只能删除本地的分支,不能删除和本地库有关的远程库的分支
# 删除远程库的分支的命令,以下会讲

新概念,追踪(track)关系,前引:

在git远程库和本地库中,我们的分支经常是一一对应的,(这种对应可以名字不同),其实他们物理意义上不是一一对应的,只是在我们看来是一一对应的!

为什么呢?

你发现没有,当你推送的时候:

即使本地有一个master,远程有一个master

本地有一个dev,远程有一个dev

你推送的时候,还是通过

push origin master、push origin dev

pull origin master、pull origin dev

但是如果有追踪关系的话,你在当前分支(如dev分支)上

你直接git pull 、git push

git 就会直接帮你pull 或者push 对应到远程库上的分支!

这种关系,我们叫做追踪:

追踪关系有两种使用场景:

**1.当前本地库有一个分支,但是远程库没有 **

2.当前远程库和本地库,都存在这个分支,但是没有关联起来,希望强关联

如果当前git远程库中,没有当前的本地分支(或者要和远程库中的分支建立追踪关系的时候):

# 方式一:
git push --set-upstream origin mzy
# 方式二:
# 注意在有些场景下我们用:远程仓库名/分支名,代表远程库上的分支
git branch -u origin/mzy # 解除追踪关系
git branch --unset-upstream
# 查看是否有追踪关系
git branch -vv
# 这种就是有追踪关系
dev 5631865 [origin/dev: ahead 2, behind 3] dev提交
master cfd7d4e [origin/master] 删è提交
* tb1 6ee4ba4 [origin/tb1] test3上提交
# 这种就是没有追踪关系
tb2 6ee4ba4 test3上提交
test1 729034d [origin/test1] test1提交
test2 d352291 [origin/test2] test2提交
test3 6ee4ba4 [origin/test3] test3上提交

删除一个本地分支后,并且删除一个远程分支:

# 首先要确定你现在所在的分支不是你要删除的分支!!!不然无法删除
# 首先切换到任意一个非你要删除的分支上
git branch -d tb2 # 删除的参数可以是
git push origin :tb2

如果需要强制覆盖远程的一个分支怎么办?

git push --force origin master
git push -u origin master -f

如果要强制用远程分支覆盖本地的分支怎么办?

 git fetch --all
# 注意在有些场景下我们用:远程仓库名/分支名,代表远程库上的分支
git reset --hard origin/master
git pull

当你进行pull的时候,远程库告诉你 fatal: refusing to merge unrelated histories

原因是git判定你的远程库和本地库的分支的内容不相干,所以拒绝了你的合并,如果你执意要的话,请:出门右拐执行

git pull origin master --allow-unrelated-histories

协同最好的方式

我们约定的开发方式,请大家遵守:

首先我们有一个稳定版本(master),基于master产生一个开发版(dev),在开发版的基础上,我们衍生出各个开发者各自的分支:huchao、wanglanlin、yangtao …

1.自己的电脑上只能有自己的分支和dev分支,不随便拉别人的分支。

2.每天或者一段时间代码写完之后,记得提交到远程库的自己分支上。

3.在要往dev上合的时候,commit中的信息必须写清楚,修改了什么文件,以及原因;或者增加了什么功能

4.在往远程库的dev上合并新代码的时候,记得群里告知大家去pull远程库的dev,以及尽快合并到自己的分支上,防止版本库堆积。(或:养成经常pull origin dev的习惯)

5.阶段性dev提交的时候(即全部统一的时候:我称为里程碑),我们约定:此刻我会删除当前远程库上的所有除master、dev以外的所有分支,请大家也删除自己本地的个人分支,以当前的dev分支为模板创建一个新的分支。

# 1.每天工作结束,提交代码到远程库的自己分支上
# 在添加了忽略文件的前提下
git add ./*
git commit -m "提交了xxx"
# 如果设置了以上的追踪关系,直接 git push
git push origin mzy(分支名) # 2.阶段任务完成,增加更新,提交到dev上
# 为了确保无误,先从远程库pull一次
git pull origin dev
# 然后切换到dev分支上,把自己分支的内容合并上去
git checkout dev
git merge mzy
# 没有冲突,直接fast-forward了
# 如果有冲突,则手动合并,参照上
# 合并完成,add commit push
git add ./*
git comit -m "合并到dev,一定要写清楚合并了什么"
git push origin dev # 然后删除当前的个人分支,参照新的dev,创建个人分支
# 注意一下操作确保是在dev分支上的!
git branch -d mzy # 删除mzy分支
git checkout -b mzy # 按照当前的dev分支建立mzy分支,并切换到mzy分支 # 以上过程稍微显得有点繁琐,但是因为昨天我测试无法跨分支推送,即只能先这样
# 也是我请教师兄之后,告诉我的方法。
# 最初我是向跨分支推送的,因为原来可以,比如直接把mzy -> push origin dev
# 但是不行,大家解决之后,请告诉我,我们一起优化!
# -----------------------------------------------------

最开始我的想法:(但是没有实现,期待大家一起解决)

问题一

我现在在远程库上有master、dev、dev1、dev2。

dev1和dev2是基于dev创建的,我希望他们本地都只存留dev1、dev2这一类的个人分支,合并的时候,先pull origin dev,如果有冲突,在本地merge了,这一步是能够实现;但是当我想要在dev1上向远程dev分支上推的时候就出错了,只能向远程的dev1上推送,不能向远程的dev上推送。即使我使用push origin -u dev -f 也不行,说everthing up to date,难道当远程分支dev1和本地分支dev1建立了关系,就不能跨分支推送了吗?为了印证这个猜想,我unset-upstream 解除了远程分支dev1和本地分支dev1的追踪关系,但是解除之后仍然不能把已经merge了远程分支的dev1推向远程的dev,所以我不知道我的问题出在哪里了?

复习git的更多相关文章

  1. 版本控制工具--svn和git的使用(二) -----SVN的操作

    SVN的使用 开头: 对于svn的详解,我不是很熟,只是用过svn的客户端,没使用过服务端,在这里我只是简单说一下在svn的客户端怎么拉取代码,提交代码和修改冲突等等.svn的客户端我在Mac中用的s ...

  2. git命令合集及github的克隆推送

    安装git 初始化仓库 提交相关 撤销相关 远程推送 分支相关 其他 遇到的错误 github的克隆上传 此文章只是对命令的一个统计,起备忘和复习git只是的作用,不建议从没接触过git的同学通过它来 ...

  3. 20145234黄斐《信息安全系统设计基础》第七周(Linux命令复习)

    已经到了11月,学期过半,而<信息安全系统设计基础>这门课也要到了期中考试了.所以,我在这里,对前半个学期的最基础的知识,做一个复习 复习计划分为两步,本次为Linux命令,下次计划复习g ...

  4. 程序员必备基础:Git 命令全方位学习

    前言 掌握Git命令是每位程序员必备的基础,之前一直是用smartGit工具,直到看到大佬们都是在用Git命令操作的,回想一下,发现有些Git命令我都忘记了,于是写了这篇博文,复习一下~ https: ...

  5. AngularJS2之本地环境搭建

    前言:本来准备初探AngularJS2,结果成了复习git和再探node git的两个常见问题:一.github上传时出现error: src refspec master does not matc ...

  6. require实现单页应用程序(SPA)

    写了一个测试代码,用require.js配合它的一个插件text.js实现了最简单的单页应用程序,简单的记录一下,方便以后复习, git地址:https://github.com/lily1010/r ...

  7. git常用命令复习及其基本使用示例

    年后回来新上到项目,对于git的一些操作命令记得有点混乱了,所以特整理笔记如下: 一.git常用命令复习 查看当前分支:git branch (显示结果中带有*号的是当前分支)查看所有分支: git ...

  8. Git复习步骤

    1.首先肯定是安装与配置了 首先要下载Git,然后设置用户名/邮箱 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c ...

  9. 复习宝典之Git分布式版本控制

    查看更多宝典,请点击<金三银四,你的专属面试宝典> 第三章:Git分布式版本控制 1)git文件状态 git中的文件有以下几种状态: 未跟踪(untrack):表示文件为新增加的. 已修改 ...

随机推荐

  1. StringIO和BytesIO的用法

    数据读写有两种方式: 1.直接读写.案例 import openpyxl def write_excel(): f = openpyxl.Workbook() # 创建工作簿 # sheet1 = f ...

  2. 手把手教你玩转HarmonyOS版地图应用开发

    ​一.导读 7月31日,华为HarmonyOS开发者日将在杭州举行.为了方便更多开发者,高德开放平台地图SDK已在业内率先实现鸿蒙化迁移和重构,全面适配HarmonyOS并面向开发者免费发布.开发者可 ...

  3. js学习笔记之this指向及形参实参

    var length = 10 function fn () { console.log(this.length) } var obj = { length: 5, method (fn) { fn( ...

  4. ThinkPHP 5

    use think\Controller 1.$this->request->param();      内置request 安全对象, 不再使用 $_GET ,$_POST 2.path ...

  5. SickOs1.2靶机

    仅供个人娱乐 靶机信息 靶机下载地址:https://www.vulnhub.com/entry/sickos-12,144/一.主机发现  arp-scan -l 二.端口扫描 1. masscan ...

  6. vulnhub-Lampiao脏牛提权

    准备工作 在vulnhub官网下载lampiao靶机Lampião: 1 ~ VulnHub 导入到vmware,设置成NAT模式 打开kali准备进行渗透(ip:192.168.200.6) 信息收 ...

  7. 在Java开发工具的project中使用相对路径

    1.在project中,相对路径的根目录是project的根文件夹,在此就是repathtest文件夹了.创建文件的写法是: File f = new File("src/com/lavas ...

  8. 资源适配【eg: values-sw600dp的命名和drawable-400dpi的命名】

    通过getResources().getConfiguration().smallestScreenWidthDp获取即可 这篇文章讲了values-sw的适配: https://blog.csdn. ...

  9. CSS样式逐li添加,执行完,清空,反复执行

    function change_light(el) { el.hide() let i = 0; function temp() { if (i > el.length - 1) { el.hi ...

  10. RHCSA_DAY12

    Linux软件包的分类 inghu 源码包 二进制包(RPM包) 源码包特点 源码包缺点:安装过程麻烦,需要用户手动编译,需要手动解决软件包的依赖关系 源码包优点:软件源代码开放,允许用户二次开发,安 ...