Git:如何将分支的历史记录保存到单个文件中

时间:2018-09-12 17:40:04

标签: git

我正在迭代Git分支中的代码功能,该功能最终将通过rebase归结为单个提交/补丁。但是,我仍然想以某种方式将原始提交保留在一个历史文件中,因此我有一份工作记录。最好的方法是什么?

我现在能想到的最好的方法是使用git format-patch master,然后将生成的所有补丁文件串联在一起,成为一个文件。这种方法的唯一问题是我很懒。我不愿意在git之外做所有的事情。

2 个答案:

答案 0 :(得分:1)

git中的分支很便宜。分支只是显示存储库中的提交的文件(当您压缩,合并和删除分支时,我故意跳过了潜在的GC)。

这样做的“ git-方式”只是为了:

git branch feature-backup
git rebase <some_commit> 

之后,feature-backup分支仍将保留您的旧历史记录。您无需将feature-backup分支推送到远程。它可能只是您的本地分支。

从分支机构进行更改的另一种方法是:

git diff <some_commit>...HEAD > all_commits_in_a_single_file.patch
git rebase <some_commit>

有了它,您将在单个补丁文件中拥有分支上的所有更改。

如果您希望将所有提交分开,则可以使用:

git log --cc <some_commit>...HEAD > all_history_in_a_single_file.txt

最后一个选项将为您提供所有带有提交消息和内容的级联差异。

答案 1 :(得分:0)

另一个解决方案是:

git format-patch --stdout <commit_or_branch> > <patchfile>

这将 <commit_or_branch> 之后的所有提交连接到单个输出中,> 将该输出从 stdout 重定向到名称为 <patchfile> 的补丁文件中。现在可以通过 git am <patchfile> 轻松应用此补丁文件。

我们在我公司使用这种方法处理多提交补丁文件,效果很好。


上述解决方案与 Marcin Pietraszek 提到的这个解决方案有何不同?

git log --cc <some_commit>...HEAD > all_history_in_a_single_file.txt

不同之处在于 Marcin 的解决方案不会生成可供 git am 使用的“补丁”文件。

这里有一个例子来展示它们对于相同的两次提交有何不同。我的方法:

$ git format-patch --stdout origin/master 
From 33b83d0314c9c3090a0e27e4c2b46beb58ee1739 Mon Sep 17 00:00:00 2001
From: REDACTED
Date: Wed, 14 Apr 2021 18:21:13 -0600
Subject: [PATCH 1/2] Test 1

---
 INSTALL | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/INSTALL b/INSTALL
index fb926ff73b..ae3c3e312d 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,6 +1,6 @@
 Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
 Foundation, Inc.
-
+Hi
    This file is free documentation; the Free Software Foundation gives
 unlimited permission to copy, distribute and modify it.
 
-- 
2.25.1


From 88ff375059e12d6053ab43cfdeeefd179e24a2db Mon Sep 17 00:00:00 2001
From: REDACTED
Date: Wed, 14 Apr 2021 18:21:37 -0600
Subject: [PATCH 2/2] test 2

---
 INSTALL | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/INSTALL b/INSTALL
index ae3c3e312d..97d6a8f86a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,6 +1,6 @@
 Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
 Foundation, Inc.
-Hi
+Hello
    This file is free documentation; the Free Software Foundation gives
 unlimited permission to copy, distribute and modify it.
 
-- 
2.25.1

Marcin 的方法:

$ git log --cc origin/master...HEAD 
commit 88ff375059e12d6053ab43cfdeeefd179e24a2db (HEAD -> temp)
Author: REDACTED
Date:   Wed Apr 14 18:21:37 2021 -0600

    test 2

diff --git a/INSTALL b/INSTALL
index ae3c3e312d..97d6a8f86a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,6 +1,6 @@
 Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
 Foundation, Inc.
-Hi
+Hello
    This file is free documentation; the Free Software Foundation gives
 unlimited permission to copy, distribute and modify it.
 

commit 33b83d0314c9c3090a0e27e4c2b46beb58ee1739
Author: REDACTED
Date:   Wed Apr 14 18:21:13 2021 -0600

    Test 1

diff --git a/INSTALL b/INSTALL
index fb926ff73b..ae3c3e312d 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,6 +1,6 @@
 Copyright 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software
 Foundation, Inc.
-
+Hi
    This file is free documentation; the Free Software Foundation gives
 unlimited permission to copy, distribute and modify it.