Skip to content
本页目录

常用 Git 命令

git config

查看仓库的用户名

  • git config user.name

查看仓库的邮箱

  • git config user.email

git config --global

设置全局 git 用户信息

  • git config --global user.name 'jingjing20'
  • git config --global user.email '1269928993@qq.com'

git config --local

设置某个仓库 git 用户信息

  • git config --local user.name 'jingjing20'
  • git config --local user.email '1269928993@qq.com'

优先级

local > global

git reset

git add / git commit 后想撤销怎么办?

js
git reset --soft HEAD~1
  • 这样就成功的撤销了你的 commit
  • 注意,仅仅是撤回 commit 操作,您写的代码仍然保留。
  • HEAD~1 中的 1 代表撤销一次 commit

参数的意义如下:

--mixed

  • 不删除工作空间改动代码,撤销 commit,并且撤销 git add . 操作。
  • 这个为默认参数,git reset --mixed HEAD~1git reset HEAD~1 效果是一样的。

--soft

  • 不删除工作空间改动代码,撤销 commit,不撤销 git add .

--hard

  • 删除工作空间改动代码,撤销 commit,撤销 git add .
  • 注意完成这个操作后,就恢复到了上一次的 commit 状态。

只是想改 commit 的描述信息?

如果 commit 注释写错了,只是想改一下注释,只需要 git commit --amend,此时会进入默认 vim 编辑器,修改注释完毕后保存就好了。

git log VS git reflog

  • 假设一个场景如下: 在我实习的时候,我本地的某个开发分支 A 被误删了, A 分支里面的代码没有 push 到远程,我该如何找回之前 A 的提交记录和代码呢?
答案
  • git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
  • 例如执行 git reset --hard HEAD~1,退回到上一个版本,用 git log 则是看不出来被删除的commitid
  • git reflog 则可以看到被删除的 commitid,我们就可以买后悔药,恢复到被删除的那个版本。

git cherry-pick

  • 在公司多人协作开发项目的时候,将代码从一个分支转移到另一个分支是常见需求,这时分两种情况。
  • 一种情况是,你需要另一个分支的所有代码变动,那么就采用合并(git merge)。
  • 另一种情况是,你只需要部分代码变动(某几个提交),这时可以采用 git cherry-pick。
  • git cherry-pick 命令的作用,就是将指定的提交(commit)应用于其他分支。

更多用法参考阮一峰大神的文章: https://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html

注意

今天遇到一个问题

我在一个本地分支上写好了代码提交了,之后误把这个分支删除了,我尝试用 git cherry-pick 到自己的新分支上,但是报错了 error: commit cf9d2748... is a merge but no -m option was given.

原因

当你试图 cherry-pick 一个合并提交时,Git 需要知道你希望应用哪个父提交的更改。这就是为什么会出现错误 commit is a merge but no -m option was given

合并提交有两个或多个父提交,你需要指定使用哪个父提交的更改。你可以通过 -m 选项来指定这是第几个父提交。通常,合并提交的第一个父提交是你合并到的分支,第二个父提交是你合并进来的分支。

解决方法

  1. 查看合并提交的父提交

    你可以使用 git show <commit-hash> 来查看合并提交的详细信息,包括它的父提交。例如:

    bash
    git show cf9d2748426b1ef5b31f4bcbc6640769b678707b

    这将显示合并提交的详细信息,其中包括它的父提交哈希。你会看到类似下面的输出:

    commit cf9d2748426b1ef5b31f4bcbc6640769b678707b (HEAD -> master)
    Merge: a1b2c3d d4e5f6g
    Author: Your Name <your.email@example.com>
    Date:   Tue May 23 10:20:30 2023 +0000
    
        Merge branch 'feature-branch'

    这里,a1b2c3d 是第一个父提交,d4e5f6g 是第二个父提交。

  2. 指定父提交

    使用 -m 选项来指定你希望 cherry-pick 哪个父提交的更改。例如,如果你希望应用第一个父提交的更改(通常是合并到的分支),你可以这样做:

    bash
    git cherry-pick -m 1 cf9d2748426b1ef5b31f4bcbc6640769b678707b

    这里的 -m 1 指定你希望应用第一个父提交的更改。

  3. 解决冲突

    如果在 cherry-pick 过程中遇到冲突,Git 会提示你哪些文件有冲突。你需要手动解决这些冲突,然后继续 cherry-pick 过程:

    bash
    git add <resolved-files>
    git cherry-pick --continue

    如果你决定放弃这个 cherry-pick 操作,可以使用以下命令:

    bash
    git cherry-pick --abort

总结

为了成功地 cherry-pick 一个合并提交,你需要使用 -m 选项来指定父提交。这是因为合并提交有多个父提交,Git 需要知道你希望应用哪个父提交的更改。通过查看合并提交的详细信息并指定父提交,就应该能成功地完成 cherry-pick 操作。

git stash 用法解析

应用场景

  • 1、当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到hotfix分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。
  • 2、由于你的疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。 总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash 中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。

常用命令

  • 1、git stash 能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。
  • 2、git stash save 作用等同于 git stash,区别是可以加一些注释,如下:
js
git stash的效果:

Saved working directory and index state WIP on master: 5feb75c update 2021-4-27

git stash save “jingjing”的效果:

Saved working directory and index state On master: jingjing
  • 3、git stash list 查看当前 stash 中的内容

  • 4、git stash pop 将当前 stash 中的内容弹出,并应用到当前分支对应的工作目录上。注意:该命令将堆栈中最近保存的内容删除(栈是先进后出)

  • 5、git stash apply 将堆栈中的内容应用到当前目录,不同于 git stash pop,该命令不会将内容从堆栈中删除,也就说该命令能够将堆栈的内容多次应用到工作目录中,适应于多个分支的情况。还可以使用 git stash apply + stash 名字(如 stash@{jingjing})指定恢复哪个 stash 到当前的工作目录。

  • 6、git stash drop + 名称 从堆栈中移除某个指定的 stash

  • 7、git stash clear 清除堆栈中的所有内容

git branch

  • 修改本地分支名
js
git branch -m oldBranch newBranch    //修改本地分支名
  • 删除本地分支
js
git branch -D branchName    //删除本地分支
  • 删除远程分支
js
git push --delete origin oldBranch   //删除远程分支
  • 将本地新分支名 push 到远程分支
js
git push --set-upstream origin newBranch  //将本地新分支名 push 到远程分支(会在远程仓库新建新分支名的分支)

git merge

  • git merge 后还没提交又不想 merge 这次的代码
js
git merge --abort

git commit

Git 修改某次 commit 的用户和邮箱地址及评注信息

**基于以下提交 log **

bash
commit 1a0c9d8cfe0ca7151519aae4dd6d57188064a5c1 (HEAD -> main, origin/main, origin/HEAD)
Author: wangzhihao <1269928993@qq.com>
Date:   Tue Aug 30 21:43:49 2022 +0800

    chore: class compiler

commit db01629dcefee1cdd4e6f73668dc31c6d02d6364
Author: jingjing20 <1269928993@qq.com>
Date:   Mon Aug 29 13:18:01 2022 +0800

    update: class observer  init

commit e0cf83404fc909a8f340fe9375498788423f44fb
Author: jingjing20 <1269928993@qq.com>
Date:   Sun Aug 28 00:24:12 2022 +0800

    updata: 初始化 mini-vue

操作步骤

  • 1、找到要修改的 commit ,本例中的 1a0c9d8cfe0ca7151519aae4dd6d57188064a5c1
  • 2、执行 git rebase -i <要修改的 commitId 的前一个 commitid>,这里的 db01629dcefee1cdd4e6f73668dc31c6d02d6364。这里即执行如下命令:
bash
git rebase -i <db01629dcefee1cdd4e6f73668dc31c6d02d6364>
  • 3、在 rebase 的交互模式下,将要修改的 commit 状态由 pick 修改为 edit
  • 4、修改后,保存退出rebase交互模式,我们会停在该commit下(下图中的 Stopped at 27f749c... chore: class compiler),并执行修复操作。

image-20220831154423339

  • 我们可以进行不同的修改

    js
    改作者和邮件地址:git commit --amend --author=“Author Name email@address.com”
    改日期时间:git commit --amend --date=“Thu, 07 Apr 2005 22:13:13 +0200
    改commit评注:git commit --amend -m “New Commit Message”
  • 修改完后执行 git rebase --continue

  • 最后将修改强制推送到远程仓库 git push origin master --force

根据某个 特殊字符查询历史 commit

要查询 Git 历史的 commit 信息中是否包含特定字符,您可以使用 git log 命令结合 --grep 选项。以下是如何执行这个查询的步骤:

shell
git log --grep="特定字符"
  • 在上述命令中,将 "特定字符" 替换为您要搜索的实际字符串。执行这个命令后,Git 将显示包含指定字符的所有 commit 信息。

  • 如果要进一步筛选结果,您可以添加其他选项。例如,您可以使用 --author 选项来筛选特定作者的提交,或使用 --since--until 选项来限定日期范围。

    1. 查询 commit 中包含字符串 "bug" 的信息:
shell
git log --grep="bug"
    1. 查询 commit 中包含字符串 "feature" 的信息,并限制日期范围:
shell
git log --grep="feature" --since="2022-01-01" --until="2022-12-31"
    1. 查询 commit 中包含字符串 "fix" 并由特定作者提交的信息:
shell
git log --grep="fix" --author="John Doe"

git 批量删除分支

批量删除本地分支

  • 直接命令行执行
bash
git branch | grep "feature/jing" | xargs git branch -D
  • 封装成脚本
bash
#!/bin/bash

# 获取所有分支(排除主分支)
branches=$(git branch | grep -v "main\|master")

# 循环删除每个分支
for branch in $branches; do
    git branch -d $branch
done

批量删除远程分支

  • 直接命令行执行
bash
git branch -r | grep  'cluster_manage' | sed 's/origin\///g' | xargs -I {} git push origin :{}
  • 封装成脚本
bash
#!/bin/bash

# 获取所有远程分支(排除主分支)
branches=$(git branch -r | grep -v "origin/main\|origin/master")

# 循环删除每个远程分支
for branch in $branches; do
    remote_branch=$(echo $branch | sed 's/origin\///')
    git push origin --delete $remote_branch
done

git clone --depth

  • 我在拉取 react 项目代码的时候,发现 react 仓库太大,直接 clone 下来太费时间。

  • 在执行 git clone 命令时,可以指定 --depth 选项

shell
git clone --depth 1 https://github.com/facebook/react
  • 这样只会拉取最新的提交,你会发现拉完之后不能切换到其他分支或者 commit

  • 可以再在终端执行

shell
git fetch --unshallow
  • 执行完成之后本地就会有所有的提交记录了。

Alt text

git 设置别名 alias

  • 实现切换分支的同时拉取最新代码的别名
shell
git config --global alias.cop '!f() { git checkout $1 && git pull; }; f'

MIT Licensed