当前位置:   article > 正文

git学习(3)_git push data stream error

git push data stream error

分支操作
补充1:
查看xxx分支的来自于哪里
目前我掌握的方法是,用小乌龟或者fork,打开项目,然后找到当前分支的最后一次提交,然后查看上一次提交是哪个即可。

在这里插入图片描述
如这里的dev444分支和dev333分支的上一次提交都是红色框框标记的提交。那么也就是dev444和dev333都是从此次提交的是开出来的。

补充2:
git文件超过100m
https://www.cnblogs.com/zmdComeOn/p/12565629.html
在这里插入图片描述
补充3:
git cherry-pick
https://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html

git cherry-pick
可能会冲突,解决冲突之后,然后再提交。
在这里插入图片描述

补充4:
有这么个需求:
开发者A,开了一个新的分支dev666,然后再上面开发了一段时间,并且推送到了远程。
开发者B,某天要将A的dev666分支,合并到dev555上。此时B要这么做。
(1)git fetch,此步骤保证,能获取A推送的分支dev666
(2)git checkout dev555,此步保证B所在的分支为dev555,然后才能合并
(3)git merge origin/dev666
ok,有冲突的可以解决冲突,然后即合并完毕。

补充5:
在git reset --hard xxxxx之后,使用
git push --force
然后,别人怎么拉取呢?
https://ruby-china.org/topics/5163
最优雅的解决方案:
git fetch origin
git reset --hard origin/master

补充6:
git status查看的东西太多,能否查看指定类型的文件,比如只看那些*.cs的变化呢?
可以的。
使用命令:git status *.cs
在这里插入图片描述
补充7:
查看某次提交,修改了哪些文件:
git show --stat commitid
在这里插入图片描述

补充8:
https://blog.csdn.net/lzb348110175/article/details/93479318
不使用merge fastforward的模式
比如dev555分支添加了一个文件a.txt,提交到了远程分支dev555
然后我们想在dev666上合并dev555的修改,此时我们常用命令:
git checkout dev666
git merge dev555
这个默认是使用fastforward的模式,但是这个就看不到了是谁合并了,这个操作不太好。
所以我们一般使用:
git checkout dev666
git merge --no-ff dev555
这样就可以看到是谁执行了合并的操作。
如果合并出现了冲突,那么可以使用小乌龟,等可视化工具进行解决冲突。如果没有可视化工具,则可以使用命令:
git checkout --theirs . 或者git checkout --ours .
来选择使用远程的还是本地的。
还可以单个文件使用:
git checkout --theirs a.txt
git checkout --ours a.txt
然后使用git add a.txt标记解决冲突
然后使用git commit -m"merge a.txt"
然后使用git push即可。
这里重点是git merge --no-ff和git checout --theirs/–ours a.txt的意义要明确。

补充9:
我们经常会遇到这样的情况,比如在分支dev666上进行开发,修改了a.txt,修改了b.txt
此时使用命令:
git add a.txt
git add b.txt
git commit -m"change two txt"
git push
ok,此时顺利完成了提交,并且推送到了远程。
此时,发现推送错误了,啊!咋办,咋办?
我们可以使用如下的命令:
git log -2
找到自己提交的上次提交节点
使用:
git checkout xxxxx .
注意xxxx是自己上次提交的某个commitid,然后最重要的一点是后面有个.
表示恢复命令执行所在的当前文件夹,所以我们为了方便,直接就是在当前项目的根目录下执行就可以了。
这样就回到了之前的一次提交了,然后再使用:
git add a.txt
git add b.txt
git commit -m"revert two txt"
git push
即可,回到之前的某个版本了。
这里的xxxx可以是任意的一个commitid。

补充10:
我遇到了这样的需求,小宋在另外一个分支A,而我在分支B,此时同事想要B分支的某个文件,但是自己不想切分支,怎么办呢?
此时有两个解决方法:
1,我将B分支的文件,发送给小宋。
2,让小宋使用如下命令:
git fetch
git checkout origin/B xxxx.txt
此时就获取了远程分支A的最新xxxx.txt文件了。这样小宋也不需要切分支。

补充11:
使用git和http之后,clone项目之后,push不了了。。。。。
unable to negotiate with xxxx no matching host key type found…
在这里插入图片描述
可以在:

