如何使用父 SHA 创建一个 git 补丁以便它可以用作存档?

时间:2021-03-26 19:30:05

标签: git git-patch

想象一下,我正在 git repo 上的一个探索性分支上工作,它只有一个提交。我决定很快不需要我的工作,而且我不想创建分支/标签。事实上,我想丢弃这些更改,但以防万一我再次需要它们,我想保存一个补丁。

就本文而言,假设我只有一个更改要存档:

* 040cc7c   (HEAD, ExperimentalBranch) This is where the experiment is
* a29ceb7   (master) This is the main branch
...

我提出的归档解决方案如下:

  1. 创建提交 040cc7c 的补丁。
  2. 将补丁文件存档在某处以便长期存储。
  3. 从存储库中删除 ExperimentalBranch

到目前为止一切似乎都很好,直到几年后我可能想要恢复补丁。它可能会引用不兼容且无法应用的文件/行。为了解决这个问题,我可以查看补丁的父 SHA 并将其应用到那里。

因此我提出的非归档解决方案如下:

  1. 结帐 SHA a29ceb7
  2. 应用补丁。

唯一的问题是,当我创建补丁时,我看到它包含 SHA 040cc7c,但没有在任何地方提及 a29ceb7。在我创建补丁后,我可能很难找出 040cc7c 年的父级。此外,因为我多年前删除了分支,所以我不希望有一个 git 命令可以帮助我发现父级。

在创建补丁时,有没有办法确保其父 SHA 也包含在文件中?


我目前的解决方法是重命名补丁以包含父级的 SHA,但这很容易忘记,而且更需要手动操作。

1 个答案:

答案 0 :(得分:0)

我建议不要删除分支,但如果你真的想将补丁存储在其他地方,你可以这样做

git format-patch --base HEAD^ HEAD^

以便将父(基)写入补丁中

示例:

$ git format-patch --base HEAD^ HEAD^ 
0001-test.patch
$ cat 0001-test.patch 
From 057ff8fa3ba485abeb69156e9717570ad483d52c Mon Sep 17 00:00:00 2001
From: Dispeakable me <Dispeakable.me@whatever.io>
Date: Sat, 27 Mar 2021 09:47:23 +0100
Subject: [PATCH] test

---
 test.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/test.cpp b/test.cpp
index 6f4ed1e..1ef4295 100644
--- a/test.cpp
+++ b/test.cpp
@@ -1,4 +1,5 @@
 
+
 #include <list>
 
 class Semaphore {

base-commit: b50a780230e2f3f2be8bf6ad3797de272cafba5c
-- 
2.26.3

你可以检查父sha1:

$ git cat-file -p  HEAD
tree 5c03e768250fe7fe94d8ba0454feae422abd6aac
parent b50a780230e2f3f2be8bf6ad3797de272cafba5c
author Dispeakable me <Dispeakable.me@whatever.io> 1616834843 +0100
committer Dispeakable me <Dispeakable.me@whatever.io> 1616834843 +0100

test
相关问题