跳至主要內容

git

chanchaw大约 14 分钟language

配置

设置用户名邮箱

每次新安装电脑操作系统要先执行下面代码设置全局参数

# 设置用户名
git config --global user.name chanchaw

# 设置用户邮箱
git config --global user.email chanchaw@126.com

# 使用代理网络
git config --global http.proxy http://127.0.0.1:1080
git config --global https.proxy https://127.0.0.1:1080
# 取消代理
git config --global --unset http.proxy
git config --global --unset https.proxy

如果每次 push 提示输入用户名,则执行下面代码后输入依次账号即可,以后不会再要求

git config --global credential.helper store

StackBlitz 演示

stackblitz.com/github/{GH_USERNAME}/{REPO_NAME}

指令与案例

本次合并到上次提交

自上次提交并推送云端后修改了文件,想要把本次的修改提交到上次的提交中并强制推送云端的操作步骤

# 添加所有修改
git add .
# 合并到上次提交中,保留上次提交时写的备注
git commit --amend --no-edit
# 如果要修改上次提交时的备注
git commit --amend

# 推送云端的命令也和普通的推送不一样,下面的分支名一般是 master
git push --force-with-lease origin <分支名>

右键菜单

安装后一般会在右键菜单中添加 open git bash here,如果没有,可通过修改注册表的方法添加。

[HKEY_CLASSES_ROOT\Directory\Background\shell\Git Bash Here]
@="Git Bash Here"
"Icon"="[你的Git安装路径]\\mingw64\\share\\git\\git-for-windows.ico"

[HKEY_CLASSES_ROOT\Directory\Background\shell\Git Bash Here\command]
@="\"[你的Git安装路径]\\bin\\bash.exe\" --login -i"

通过右键菜单属性找到文件所在位置,可以找到 git-bash.exe 在目录 C:\Program Files\Git 下,那么上面代码中第二个 [你的Git安装路径] 就填写这个,上面的 Icon 是设置右键菜单项中的图标,是可选项。

合并分支代码

将分支 cc 上一次提交的代码合并到 master 的做法(最佳实践),执行下面步骤前保证本地 cc 分支的代码已经从云端拉取最新的下来

# 1. 本地先切换到 master 分支
#    保证云端分支 cc 的代码最新
git checkout master
# 2. 合并代码
#    --no-ff 标志会强制创建一个合并提交,即使合并可以通过快进(fast-forward)完成。这保留了分支历史,使项目历史更清晰
git merge --no-ff cc -m "合并分支cc的代码过来"
# 3. 推送最新代码到云端
git push origin master

忽略与移除文件

.iml 文件是 IntelliJ IDEA(一款流行的 Java 集成开发环境)用于存储项目模块设置的文件。它包含了关于项目如何被IDEA组织和管理的元数据,比如项目结构、依赖项、构建路径等。尽管这个文件对于IDEA来说是重要的,但它并不是源代码文件,也不是构建系统(如Maven或Gradle)所需要的,因此它通常被推荐添加到版本控制的忽略列表中。

如果你已经在 .gitignore 文件中添加了规则来忽略 项目名.iml 文件,但 git status 仍然显示这个文件,可能是由以下几个原因造成的:

  1. .gitignore 文件未被正确保存或提交:确保 .gitignore 文件已经被提交到仓库中。
  2. .gitignore 文件的规则格式不正确:检查 .gitignore 文件中的规则是否正确无误。规则应该类似于 *.iml 或者更具体地 项目名.iml(虽然更推荐使用 *.iml 来忽略所有 .iml 文件)。
  3. .iml 文件已经被加入到版本控制中:如果 .iml 文件之前已经被添加到仓库中,仅仅在 .gitignore 中添加规则是不足以将其从版本控制中移除的。你需要从版本控制中删除它(使用 git rm --cached 项目名.iml),然后提交这个改变。

针对你的需求,以下是具体步骤:

  1. 确认 .gitignore 文件:确保 .gitignore 文件中包含了 *.iml项目名.iml

  2. 从版本控制中移除 .iml 文件(如果它已经存在):

    git rm --cached 项目名.iml
    

    或者使用更通用的方法:

    git rm --cached *.iml
    

    这将从索引中移除 .iml 文件,但不会从文件系统中删除它们。

  3. 提交更改:

