如何检索 GitHub Pull 请求的正确差异

如何检索 GitHub Pull 请求的正确差异
如何检索 GitHub Pull 请求的正确差异

识别提交简介

几个月前,我在 GitHub 存储库上为我在程序中使用的项目发出了拉取请求。我一直在处理这个 PR,现在看起来最简单的前进方法就是干净地重新创建它。

为了做到这一点,我需要找到一个我开始在本地存储库上运行 git diff 的提交。有没有一种简单的方法可以在已知提交 SHA 之前几个月找到提交 SHA?或者我是否必须运行 git log 并仅目视检查它,直到看到我开始的提交?

命令 描述
git rev-list 按时间倒序列出提交对象,用于查找特定日期之前提交的 SHA。
git rev-parse 解析修订版本(例如分支名称或提交 SHA)并输出相应的 SHA-1 值。
requests.get 向指定的 URL 发出 GET 请求,在 Python 脚本中使用该请求从 GitHub API 获取提交。
datetime.timedelta 表示一个持续时间,两个日期或时间之间的差值,用于计算两个月前的日期。
datetime.isoformat 返回表示 ISO 8601 格式的日期的字符串,适合在 API 查询中使用。
git log --since 显示指定日期以来的提交日志,用于手动查找两个月前的提交 SHA。

脚本使用详解

第一个脚本是一个 Bash 脚本,旨在查找两个月前提交的 SHA 并为拉取请求生成差异。它使用命令 git rev-list 按时间倒序列出提交对象,然后查找指定日期之前的第一个提交。这 date 命令用于计算两个月前的日期,并且 git rev-parse 用于获取分支上最新提交的 SHA。最后, git diff 生成这两个提交之间的差异。

第二个脚本是一个 Python 脚本,它与 GitHub API 交互以从存储库获取提交。它使用 requests.get 函数对 GitHub 进行 API 调用,检索自两个月前计算的日期以来的提交 datetime.timedelta。解析检索到的 JSON 数据以查找最旧和最新的提交,并打印它们的 SHA。该脚本利用 datetime.isoformat 为 API 请求正确设置日期格式的方法。

使用 Git 命令查找正确的差异

Git 和 Bash 脚本

#!/bin/bash
# Find the commit SHA from two months ago
# and get the diff for a pull request
COMMIT_DATE=$(date -d "2 months ago" '+%Y-%m-%d')
START_COMMIT=$(git rev-list -n 1 --before="$COMMIT_DATE" main)
# Replace 'main' with the appropriate branch if necessary
END_COMMIT=$(git rev-parse HEAD)
echo "Start commit: $START_COMMIT"
echo "End commit: $END_COMMIT"
git diff $START_COMMIT $END_COMMIT > pr_diff.patch

从 GitHub API 获取提交

使用 GitHub API 的 Python 脚本

import requests
import datetime
# Set up your GitHub token and repo details
GITHUB_TOKEN = 'your_github_token'
REPO_OWNER = 'repo_owner'
REPO_NAME = 'repo_name'
# Calculate the date two months ago
two_months_ago = datetime.datetime.now() - datetime.timedelta(days=60)
headers = {'Authorization': f'token {GITHUB_TOKEN}'}
url = f'https://api.github.com/repos/{REPO_OWNER}/{REPO_NAME}/commits?since={two_months_ago.isoformat()}'
response = requests.get(url, headers=headers)
commits = response.json()
if commits:
    start_commit = commits[-1]['sha']
    end_commit = commits[0]['sha']
    print(f"Start commit: {start_commit}")
    print(f"End commit: {end_commit}")

使用 Git 日志获取提交 SHA

手动 Git 命令行

# Open your terminal and navigate to the local repository
cd /path/to/your/repo
# Run git log and search for the commit SHA
git log --since="2 months ago" --pretty=format:"%h %ad %s" --date=short
# Note the commit SHA that you need
START_COMMIT=<your_start_commit_sha>
END_COMMIT=$(git rev-parse HEAD)
# Get the diff for the pull request
git diff $START_COMMIT $END_COMMIT > pr_diff.patch

重新审视提交历史以获得准确的差异

管理拉取请求和提交历史记录的另一个重要方面是了解如何利用 Git 强大的引用日志功能。 reflog 记录对分支和其他引用的提示的更新,允许您查看分支的历史移动并定位过去的提交位置,即使它们不再可以通过分支历史记录访​​问。如果您需要查找几个月前的提交 SHA 但没有具体日期,这可能特别有用。

通过运行 git reflog 命令,您可以查看分支头部的更改日志,包括重置、变基和合并。此日志可以帮助识别您开始的提交的 SHA。使用此方法,您可以浏览引用日志条目以查明确切的提交,然后可以使用该提交为您的拉取请求生成精确的差异。

管理 Git Pull 请求的常见问题和解决方案

  1. 如何找到几个月前的特定提交 SHA?
  2. 使用 git rev-list 使用日期过滤器或 git reflog 命令来查找提交 SHA。
  3. 在两次提交之间生成差异的最佳方法是什么?
  4. 使用 git diff 带有两个提交的 SHA 的命令。
  5. 如何使用 GitHub API 获取特定时间范围内的提交?
  6. 使用带有格式化日期参数的 GitHub API datetime.isoformat 在Python中。
  7. 目的是什么 git rev-parse 命令?
  8. 它将分支名称或提交引用转换为 SHA-1 哈希值。
  9. 如何手动检查提交日志?
  10. 跑步 git log 使用适当的过滤器,例如 --since 查看提交历史记录。
  11. 我可以自动化查找提交 SHA 的过程吗?
  12. 是的,使用 Bash 或 Python 等脚本自动获取和处理提交信息。
  13. 如何 datetime.timedelta 帮助编写脚本?
  14. 它计算日期差异,对于确定相对于当前日期的日期很有用。
  15. 什么是 requests.get Python 中的函数做什么?
  16. 它发出 HTTP GET 请求以从 GitHub 等 API 检索数据。
  17. 如何将差异输出保存到文件中?
  18. 重定向输出 git diff to a file using the > 在命令中使用 > 运算符到文件。

关于为 Pull 请求生成差异的最终想法

重新创建干净的拉取请求涉及识别过去的正确提交 SHA。使用诸如 git rev-listgit log或利用与 GitHub API 交互的脚本可以简化此过程。通过自动检索提交 SHA 并生成差异,您可以节省时间并确保准确性。这些技术对于维护干净且有组织的代码库、促进更顺畅的协作和项目管理非常宝贵。