在这里插入图片描述
在这里插入图片描述

Host *
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedKeyTypes +ssh-rsa
  • 1
  • 2
  • 3

即可。
如果是http的方式,则要删除此文件即可。

补充12:在commit之后,pull出现冲突了,不能执行reset --soft,会提示如下:
在这里插入图片描述

此时只有两条路走:1,处理冲突;或者使用reset --hard xxx之前的某个版本号。

补充13:fork中的reset file to的使用
在这里插入图片描述
选择那个提交,然后选择那个文件,进行State Before Commit,然后重新提交即可。

补充14:ignore的使用
如果某个文件或者文件夹已经被追踪,则要使用如下的命令:
git rm --cached -r 文件夹
git rm --cached a.txt
然后提交:
git commit -m"rm dir or file"
git push

然后添加ignore文件中的忽略文件夹或者文件,比如:
.gitignore中添加:
/Logs
则表明要忽略掉/Logs下修改
然后将.gitignore添加并提交推送到远程。
具体过程如下:
在这里插入图片描述
比如这里的a文件下是已经追踪了,那么则要执行:
在这里插入图片描述

此时看下状态:
在这里插入图片描述
此时有两个变化,a/文件夹,提示不在追踪了。同绿色的提示,则要提交上去,告诉仓库不要追踪此文件夹了。
在这里插入图片描述
然后,要在.gitignore中添加忽略的文件夹:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后,你再修改a文件下的文件,都不会在git status中看到了。

补充15:优化fork
1、使用git gc命令,让其速度变快
2、修改config文件,只同步指定分支:
在这里插入图片描述
修改为:
在这里插入图片描述
这样就可以fetch和拉取分支了。

3、修改为自己的git
在这里插入图片描述
这里有可能会出现git版本太低的情况,所以要下载最新的git版本即可。
在这里插入图片描述
否则会出现提交记录看不到的情况。
4、重现clone项目,git一个项目用久了之后,会占用大量的磁盘空间,可以有空的时候,重新clone项目。
5、可以reset到之前的某个版本,丢掉所有的修改,然后fork会变快,在2023-7-12遇到的一个问题就是fork一直转圈,也不知道干嘛,于是我安装了sourcetree,也没做啥操作,就是丢弃了所有的修改,结果回到fork一看,不转圈了,速度正常了,无解。
6、换成自己安装的git,确实会快还很多,大大提高了工作效率。
在这里插入图片描述

补充16:fork合并
分支A向分支B合并步骤:
1、切换到分支B
2、选择分支A,右键-》Merge into
在这里插入图片描述
选择合并策略Dont commit,可以看到具体合并的文件,方便去掉那些不需要合并的文件。
在这里插入图片描述

1、clone当前项目
$ git clone https://git.oschina.net/simingtu/test123.git
这里写图片描述

2、创建本地分支
$ git checkout -b dev
这里写图片描述
将本地分支推送到远程:
git push origin dev
查看远程是否有此分支了:
git branch -r

3、查看本地当前分支情况
$ git branch
这里写图片描述
绿色为当前所在的分支

4、在dev分支上修改a.txt
这里写图片描述

5、将修改提交到dev分支
这里写图片描述
git add a.txt
git commit -m ‘branch test’
6、将分支的修改合并到主干上去
首先要切换到主分支上去:git checkout master
这里写图片描述
然后合并:git merge dev
这里写图片描述
这样分支的修改就合并到了master上去了。

7、撤销git add
当修改了多个文件之后,使用git add .
就把当前所有修改的文件都添加进去了。那么此时如果想撤销某个文件怎么办呢?
方法1:全部撤销:git reset HEAD
方法2:撤销单个文件:git reset HEAD xxx.txt

8、将单个文件恢复到指定版本
使用git log a.txt 查看文件的提交记录,然后找到你要恢复到的版本,比如版本号为:xxxxxx
git checkout xxxxxx a.txt

10、强制恢复到远程的版本
有时候我们就像快速的使用远程的版本怎么办?我们本地提交的东西在pull之后发现冲突了,此时我们只要使用一个命令即可使用远程的版本了。
打开冲突的文件,看到其最新的版本号:
这里写图片描述