git commit -m "Remove .iml files from version control"
  1. 检查 git status:确保 .iml 文件不再显示在待提交的文件列表中。

现在,.iml 文件应该被忽略,不再包含在版本控制中。当你或其他人从仓库中检出项目时,.iml 文件将不会自动生成,除非IDEA在项目打开时自动创建。不过,由于这些文件是IDE特定的,因此最好让IDE自己管理它们。

创建仓库

在 bash 中切换到项目根目录下执行命令:git init

添加到缓冲区

# 添加所有文件到缓冲区
git add .

# 添加单个文件
git add 文件名

# 批量添加指定类型的文件
git add *.html

推送提交与注释

# 提交
git commit -m "这里写注释"

# 推送本地已经commit的内容到远端
git push 远端仓库名称 远端分支名称

修改已经提交的信息


两种情况下可以使用命令 git commit --amend 进入修改注释信息的界面:

  1. 已经 commit 还没有 push 到远端
  2. 想要修改刚刚 push 到远端的 commit 的注释信息 使用上面命令进入修改界面后操作类似 linux 中的命令,通过键盘 i 键进入编辑状态,修改后通过一系列按键保存退出:esc -> 冒号 -> wq -> 回车

强制提交远程仓库


从远端拉取源码到本地后回退到历史提交点,并且修改代码然后提交到远端时会提示

! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'https://gitee.com/chanchaw/wxpad.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

导致无法提交,如果是一人开发就可以强制提交覆盖掉不想要的 commit ,使用下面的方法

git push -u origin master -f

多行注释


# 通过多个 -m 填写多个注释
git  -m "commit title" -m "commit description"

# 或者下面的方式 - 换行符
git commit -m "commit title
>
> commit description"

# 第三种方法:不使用参数 -m ,编辑器会自动打开 vi 编辑器
git commit

# 追加注释到上一个 commit
# 上次提交后又有代码修改但是不想创建新的 commit 使用下面的代码将最近的修改提交到上一个 commit 中,记得还要 push 到远端
git commit --amend --no-edit

仓库相关

# 查看关联的远端仓库地址
git remote -v

# 关联远端仓库
git remote add 远端仓库名称 远端仓库地址

# 修改远端仓库
git remote set-url origin https://gitee.com/chanchaw/saas-switch-datasource.git

分支与拉取

拉取到指定commit

想要拉取 master 分支指定 commit 的代码,不要通过下面方法

git clone [git-url] -b [branch-name]
git reset --hard [commit-number]

因为最新的 commit 相对于想要的 commit 可能会有新增的文件,通过 reset 可能无法排除新增的文件,最佳实践如下

# 创建一个空目录用来下载代码
# 初始化为 git 仓库
git init
# 设置云端仓库的地址
git remote add origin <remote-url>
# 设定想要获取到的 commit 哈希值,并下载文件
git fetch origin <sha1-of-commit>
# 合并代码到本地
git merge <sha1-of-commit>
# 开始使用吧

下面是关于的常用命令


# 创建分支
git branch 分支名称

# 切换分支
git checkout 分支名称

# 查看本地和远端的所有分支
git branch -a

# 从远端拉取分支并且合并到本地当前分支
git pull 远端仓库名称 远端分支名称


# 删除本地分支,注意此时路径不要在被删除的分支上
git branch -d 分支名称

# 强制删除本地
git branch -D dev20181018

# 删除远端仓库分支
git push 远端仓库名称 --delete 分支名称
git push https://gitee.com/chanchaw/项目名称.git --delete 分支名称

# 从远端克隆指定名称的分支
git clone -b 分支名称 远端仓库地址

# 拉取本地不存在的新分支
git fetch origin 分支名称

# 或者通过 checkout 拉取并切换分支
git checkout newBranchNotLocal

强制覆盖本地代码


本地代码严重过期或者可以放心覆盖的情况下,可以通过下面的方法拉取远端的最新代码到本地,并且更改工作树中的所有文件并重置主分支

# 下载所有文件
git fetch --all
# --hard 表示强制更新所有文件
# reset 表示重置主分支
git reset --hard origin/master

日志相关

使用命令设置查看日志的格式:git config --global --replace-all log.date iso 当命令中没有 --replace-all 时,有些情况下会报错误:

error:cannot overwrite multiple values with a single value Use a regexp,--add or --replace-all to change log.date

