Skip to content

版本管理工具Git学习笔记

About 2391 wordsAbout 8 min

git

2024-01-16

今天在这里记录一下自己在使用 Git 过程中遇到的一些问题,方便遇到相同的问题快速找到解决方法。

1、从指定分支创建分支

这个问题有两种情况,一种是这个分支在远端,本地没有,在本地创建一个和远端一样的分支;另外一种就是本地有,想根据本地的分支创建,其实也可以直接从远端拉取创建分支。

本地创建和远端一样的分支

简单两步解决:

  • git branch -r 查看远端的分支, 比如远端有一个 dev0 的分支

  • git checkout -b dev0_bak origin/dev0 这样就是在本地创建一个和 dev0 相同代码的 dev0_bak 分支,并切换到 dev0_bak

  • git branch dev0_bak origin/dev0 我们也可以只是创建,而不切换分支的命令, 含义与上面相同。

扩展命令:

  • git branch -a 我们知道-r 是查看远端分支, -a 的话就是查看本地和远端所有的分支
  • git branch 就是只输出本地分支

2、删除指定远端和本地分支

删除本地分支:

  • git branch -d dev0_bak 然后使用-d 参数删除指定分支, 我们可以在任何分支执行这个命令,但是不能删除自己处所的分支,要删出的话需要 checkout 出来。 -d参数在删除前会检查 merge 状态, 还有一个-D的参数,是git branch --delete --force的简写,它会直接删除

删除远端分支:

  • git push origin --delete merge0 我一般是不直接删除远端分支的,怕删除了,(笑哭),要删的话可以用前面的命令;这里 merge0 是我要删除的分支名称。 补充:今天还是尝试删除了远程的分支,确定了是自己不要的分支,如下操作,这里 main 就是远程分支,我没有加 origin(20240229 更新)
zero@MacBook-Pro jet5devil-index % git push origin --delete main
To https://github.com/xxxxDengC/xxxx-index.git
 - [deleted]         main

3、Github 的 PR 是什么?

就是 github 提供的一个功能,如果你有一个仓库,这个时候别人觉得你的代码有问题,他就把你的仓库代码 fock 下来,然后做了修改,然后他就会提交一个 pr 给你,表明他在哪些文件里面修改了哪些代码,这些都有记录,然后你看到了他提的 pr,这个时候你就看能不能把他修改的代码合并到你的仓库分支里面。

4、将某个分支的文件合并到当前分支

我们先切换到被合并的分支,我这里是 vuedev0, 我们需要将 main 分之上面的 README.md 合并到 vuedev0 上面 git checkout main README.md ,我们也可以使用远程分支 git checkout origin/main README.md

5、比较分支的差异

参考:git 对比两个分支差异 比较两个分支的差异: git diff vuedev0 main --stat 比较两个分支某个文件的差异:git diff vuedev0 main README.md

6、开启了 clash 但是提交 github 还是超时

有的时候我们科学上网了,但是在 push 的时候还是会出现超时的现象, 这里我们将 git 代理到 7890 这个端口,这个端口就是 clash 的端口。

git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy https://127.0.0.1:7890

开 clash 后 Git 依然超时的解决方法

7、Git 回退到某次 Commit

git reset --hard 19438cb5 这里就是回退到 19438cb5 这次提交。

今天再用 vuepress 来构建网站,在公司里面弄了一点,这个时候想把代码提交到 gitee,然后回家的时候再弄,但是吧,创建出来一个仓库,但是上传不上去代码

这个时候就看到一个 blog 说是使用 git pull --rebase origin master 来处理,但是一执行,pa,我本地的代码没有了,哎,难受

这里的--rebase 的作用是取消掉本地仓库刚刚的 commit。

既然已经提交了 commit,那么应该是有记录的,然后我立马百度了一下。

# git 进行版本回退(文件恢复、恢复误提交、已提交) 然后找到命令 git reflog, 找到对应 commit 的版本,git checkout 回去,真是有惊无险。