如上图所示,划红线的就是远程的最新版本号,那么此时我们只要使用如下的命令即可:
git reset --hard 远程版本号的前六位即可,也就是:
git reset --hard 994190
这样就强制使用了远程的版本,你的所有的修改都要重新来过。其实你还可以回到自己之前的那个版本,那就是使用git reflog命令,查看之前的那次修改的内容。
如下:
git reflog 查看你要回去的版本号,然后使用git reset --hard 版本号就可以了。反正只要知道版本号,你想回到哪里就回到哪里,特别有用的命令。

11、git查询远程仓库地址
git remote -v
这里写图片描述

12、查看远程分支(包括本地)
git branch -a
这里写图片描述
这里列出了所有的分支情况,包括本地和远程的分支。

13、在10中我们学习了如何强制使用远程的最新版本
那个前提条件是知道远程的最新版本号,我们存了个疑问如何获取远程的最新版本号呢?这里给出一个方法,两条命令:
git fetch
git log remotes/主机名/分支名,如git remotes/origin/master
讲解:
git fetch 拉取远程所有版本提交记录到本地,如果你想拉取某个分支,则可以使用git fetch origin master
git remotes/主机名/分支名 事实上是查看.git下面的文件信息,比如经过git fetch之后,在.git目录下有如下的文件:
这里写图片描述

这里写图片描述
画红色底线的是最新的版本号。其实我们可以直接打开上述的那个文件也可以看到最新版本号:
这里写图片描述

有了这个版本号,那么我们就可以直接使用:
git reset --hard 版本号,就可以获取远程的最新版本了。

14、checkout的使用
如果我们在13的最后使用的是如下的命令:
git checkout 版本号,那么此时我们就会有如下的提示:
这里写图片描述

此时我们在使用git status查看下状态:
这里写图片描述

我们同样在用git branch看下当前所在的分支:
这里写图片描述
发现我们已经不在master分支了,此时我们我们怎样合并上面checkout下来的最新版本到master分支呢?
可以这样做:
git checkout master
git merge 版本号
如下:
这里写图片描述

这样就把最新的版本合并到了master分支,并且当前处于master分支了。
这里学会了checkout/merge/branch等命令。

15、删除本地分支
git branch -D 分支名
首先看看本地有哪几个分支,使用命令git branch -a
这里写图片描述
由图可以看出,凡是以remotes开头的都是远程服务器的分支。除外则是本地分支。
上图本地分支只有一个就是master。
此时我们可以为远程创建一个分支,如下命令:
这里写图片描述
git branch dev 为本地创建分支dev
git push origin dev 将本地分支推送到远程服务器
然后使用命令git branch -D dev即可删除本地分支。
另外注意,如果本地所在分支就是dev,那么需要切换到其他分支,才能删除dev。

16、删除远程分支
git push origin --delete dev
这里写图片描述
状况描述:
A用户删除了远程分支,使用命令:git push origin --delete dev
那么别人将不能在继续拉取了,因为远程分支没了。
此时怎么办呢?其实B和C,以及其他人,本地还是有dev分支的,所以只要将B和C中的那个最后提交的人的dev推送到远程即可。
加入C是最后提交的。
那么此时C要切换到dev分支,checkout dev
然后使用命令:git push origin dev或者直接使用git push origin 或者git push都可以,因为此时已经在dev分支了。
在这里插入图片描述
在这里插入图片描述

17、创建分支
git branch xxx

18、切换分支到xxx
git checkout xxx

19、创建并切换到xxx分支
git checkout -b xxx

20、查看分支
git branch 查看本地分支
git branch -r 查看远程分支
git branch -a 查看本地+远程分支

21、切换到远程分支
git fetch + git checkout xxxx
在这里插入图片描述
git checkout -b xxx origin/xxx

-b master2 是在本地创建master2分支,然后后面是要切换的master2分支。
上面的命令可以分解为:
git checkout -b master2
然后是:
git pull origin master2

22、创建本地分支,并推送到远程指定分支
当前是在master分支,本地和远程只有一个master分支。
创建本地分支dev1,并推送到远程分支dev1
在这里插入图片描述
在这里插入图片描述
这样远程就有了一个基于maste创建的另外一个分支dev1了。

23、拉取远程的分支到本地
首先要创建对应的本地分支,然后再拉取。
在这里插入图片描述

上面的三步可以合并为:
在这里插入图片描述