说明之前设置的日期时间格式带有换行符,设置带有 --replace-all 的参数后就可以设置成功了 我常用的查看日志的格式是:git log --pretty=format:"%h,%ad,%an:%s" --date=format:"%Y-%m-%d %H:%M:%S" 按照顺序参数依次代表:

%h = 哈希值 %an = 提交者 %ad = 提交的日期时间 %s = 提交的描述

# 查看当前分支提交日志
git log

# 单行查看日志
git log --oneline --decorate

# 处于查看日志的状态中,通过字母q退出
q

# 对比最近两次更新的差异
git log -p -2


git log --pretty=format:"%an,%cd:%s"

# 上面的查看方式在 2021年6月14日 16:30:47 之后不在使用,日期格式不方便看
# 前面的 %h 表示简短格式的 hash 值
git log --pretty=format:"%h,%ad,%an:%s" --date=format:"%Y-%m-%d %H:%M:%S"
# 显示的格式如下:
# 2021-06-14 15:59:10,chanchaw:test

# 查看带有 hash 的提交日志
git log --pretty = oneline

放弃撤销与回退

放弃所有改动

放弃当前所有改动,包括新增的文件,删除的文件,修改的文件,下面是关于该功能的所有命令介绍 已验证的命令:git clean -df

常用命令

#本地所有修改的。没有的提交的,都返回到原来的状态
git checkout . 

# 放弃指定名称的文件的修改
git checkout 文件名

git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop回复。

git reset --hard HASH #返回到某个节点,不保留修改,已有的改动会丢失。
git reset --soft HASH #返回到某个节点, 保留修改,已有的改动会保留,在未提交中,git status或git diff可看。

git clean -df #返回到某个节点,(未跟踪文件的删除)
git clean 参数
    -n 不实际删除,只是进行演练,展示将要进行的操作,有哪些文件将要被删除。(可先使用该命令参数,然后再决定是否执行)
    -f 删除文件
    -i 显示将要删除的文件
    -d 递归删除目录及文件(未跟踪的)
    -q 仅显示错误,成功删除的文件不显示


注:
git reset 删除的是已跟踪的文件,将已commit的回退。
git clean 删除的是未跟踪的文件

回退到指定的commit

git reset --hard 指定的commit

从暂存区移除文件

# 移除指定名称的文件
git reset HEAD --path/filename

# 移除整个目录
# 在 cmd 中切换路径到想要移除的目录下,比如项目的根目录是 D:\software\frontEnd\demo\wpdevsaxios
# 想要移除该目录下的 node_modules,那么要在 cmd 中切换路径到 node_modules 下,然后执行下面的命令
git reset HEAD -- .

撤销commit

已经 add 并且 commit 后发现由于文件过大无法推送到云端,使用下面方法将文件剔除然后在 .ignore 中忽略该文件重新推送即可

git filter-branch -f --prune-empty --index-filter "git rm -rf --cached --ignore-unmatch src/develop/game-plugin/video/CE找冒险岛数据字幕.mp4" --tag-name-filter cat -- --all

取消远端的push

本地已经commit并且也推送到云端后想要将云端的进度回退到上一个 commit 的步骤:

# 强制本地回退到上一个commit(下面参数 --hard 后面的标识是上一个commit)
git reset --hard 3866ab54f01cec46b21a92952355b65549f48daf

# 将本地当前HEAD推到云端,即将云端进度恢复为上一个commit
git push origin HEAD --force

比较和对比

git diff


显示尚未缓存的文件的改动,这里的尚未缓存指没有通过 git add 将被修改文件加入暂存区,也可以在后面显式的给出文件名称,只查看该指定的文件,即:git diff 文件名称

git diff --cached


查看已经缓存的文件中的修改,本指令类似上面的指定也可以在后面通过追加文件名称只查看该文件的改动

对比两个commit间的差异

# 对比统计两次提交的不同点
git diff 2fb056af8ed85c4602b7943f63ba1f900cc09312 8c7aac6d290a7e20177e3b0533de37bbe7e6cc3f --stat
# 对比一个文件的变动
git diff 2fb056af8ed85c4602b7943f63ba1f900cc09312 8c7aac6d290a7e20177e3b0533de37bbe7e6cc3f src\maintenance\projs\染厂项目\web\开发人员工具.md

故障排查

文件过大无法push

