版本管理工具Git学习笔记
今天在这里记录一下自己在使用 Git 过程中遇到的一些问题,方便遇到相同的问题快速找到解决方法。
1、从指定分支创建分支
这个问题有两种情况,一种是这个分支在远端,本地没有,在本地创建一个和远端一样的分支;另外一种就是本地有,想根据本地的分支创建,其实也可以直接从远端拉取创建分支。
本地创建和远端一样的分支
简单两步解决:
git branch -r
查看远端的分支, 比如远端有一个 dev0 的分支git checkout -b dev0_bak origin/dev0
这样就是在本地创建一个和 dev0 相同代码的 dev0_bak 分支,并切换到 dev0_bakgit 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
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 的全局代理就可以了。
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
然后点击new personal access token
, 进入之后,输入 note(标题), 选择失效时间,选择开启的权限(我一般除了删除的不勾,其他的都勾上了),最后点击生成,点击之后会出现一个 access token 码,这个就是在命令行里面输入的密码。
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 分支某个文件