识别提交简介
几个月前,我在 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 请求的常见问题和解决方案
- 如何找到几个月前的特定提交 SHA?
- 使用 git rev-list 使用日期过滤器或 git reflog 命令来查找提交 SHA。
- 在两次提交之间生成差异的最佳方法是什么?
- 使用 git diff 带有两个提交的 SHA 的命令。
- 如何使用 GitHub API 获取特定时间范围内的提交?
- 使用带有格式化日期参数的 GitHub API datetime.isoformat 在Python中。
- 目的是什么 git rev-parse 命令?
- 它将分支名称或提交引用转换为 SHA-1 哈希值。
- 如何手动检查提交日志?
- 跑步 git log 使用适当的过滤器,例如 --since 查看提交历史记录。
- 我可以自动化查找提交 SHA 的过程吗?
- 是的,使用 Bash 或 Python 等脚本自动获取和处理提交信息。
- 如何 datetime.timedelta 帮助编写脚本?
- 它计算日期差异,对于确定相对于当前日期的日期很有用。
- 什么是 requests.get Python 中的函数做什么?
- 它发出 HTTP GET 请求以从 GitHub 等 API 检索数据。
- 如何将差异输出保存到文件中?
- 重定向输出 git diff to a file using the > 在命令中使用 > 运算符到文件。
关于为 Pull 请求生成差异的最终想法
重新创建干净的拉取请求涉及识别过去的正确提交 SHA。使用诸如 git rev-list 和 git log或利用与 GitHub API 交互的脚本可以简化此过程。通过自动检索提交 SHA 并生成差异,您可以节省时间并确保准确性。这些技术对于维护干净且有组织的代码库、促进更顺畅的协作和项目管理非常宝贵。