24、如何查看当前分支是由哪个分支创建的
git reflog show 分支名
在这里插入图片描述

25、查看当前分支在什么时候创建的
git reflog show --date=local dev1
git reflog show --date=relative dev1
git reflog show --date=iso dev1
在这里插入图片描述

26、git checkout .的作用
比如我们的文件删除了,那么一个方法是恢复到远程版本。另外一个方法是git checkout .重新检出。

27、add了文件,但是又想删除,git reset HEAD
比如:修改了一个文件a.txt
在这里插入图片描述

然后我们add了此文件:
在这里插入图片描述
此时我们想去除这个a.txt文件:
git reset HEAD a.txt
在这里插入图片描述

如果是很多文件,则直接使用git reset HEAD
在这里插入图片描述

28、删除未跟踪的文件和文件夹:
git clean -ndf
-n列出将要删除的文件或者文件夹
-d删除文件夹
-f删除文件
-x包含删除ignore中的文件,不常用。
在这里插入图片描述
然后是删除:
在这里插入图片描述

29、回到远程的最新版本
git reset --hard HEAD
git fetch
git pull
这样就回到了远程的最新版本了

30、回到指定的版本
git fetch
git log remotes/origin/master
git reset --hard 版本号

31、git fetch之后发生了什么
要查看远程的分支情况,需要先fetch远程的分支信息到本地:
在这里插入图片描述
然后在remotes下的origin下多了远程的分支信息。
这个文件是可以打开的,其实就是头文件的HEAD号:
在这里插入图片描述

32/我今天想模拟的是
1/提交了A版本
2/提交了B版本,修改了xxx文件,但是是错误的
3/提交了C版本
那么怎么讲xxx文件恢复到A中的版本,并且不要revert C版本。

33/git add 的撤销
使用git reset HEAD
这是撤销所有的git add .

撤销单个文件的add
git reset HEAD xxxx

33/git commit的撤销
git reset --soft HEAD^
这个–soft是保留你的修改,但是撤销了commit操作

34/git push的撤销
git reset --soft 7246e634cd7294a3182239ff49df841354fe4d4c
回到某个版本,保留自己的提交和33有点类似

35/强制推送本地版本
git push -f origin master
或者
git push --force origin master
或者
git push origin master --force

36/忽略.gitignore的使用
文件为:
在这里插入图片描述

vi打开,输入内容:
e.txt
abc/
意思忽略掉e.txt和abc/下的所有文件
在这里插入图片描述

ok。此时如果e.txt或者是abc/从来没有提交过,则理解生效。

但是如果e.txt和abc/提交过,那么则次忽略文件失效,此时需要使用:
git rm --cached e.txt

git rm -r --cached abc/
这样之后,使e.txt和abc/不在被跟踪
然后提交:
git commit -m"移除e.txt和abc/文件夹下的跟踪"
git push origin master

然后你再对e.txt和abc/下的文件修改都不会再有修改状态的提示了,此时忽略成功。

37、git clean -df
删除untrack的文件,或者文件夹。

38、git show commitId
查看指定commit hashID的所有修改:
git show commitId

39、git restore --staged xxx
撤销添加的git add xxx
在这里插入图片描述

40、git unlink of file
原因是,其他程序占用了某个文件,比如我unity打开的时候,读取了某个文件,同时你又想用git pull,此时会出现下面的报错。
解决方法,停止运行unity即可。
在这里插入图片描述
41、git pull时遇到error: cannot lock ref ‘xxx’
https://blog.csdn.net/qq_15437667/article/details/52479792

git pull -p

原因是你这个git工程的.git/refs目录下跟踪的某些git分支,在git pull的时候,与远端的对应分支的refs对比发现不同,所以导致git pull报错。

通常产生这个问题的原因是(以分支git/yousa/feature_01为例):

有人操作git/yousa/feature_01这个分支,在git push的时候使用了git push –force,(当然这个人的git push是push不上去),导致远端分支被覆盖,你本地的refs与远端无法一致,导致问题
git分支是不区分大小写的,如果有人删除掉这个远端分支又重新新建了一个这个分支也会出现同样的问题。

