git踩坑笔记
前言
若文章有误,欢迎读者留言反馈(一) git pull冲突问题
了解
git pull
git pull
命令用来从远程仓库下载更新内容,并立即将对应内容更新到本地仓库。在Git
的协作工作流中,合并远程仓库变更到本地仓库是很常见的工作。而git pull
命令实际上就是其他两个命令的结合体,先git fetch
然后紧接着git merge
。在git pull
命令执行的第一个阶段,会先对当前本地HEAD
指针指向的分支执行git fetch
。当原称更新内容下载完成之后,git pull
会接着进入合并流程。合并操作会创建一个新的commit
,并且HEAD
指针也会随之更新而指向这个新的commit
。
我遇到的问题:由于远程仓库较新,而我本地仓库较旧,于是推送不上去,git希望我git pull
,一执行出现了远程覆盖本地的情况,但是我本地代码是我写好要推送远程仓库的代码。
- 回到之前版本又不让我推送,而现在这个版本又不是我想要的,于是想了一个笨办法,回退到之前版本,把我写好的代码备份一下,再拉取远程这样本地仓库就能和远程仓库版本同步,再把备份好的某个文件和你拉取不符合的文件直接替换掉,再提交推送,成功!!
- 具体操作:回滚,
git log
,查看一下版本号,取之前版本对于版本号的号前六位,git reset --hard 版本号前六位
,把整个项目文件或者写好的代码文件进行备份,再拉取远程仓库代码git pull
,文件替换,添加提交推送三部曲,然后就成功了!! - 其实网上也又很好的解决方案,例如分支啊,以及
git rebase
,由于git pull
经常回帮你执行合并git merge
,其实可以设置一下git config --global branch.autosetuprebase always
pull 与 rebase
扩展:
--rebase
选项的加入不会产生额外的合并提交,因此会保证整个提交历史是线性的。很多开发者相对于merge
更加喜欢使用rebase
,因为后者更像是 “我要把我的变更放在其他人已经提交的变更之上”。这一流程在很多协作场景下显得更加自然。
事实上,由于pull --rebase
的工作流程如此常见,以至于在git
中有一个专用的配置项为之而生。
1 git config --global branch.autosetuprebase always
执行以上命令之后,所有的git pull
命令都将以git rebase
的方式整合远程变更,而不是以git merge
的方式。
git pull + rebase
,以下示例展示如何使用rebase
方式同步并更新远程仓库的main
分支:
1 | git checkout main |
执行以上命令会将你在本地对main分支的提交放到所有其他人的提交之上。
(二) git push报错
报错: unable to access ‘https://github.com/xxx/xxx.git/‘: OpenSSL SSL_read: Connection was reset, errno 10054
DNS
污染,做一下ssh
连接github
,文章链接
git回滚到指定版本后,版本落后于远程仓库,如何提交到远程分支?
远程仓库上面显示提交时间是和你从暂存区提交本地仓库提交时间保持一致,而不是说你从本地仓库提交到远程仓库的时间就是远程仓库上面显示提交时间git reflog 可以查看所有分支的所有操作记录包括已经被删除的commit记录和reset的操作
git log 可以显示所有提交过的版本信息
二者的区别:用git log 则看不出来被删除的commitid,用git reflog 则可以看到被删除的commitid
git reset —hard HEAD 切换到版本号为HEAD的那个版本 (个人喜欢使用git log 可以看到commit的时间)
如果冲突的话,对于个人仓库我一般都会强制推送,可以使用 git push -f origin test 强制推送到远程分支,-f 强制,origin 远程仓库名,test 远程分支名
(三) git如何修改已提交信息
- 当我们已通过
git commit -m '已提交最新的备注'
命令将代码提交到了本地仓库,或者进一步执行了git push origin master
命令已将代码推送至远程仓库,发现已备注的信息并不能准确的表达我们的意思,想修改,那么我们可以执行以下命令:1
git commit --amend
- 执行完第一步的命令后界面最上方会显示出上次已提交的最新的备注信息,这个是
vim
环境。可以通过i
键进入到编辑模式,然后将最上方的备注信息更新为我们现在要的备注信息,然后和vim
的操作一样,按键盘上的ESC
键退出编辑模式,输入:wq!
回车即保存并退出【w
是write
的缩写,意为保存;q
是quit
的缩写,意为退出;这两个命令也可以分开执行;感叹号可以省略】 - 执行推送命令,将本地代码推送到
github
远程仓库:1
git push origin <远程分支名>
(四)解决已提交文件在.gitignore中加入忽略后无效问题
为什么会无效?
主要还是因为你这个已提交文件已经存在于本地暂存区、版本区中了,git
会对你这个文件继续进行追踪
1 git rm -r --cached 文件/文件夹
指令解读
rm
是将文件从工作区和暂存区删除-r
是递归删除,进入某个目录中,执行此语句,会删除该目录下你所指定的文件/文件夹--cached
是你所指定文件/文件夹从暂存区中移除,但工作区保留
执行完这条命令,本地暂存区就没有这个文件了,然后提交到版本区,再推送到远程仓库,远程仓库就不会有这个文件了
git命令非得在初始化目录使用?
例如A文件夹下有个B文件夹和C文件,而B文件夹下有个D文件,A文件夹是我们仓库根目录即git init
初始化的地方,这时我在D文件中添加了一句Hello World
,而C文件正在更改中,我们并不想现在提交C文件,但是D文件现在必须提交,这时我们可以在B文件夹下开启终端,进行git三连
,它只会把B文件夹下的改动的文件提交推送上去,并不影响我们的C文件