git reflog命令可以查看看所有分支的所有操作记录(包括(包括 commit 和 reset 的操作),包括已经被删除的 commit 记录。

git reset 命令详解(一)—— Git 学习笔记 07

git reset --soft xxx
git reset --hard xxx

8、Git 取消文件追踪

有的时候我们不想要将某些文件提交到 github 上面,这个时候我们该怎么办了? 我们可以创建.gitignore 文件, 然后把不想要提交的文件写到这个文件里面。

但是有时候你会发现,我明明都在这个文件里面定义了不提交的文件或者是目录,但是最后还是提交上去了,这是为什么呢?

那是因为.gitignore 只能忽略那些原来没有被 track 的文件, 如果某些文件已经被纳入到了版本管理中,则修改.gitignore 是无效的。解决方法就是先把本地缓存删掉(改变成未 track 状态),然后在提交。

git rm -r --cache .   // . 表示所有的文件,如果需要指定某一个文件,这里可以写上文件名
git add .
git commit -m 'update .gitignore'

注意:不要误解了.gitignore 文件的用途,该文件只能作用于 Untracked Files, 也就是那些从来没有被 git 记录过的文件(自添加以后,从未 add 及 commit 过的文件)。如果文件曾经被 git 记录过,那么.gitignore 就对他们完全无效

9、Git 只合并某个分支的某个文件

只合并 main 分之的 README.md 这一个文件当当前文件里面。

git checkout main README.md

10、撤销已经 commit 上去但是没有 push 的提交

可以先用git reflog查看历史提交记录

  • 软撤销 -- soft:本地代码不会变化,只是 git 转改会恢复为 commit 之前的状态,不删除工作空间的代码,撤销 commit,不撤销git add . -> git reset --soft HEAD~1,表示撤销最后一次 commit,1 可以换成其他更早的数字。
  • 硬撤销 -- hard:本地代码会直接变更为指定的提交版本,慎用,删除工作空间改动的代码,撤销 commit, 撤销git add . 注意完成这个操作后,就恢复到上一次的 commit 状态, git reset --hard HEAD~1
  • 混合撤销 -- mixed: 不删除工作空间改动的代码,撤销 commit,并且撤销git add . 操作
  • 如果仅仅是 commit 的消息内容填错了 git commit --amend

11、修改 git commit 内容

git commit --amend  // 修改前一次提交的内容
git rebase -i HEAD~2  // 修改最近的两次提交,最新的在最下面,最老的提交在最上面

12、取消已经合并代码

git merge --abort

13、如何解决仓库太大无法拉取的问题

fatal: early EOF fatal: index-pack failed

14、开启 Clash 后 Git 提交依然超时

最近疯狂向 github 上面提交代码,每次提交都要超时,真的很烦人,关键还是开了梯子。

这里简单说一下用 clash 代理的情况下,设置 github 全局代理。clash 一般默认的是 7890 的端口,我们只需要运行下面两个命令设置一下 github 的全局代理就可以了。

参考开clash 后 Git 依然超时的解决方法

1.1、设置代理

git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy https://127.0.0.1:7890

1.2、查看代理

git config --global --get http.proxy
git config --global --get https.proxy

1.3、取消代理

git config --global --unset http.proxy
git config --global --unset https.proxy

15、提交 Git 时提示需要账户名密码

有一小部分时间,我们提交代码被要求输入用户名和密码,但是 github 已经取消了使用密码登录的功能,转而使用 access token 来登录,相当于将密码转换成 access token。

在 github 网页端,点击个人头像可以设置。

settings -> Developer settings -> Personal access tokens -> Tokens

image-20240118125618933

然后点击new personal access token, 进入之后,输入 note(标题), 选择失效时间,选择开启的权限(我一般除了删除的不勾,其他的都勾上了),最后点击生成,点击之后会出现一个 access token 码,这个就是在命令行里面输入的密码。

image-20240118125720915

16、如何将Detached HEAD提交到master分支

记录场景后面完善。

现在在 master 上面,把刚才的修改的代码都已经 push 到 github 上面了,这个时候发现有点问题,就从某个 master 的某个 commit 拉出来一个分支修改,但是这个分支只是临时的。

现在我需要将我在临时分支修改的代码合并到 master 上面。 然后 merge 之后重新提交到 github。

我在到网页上看的时候,这里出现了一个问题,就是 github 上面提示,让我创建一个 pr,这里创建失败了,提示如下:

Pull request creation failed. Validation failed: No commits between master and merge0

参考:如何将我的”Detached HEAD”提交合并到主分支(master)git 用 A 分支的某个文件覆盖 B 分支某个文件

Changelog

Last Updated: View All Changelog
  • feat(wiki): hammeSpoon: 复制出来的文件需要重新生成永链

    On 3/27/25

求求了,快滚去学习!!!

求求了求求了,快去学习吧!

【题单】贪心算法

不知道方向的时候,可以多看看书,书会给你指明下一步该干什么,加油!