解决方法:
删除有问题的refs,可以直接在.git/refs下面根据错误提示删除对应的refs文件,比如这个就是需要删除refs/remotes/origin/git/yousa/feature_01文件(嫌麻烦直接删除整个refs目录也行)
使用git命令删除相应refs文件,git update-ref -d refs/remotes/origin/git/yousa/feature_01
简单粗暴强行git pull,执行git pull -p

42、git diff xxxx文件名,看不同。
这是查看本地和暂存区的不同
git diff HEAD xxxxx
这是查看本地和本地仓库的不同

43、git log以时间戳顺序查看
git log -5 --graph --oneline --date-order

44、git rebase

在这里插入图片描述
git rebase -i xxxx
是把xxxx之前的所有commit合并称为一条commit,而不包括xxxx这条提交记录。

45、git log
在这里插入图片描述
git log -5 --pretty=“%h %an %s”
在这里插入图片描述
46、一个同事遇到的问题
在clone的时候遇到的错误:
error: inflate: data stream error (invalid distance code) KiB/s
fatal: pack has bad object at offset 26060927: inflate returned -3
fatal: index-pack failed

解决方法:
https://blog.csdn.net/weixin_38382857/article/details/88103710

git clone --depth 1 http://xxx.xxx.xx/xxxxx/xxxxx.git

但是这样出造成一个问题,就是看不到远程的分支,解决方法:
git remote set-branches --add origin ‘*’
git fetch
git branch -a
git checkout xxx
结果这顿操作还是不行,原因是:
git clone出现curl 18 transfer closed with outstanding read data remaining的解决方法
缓存区溢出 curl的postBuffer的默认值太小

解决方法:
git config --global http.postBuffer 4096000000
搞大一点
git config --list | grep postbuffer
这样之后终于可以了。

还有一种方法,使用ssh方式,没试验。

补充2023-9-25
git clone -b OB --depth 5 xxxxxxxx.git
clone某个分支,深度为5的浅克隆

看不到其他分支的解决方法:
在这里插入图片描述
改为*即可:
在这里插入图片描述
也可以添加指定的分支名称:
在这里插入图片描述

看不到完整的log,解决方法:
git fetch --unshallow,然后重新用fork打开,即可看到完整的log了。
也可以使用git fetch --depth=50,拉取50条的log。
在这里插入图片描述

  1. fork中的checkout commit
    使用方式:git checkout bfb1e1e3009d2f729d168e95e02b4bec0657b6d8
    在这里插入图片描述
    这样之后,就会提示HEAD detached at bfb1e1e
    在这里插入图片描述
    此时在head处于detached状态,此时这个功能是用于查看之前的某个文件。
    此时要想提交的话,则按照上面的提示,使用git switch -c xxx 开个新分支然后提交即可。
    而如果使用命令:
    git checkout bfb1e1e3009d2f729d168e95e02b4bec0657b6d8 .
    这是将当前文件夹,回退到之前的某个版本。这个用于解决炸线是很好的方法。

  2. fork中的revert commit
    这个回退某个提交,比如:
    在这里插入图片描述
    比如上面的commitid为:8cb288cd987b016a0b188b558903b430bba5047a
    提交了两个文件a.txt和b.txt,但是发现提交出错了,此时咋做呢?
    可以直接使用:revert commit即可。
    在这里插入图片描述
    这样,就很方便的revert本次提交了,当然revert之后,要push到远端。
    这里还有一个:是否勾选Commit the changes的选项:
    在这里插入图片描述
    我们勾选下试试:
    在这里插入图片描述
    点击revert之后,这里出现了一个commit,等着推送。这里可以直接推送到远程了。
    如果此时要撤销这个commit咋办呢?
    在这里插入图片描述
    此时选择Revert commit1下面的那个commit,然后右键,选择Reset ‘dev666’ to Here:
    在这里插入图片描述
    选择Reset Hard即可。此时就撤销了Revert Commit1。

49、如何查看一个文件或者文件夹的历史提交记录
我们使用tortoisegit可以,在选择的文件或者文件夹上右键,show log即可。但是有时候小乌龟抽风你是没办法showlog的。
此时咋办,我们可以使用fork查看:
![在这里插入图片描述](https://img-blog.csdnimg.cn/1880abde5c2847cd9dd7aa785849a6d0.png在这里插入图片描述

选择all commits-》file tree-》某个文件或者文件夹-》history即可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/703968
推荐阅读
相关标签
  

闽ICP备14008679号