push 到云端时出现下面提示:

λ git push origin dev
Enumerating objects: 56, done.
Counting objects: 100% (56/56), done.
Delta compression using up to 4 threads
Compressing objects: 100% (31/31), done.
Writing objects: 100% (34/34), 426.40 MiB | 3.43 MiB/s, done.
Total 34 (delta 20), reused 0 (delta 0), pack-reused 0
remote: Powered by GITEE.COM [GNK-6.4]
remote: error: File: aae09c0577eb6dedda8afce54ff42cad52ef9a8b 212.06 MB, exceeds 100.00 MB.
remote: Use command below to see the filename:
remote: git rev-list --objects --all | grep aae09c0577eb6dedda8afce54ff42cad52ef9a8b
remote: Please remove the file from history and try again. (https://gitee.com/help/articles/4232)
To https://gitee.com/chanchaw/showa.git
 ! [remote rejected] dev -> dev (pre-receive hook declined)
error: failed to push some refs to 'https://gitee.com/chanchaw/showa.git'

可以通过 git rev-list --objects --all | grep aae09c0577eb6dedda8afce54ff42cad52ef9a8b 查看哪个文件过大 然后通过下面命令删除文件(已经通过 add 和 commit 将所有变动更新到 git ,所以需要先删除)

git rm --cached doc/20230605系统预览/设备维修.mp4
# 然后使用下面命令 restore staged,再 push ,即忽略该文件,将其他文件 push 
git restore --staged doc/20230605系统预览/设备维修.mp4
# 然后在 git 仓库根目录下创建文件 .gitignore,并在其中填写文件:doc/20230605系统预览/设备维修.mp4
# 最后再次 push

Updates were rejected because the tip of your current branch is behind

2020年5月9日13:23:41 发生该问题是在开发过程中发现新做的修改都不想要了,使用git reset --hard 指定的commit 将代码回退到了之前提交的一个 commit 上,再次修改代码后达到了想要的效果,此时推送到远端时就出现该问题了,那么有两种解决方法:

  1. 先使用 pull 将远端代码拉下来再进行修改最后提交 - 多人协作时要这样做
  2. 强行推送并覆盖:git push -u origin 远端分支名称 -f ,如果1人独自开发可以使用本方法,多人协作会覆盖他人代码

fatal: HttpRequestException encountered

在微软收购后需要在WINDOWS电脑安装验证管理器 git 上解决本问题的地址是 https://github.com/Microsoft/Git-Credential-Manager-for-Windows/releases/tag/v1.14.0 \xdfserver\安装程序\java\GCMW-1.14.0.exe 安装后使用 git push 运行成功

Connection was reset, errno 10054

执行下面命令之后再 clone

git config --global http.sslVerify "false"

Initialized empty Git repository

通过 git init 创建新仓库后还没有使用 add 和 commit 提交,会出现该提示

推送提示错误:cHRM chunk does not match sRGB

真的是莫名其妙的问题,在 cmder 中使用QQ输入法的英文状态执行:git push origin master 报出上面的错误提示,切换到WIN10下微软默认的输入法再推送就没问题

通过 git add . 添加目录失败

检查新增的子目录下是否有 .git ,有的话删除,重新 git add . 即可

中文目录乱码

git config --global core.quotepath false
中文乱码
中文乱码

remote: [session-474e1980] Access denied

通过下面命令查看本机当前 git 使用的账号

cat ~/.gitconfig

发现使用的账号不对(同当前项目所在仓库的开发者身份不符)所以没有权限,进行下面步骤解决该问题

  1. 删除本机的 windows 访问凭据 windows访问凭据

  2. 删除本地关联的远程仓库

    git remote rm origin
    
  3. 重新添加仓库

    git remote add origin https://gitee.com/chanchaw/wxbebarrel.git
    
  4. 测试推送

    git push --set-upstream origin cc
    git push origin chanchaw
    

官方

官网

贮藏与清理

官方文档


https://git-scm.com/book/zh/v2/Git-%E5%B7%A5%E5%85%B7-%E8%B4%AE%E8%97%8F%E4%B8%8E%E6%B8%85%E7%90%86#_git_stashing

贮藏解决的问题


贮藏的使用方法


使用方法见项目 https://gitee.com/chanchaw/gitdemo 的 “通过贮藏修复紧急BUG”