跳转至

git format-patch

如何使用git命令,将其它项目的提交Commit 打 补丁到本项目,保留提交的时间 等日志信息、

以下是chatGPT的回答

方法一:使用 git cherry-pick

  1. 获取另一个项目的提交哈希:

  2. 在另一个项目的分支中,找到目标提交的哈希值(commit hash)。

    Bash
    git log --oneline
    

    假设目标提交的哈希为 abc1234

  3. 在当前项目中添加另一个项目的远程仓库:

  4. 添加另一个项目为远程仓库:

    Bash
    git remote add other_project <url-of-the-other-project>
    git fetch other_project
    

    这样,你就能访问另一个项目的分支和提交记录。

  5. 使用 git cherry-pick

  6. 将目标提交引入当前分支,同时保留原始时间、作者信息等:

    Bash
    git cherry-pick abc1234
    
  7. 如果你需要引入多个提交,可以指定多个

    Bash
    commit hash
    

    ,或者使用一个范围:

    Bash
    git cherry-pick commitA commitB
    # 或者范围:
    git cherry-pick commitA..commitC
    
  8. 解决冲突(如有):

  9. 如果在cherry-pick的过程中遇到冲突,可以按照以下步骤解决:

    Bash
    git status
    

    手动解决冲突后,添加解决冲突的文件:

    Bash
    git add <resolved-file>
    git cherry-pick --continue
    
  10. 如果想中止操作:

    Bash
    git cherry-pick --abort
    
  11. 清理远程仓库(可选):

  12. 如果已经完成了需要的操作,可以删除添加的远程仓库:

    Bash
    git remote remove other_project
    

方法二:使用 git format-patchgit am

这是一种更通用的方法,可以生成补丁文件并应用到当前项目。

第一步:在另一个项目中生成补丁文件

  1. 进入另一个项目的目录:
Bash
cd /path/to/other-project
  1. 使用 git format-patch 生成补丁文件:

  2. 生成某个提交的补丁:

Bash
git format-patch -1 <commit-hash>

这会在当前目录生成一个 .patch 文件(如0001-some-message.patch)。

  • 如果需要生成多个提交的补丁:

    Bash
    git format-patch <start-commit>..<end-commit>
    

    这会生成从 start-commit(不含)到 end-commit(含)的所有提交的补丁。

  • 将生成的 .patch 文件复制到当前项目中。


第二步:在当前项目中应用补丁

  1. 进入当前项目的目录:
Bash
cd /path/to/current-project
  1. 使用 git am 应用补丁:

  2. 应用单个补丁文件:

    Bash
    git am 0001-some-message.patch
    
  3. 如果有多个补丁文件,可以使用通配符一次性应用:

    Text Only
    git am *.patch
    
  4. 解决冲突(如有):

  5. 如果应用补丁时发生冲突,

    Bash
    git am
    

    会暂停并提示冲突文件:

    Bash
    git status
    

    手动解决冲突后:

    Bash
    git add <resolved-file>
    git am --continue
    
  6. 如果要中止操作:

    Bash
    git am --abort
    

方法三:使用 git diffgit apply (仅复制更改而不保留提交日志)

如果你不需要保留原始提交的作者、时间等信息,而只是想要应用更改,可以使用以下方法:

  1. 在另一个项目中生成差异文件:
Bash
git diff <commitA> <commitB> > changes.patch
  1. 在当前项目中应用差异文件:
Bash
git apply changes.patch

这不会生成新的提交,需要手动创建提交。


比较三种方法

方法 是否保留提交日志 是否适合多个提交 是否需要远程仓库
git cherry-pick
git format-patchgit am
git diffgit apply

如果需要完整保留提交信息,建议使用 git cherry-pickgit format-patchgit am