求助一个 git 命令

361 天前
 erquiasz0825

我需要一个 git 命令,做到如下事情:

  1. 可以查看某个人的 git 文件改动记录
  2. 对于同一个文件的多次改动,把最终的改动汇总到一起展示
  3. 用一条命令,而不是多条

例如:

git log --author=jack --since=2023-12-16 --until=2023-12-31 -p

这条命令,会显示 jack 每次提交的改动,如果 xxx.go 文件有多次修改,会显示每次的改动记录,而不是只显示最终的改动对比,这样也是不行的。

2123 次点击
所在节点    git
16 条回复
ltycn
361 天前
你可以使用以下命令来查看某个人在指定时间范围内对某个文件的改动,并将多次改动汇总展示:


git log --author=jack --since=2023-12-16 --until=2023-12-31 --follow -- xxx.go


这条命令中的关键部分是 `--follow`,它告诉 Git 在文件改名或移动时一直跟踪文件的历史。然后通过指定文件名 `xxx.go`,你只会看到该文件的改动记录。

请注意,如果文件在某个提交中被重命名,`--follow` 选项可以帮助你继续跟踪该文件的历史。但如果文件在多个提交中被删除和新建,`--follow` 可能无法完全跟踪,你可能需要手动检查这种情况。

CHATGPT 回答,仅供参考
erquiasz0825
361 天前
@ltycn 谢谢,在提问之前我也问过 chatgpt ,你只是替我问了 chatgpt ,都没有看看符不符合需求
erquiasz0825
361 天前
还以为马上就有高人给出了答案,原来是问的 chatgpt 甚至懒得看回答对不对。
SculptureSand
361 天前
@ltycn
下次别贴 AI 内容了,违反站规的
xiangyuecn
361 天前
用图形界面都不需要思考
yolee599
361 天前
@ltycn #1 别贴 ChatGPT 内容了,别站长看到必 ban 账号
laokiea
361 天前
对于同一个文件的多次改动,把最终的改动汇总到一起展示

需要过滤其他用户对同一个文件同一个部分的修改?
erquiasz0825
361 天前
@laokiea 只要指定作者的修改
ltycn
361 天前
抱一丝各位,我寻思这么简单的问题 CHATGPT 问一下子就有结果来着。
你这个需求的表达就有问题,,,
对于同一个文件的多次改动,把最终的改动汇总到一起展示
我是不是可以理解为:固定时间间隔内指定作者的改动,只取头尾 commit ,再做对比
这不就很清楚了么

git diff $(git log --author=jack --since=2023-08-16 --until=2023-12-31 --reverse | head -n 1 | awk '{print $2}') $(git log --author=jack --since=2023-08-16 --until=2023-12-31 | head -n 1 | awk '{print $2}') -- xxx.go

这段代码也是 GPT 给我的,我试过了没问题。
如果 GPT 不能满足你的要求,说明你的提问方式有问题
rrfeng
361 天前
最终变动肯定是 diff
先用 log --author 找出来,然后 diff start..end xxx.go 完事

但是 diff 不可能分 author 的。
yechentide
361 天前
OP 语气有点冲啊
下面的脚本压缩为一行就行了

```shellscript

declare -r REPO_ROOT='/tmp/xxx'
declare -r AUTHOR='xxx@xxx.xxx'
declare -r START_DATE='2023-01-01'
declare -r END_DATE='2024-01-01'

while IFS='' read -r file; do
echo ">>>>>>>>>> $file"
echo ''

# 区分同一个文件的不同 commit
# git -C $REPO_ROOT log --author=$AUTHOR --since=$START_DATE --until=$END_DATE --oneline --pretty=format:"%H" -- "$file" \
# | xargs -I{} git -C $REPO_ROOT show --color=always {} -- "$file"

# 同一个文件的改动合为一个
commits=$(git -C $REPO_ROOT log --author=$AUTHOR --since=$START_DATE --until=$END_DATE --oneline --pretty=format:"%H" -- "$file")
git -C $REPO_ROOT diff --color=always "$(echo "$commits" | head -n 1)" "$(echo "$commits" | tail -n 1)" -- "$file"

echo ''
done \
< <(git -C $REPO_ROOT log --author=$AUTHOR --since=$START_DATE --until=$END_DATE --oneline --pretty=format:"" --stat --name-only | sort | uniq | grep -v '^$')

```
hxy100
361 天前
楼上大佬才是正解!
yaocai321
361 天前
" 还以为马上就有高人给出了答案,原来是问的 chatgpt 甚至懒得看回答对不对。"
6 的 🛫
ltycn
361 天前
@yaocai321 知人不知而不愠 咱还是持续学习保持谦卑
zhuisui
360 天前
其实你的需求是不合理的,diff 基于 commit ,commit 在分支上是有序串连的。你想要指定作者生成 diff ,就会跳过某些 commit ,这样生成的 diff 会是什么样子,你如果善于做 cherry-pick 就会知道。另外,当你发现这个需求 git diff 命令无法满足的时候就该想到了

其实我猜想你或许需要的是 git blame ,毕竟看你的描述,你也是想要 blame someone 😃

`find src -type f -exec git blame --since xxx master..develop {} \; | grep author`
不支持截止时间,还是用 rev range 吧
laokiea
360 天前
@erquiasz0825 #8
那基本上常规的命令是满足不了你的需求的,commit 是连续的,除非这个文件某段时间内都是同一个用户的修改,那其实直接 diff 最早一次 commit 就好了
或者你可以试一下图形工具 把所有的 diff 都列出来 本质上跟 git log -p --author=xxx 没有区别

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1005151

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX