🔨 生产工具

git 常用命令

修改已提交的 comment message

git pull = git fetch + git merge 

取消跟踪已经提交的文件

git rm --cached -r file 

git bisect 二分查找用法

git bisect start [终点] [起点] 
git bisect good/bad 
git bisect reset 

cherry-pick

git cherry-pick (commitid1..commitid100] 
git cherry-pick [commitid1^..commitid100] 

远程分支强行更新本地分支

git fetch --all 
git reset --hard origin/xxx 

查看 git 引用日志

git reflog

git log 查找

# --author 指定作者
# --since 记录开始时间
# --until 记录结束时间
# --name-only 展示改动的文件名
git log --author=shishuangxi_wd --since="2024-01-01" --until="2024-12-31" --name-only

查看某个特定的 Merge Commit 具体引入了哪些提交,并获取这些提交的作者列表

通常,一个 Merge Commit 有两个父节点:

  • Parent 1 (^1): 合并发生时所在的目标分支(例如 main)。
  • Parent 2 (^2): 被合并进来的源分支(例如 feature/xxx)。

我们要找的就是 包含在 Parent 2 中,但不包含在 Parent 1 中的提交

以下是具体的操作步骤和命令:


方法一:使用命令行 (最推荐,灵活)

假设你的 Merge Commit 的 SHA 是 e8d2f9a (请替换为你实际的 SHA)。

1. 仅查看作者名单 (去重)

如果你只想看 “是谁参与了这个功能的开发”,使用以下命令:

Bash

git log e8d2f9a^1..e8d2f9a^2 --format="%an" | sort | uniq
  • e8d2f9a^1..e8d2f9a^2: 表示“在父节点2中存在,但在父节点1中不存在的提交范围”。
  • --format="%an": 仅输出作者名字 (Author Name)。如果你想看邮箱,用 %ae
  • | sort | uniq: 对结果排序并去重,这样每个作者只显示一次。

2. 查看作者名单及提交次数

如果你想看每个作者贡献了多少个 Commit:

Bash

git log e8d2f9a^1..e8d2f9a^2 --format="%an" | sort | uniq -c | sort -nr
  • uniq -c: 统计出现的次数。
  • sort -nr: 按数字倒序排列(贡献最多的在最上面)。

3. 查看详细列表 (哈希 + 作者 + 提交信息)

如果你需要人工核对每一条提交:

Bash

git log e8d2f9a^1..e8d2f9a^2 --format="%h - %an : %s"

4. 按作者查看不同作者修改的文件列表

git log --no-merges --format="%an" dc8b57231^1..dc8b57231^2 | sort -u | while read author; do
  echo -e "\n=== 👤 $author ==="
  git log --no-merges --author="$author" --name-only --pretty=format:"" dc8b57231^1..dc8b57231^2 | sort -u | grep -v '^$'
done

5. 按作者、提交记录、修改的文件列表展示数据

# === 配置区 ===
START_COMMIT="dc8b57231^1"  # 请替换为起始 Commit
END_COMMIT="dc8b57231^2"    # 请替换为结束 Commit
# =============

echo "正在分析从 $START_COMMIT 到 $END_COMMIT 的所有文件变动..."

# 1. 第一层循环:获取所有去重的作者
git log --no-merges --format="%an" "$START_COMMIT..$END_COMMIT" | sort -u | while read author; do
    
    # 预先捕获输出
    OUTPUT=$(
        # 2. 第二层:获取该作者的 Commit 信息和文件列表
        # 使用 --name-only 列出所有文件
        git log --no-merges --author="$author" --name-only \
            --pretty=format:"__COMMIT__|%h|%cd|%s" \
            --date=short "$START_COMMIT..$END_COMMIT" | \
        
        # 3. 第三层:使用 awk 处理
        # 移除 -v filter 参数,不再进行正则匹配
        awk -F'|' '
            # 遇到 Commit 头信息
            /^__COMMIT__/ { 
                current_header = "  🔸 [" $2 "] " $3 " : " $4
                header_printed = 0 
                next 
            }
            
            # 遇到空行跳过 (NF表示字段数,0表示空行)
            !NF { next }

            # 遇到任何其他行(即文件名),直接打印
            {
                # 如果当前提交的头还没打印过,先打印头
                if (header_printed == 0) {
                    print ""            
                    print current_header
                    header_printed = 1
                }
                # 打印文件名
                print "       📄 " $0
            }
        '
    )

    # 只要有输出就打印作者块
    if [ ! -z "$OUTPUT" ]; then
        echo -e "\n========================================"
        echo -e "👤 作者: $author"
        echo -e "========================================"
        echo "$OUTPUT"
    fi

done

git log

git 状态流

留言

您的邮箱地址不会被公开。 必填项已用 * 标注