git - 获取当前修改文件的 git 补丁
问题描述
作为 git 中的菜鸟,我不知道如何为当前修改的文件打补丁,相对于原始文件,即第一个 git 克隆。任何有经验的开发软件版本控制专家,主要是patch
作为合作者(在 fork、PR 等中)工作的差异,以便解释正确的方法?
解决方案
制作补丁
git diff
只需将输出保存到文件中,您就可以创建一个代表所有未提交更改的补丁:
git diff > my-changes.patch
此补丁只是一个文件,因此您可以将其通过电子邮件发送给某人或将其保存在拇指驱动器上或做任何您想做的事情(我不确定您为什么需要这样做,但您可以)
然后,可以通过以下方式应用补丁
git apply my-changes.patch
您通常不需要手动制作补丁,当您确实需要制作补丁时,它们应该始终来自预先存在的提交。
可以从预先存在的提交中制作补丁,如下所示:
git diff <start commit>..HEAD > my-changes.patch
这将创建自<start commit>
. 您还可以指定<start commit>
为分支、标签(指特定的提交)或特定的东西main~10
(这意味着主分支,10 次之前的提交)。
# Get a patch of all changes that haven't been pushed
git diff origin/main..main > local-changes.patch
# Get a patch of all changes on feature-branch
git diff main..feature-branch > changes-on-feature-branch.patch
# Get the last 10 commits as a patch
git diff main~10..main > last-10-commits.patch
# Get all the changes since a particular tag
git diff v1.0.0..main > changes-since-v1.0.0.patch
再一次,您通常不需要手动创建补丁!!!作为一种工具,git diff
它对于探索历史、查看当前更改、查看将要合并的更改或一百万种其他用途非常有用。它以可以直接应用的形式输出内容git apply
,但我一生中的任何时候都不必手动向某人发送补丁。
在 git 中协作,正确的方式
共有三种典型的协作方式,我将按照从最简单到最高级的顺序列出。
方法 1:多个协作者,谁都有访问权限
这是您在学校或大多数工作环境中会看到的最典型的情况。每个人都可以将代码推送到同一个存储库。
在您的机器上拥有 repo 的副本后,工作流程如下所示:
对代码进行更改或更新
提交您的更改:
git add <your changes> && git commit
在上传之前,您可以根据需要进行尽可能多的提交。最好的办法是每次完成重要的代码(如函数或类)时进行小提交。
下载远程更改:
git pull
如果您的合作伙伴或同事已使用更改更新了存储库,则您必须在推送之前执行此操作。这允许您检查以确保您的更改适用于他们的更改。
上传您的更改:
git push
方法二:你在做别人的开源项目
您将无法始终直接推送您的更改。例如,如果您正在开发一个开源项目,您通常会提交更改以供审核,而维护者将是合并它们的人。
这通常通过派生项目、进行更改、将更改上传到存储库(派生版本),然后提交拉取请求以将更改集成回原始项目来完成。
它看起来像这样:
- Fork(在 github、gitlab 或其他服务上
- 将分叉的版本克隆到您的本地计算机上
- 做出改变
- 提交您的更改
- 推送您的更改
- 创建一个拉取请求以将您的更改合并回(您可以在 github、gitlab 或任何您分叉存储库的地方执行此操作)
方法 3:通过电子邮件将您的提交作为补丁发送
这种方法通常用于大型、较旧的开源项目,它们不想依赖像 github 或 gitlab 这样的集中式服务。
它是通过使用git send-email
直接从命令行通过电子邮件发送补丁来完成的。Git 会自动为你创建一个补丁。您所要做的就是指定要作为补丁发送的提交范围。
例如,如果您在名为 的本地分支上进行了更改dev
,那么您将像这样使用它:
git send-email --compose --from=<your email> --to=<their email> master..dev
这里master..dev
是您发送的补丁范围。这是分支上的所有补丁dev
,不在主分支上。又名,您的更改。
此命令将打开一个文本编辑器,您可以在其中编写电子邮件正文,git 会将补丁附加到电子邮件中,然后发送。
请注意,您必须配置您的电子邮件以使用 git send-email。初学者通常不需要这样做。
推荐阅读
- c# - 反序列化对象结果后有额外的括号
- powershell - 在 Powershell 中使用拖放参数运行批处理
- python - 给定数据库的 ODBC 连接字符串,如何修改我的 settings.py 以便我的 Django 应用程序连接到它?
- android - 有没有办法绕过“上传到照片”的大小限制
- python - 指定 lambda 函数即使有错误也继续
- javascript - Angular 组件未在 IE 11 中呈现
- c++ - Libcurl 身份验证问题
- ios - 如何在 UILabel 中尽可能使用最大的字体?
- html - 为什么浏览器会忽略 HTML 文本区域内的新空行?
- d3.js - 如何在 d3 中逐步绘制网格?