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 状态流
