前言

若文章有误,欢迎读者留言反馈

(一) 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
2
git checkout main
git pull --rebase origin

执行以上命令会将你在本地对 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 如何修改已提交信息

  1. 当我们已通过git commit -m '已提交最新的备注'命令将代码提交到了本地仓库,或者进一步执行了git push origin master命令已将代码推送至远程仓库,发现已备注的信息并不能准确的表达我们的意思,想修改,那么我们可以执行以下命令:
1
git commit --amend
  1. 执行完第一步的命令后界面最上方会显示出上次已提交的最新的备注信息,这个是vim环境。可以通过i键进入到编辑模式,然后将最上方的备注信息更新为我们现在要的备注信息,然后和vim的操作一样,按键盘上的ESC键退出编辑模式,输入:wq!回车即保存并退出【wwrite的缩写,意为保存;qquit的缩写,意为退出;这两个命令也可以分开执行;感叹号可以省略】
  2. 执行推送命令,将本地代码推送到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 文件