高级git场景

Dan*_*rth 6 git

我有几个我想解决的高级场景,但我不知道如何.我希望你能提供帮助:

  1. A - B - C - D - E.我想将提交中的更改添加D到提交B和删除提交D.怎么样?
  2. A - B - C.Commit B包含一个不应该提交的文件.如何从提交中删除它?
  3. A - B - C - D.Commit C包含一个应该通过commit 提交的文件B.如何从提交中删除它C并将其添加到提交B

请注意:所有提交仅在我的工作副本中,尚未推送.

seh*_*ehe 8

我的答案使用git rebase了很多.如果您不熟悉变基,请务必先阅读本章git rebase

  1. git cherry-pick B就像你发现了你自己,你可以rebase -i A和交换C/d版本,挤压B + d在一起.
  2. git rebase -i B,将B标记为编辑并应用更改.

    我们真的从你可能需要在包含对象的所有分支机构使用过滤器分支对象数据库中删除的对象.之后,reflogs可能需要一段时间才能过期.如果对象是安全敏感对象,您可能需要git gc --aggressive --prune=tomorrow.在临Git的书中有一个章节删除对象.
    随着git-filter-branch始终记住包括--tag-name-filter cat,看评论

  3. 如果所有的C都应该在B中,那么简单

    git rebase -i BC用壁球标记它会将提交压缩在一起.

    如果它涉及到更多(只有C中的一个文件需要进入B),我会将作业分成较小的步骤,可以按照上述步骤解决:

    • 将提交C拆分为两部分:一部分(C.1)合并为提交B,另一部分(C.2)保持为新的"C".例如,从上面链接的Git Pro章节:

      例如,如果要分割提交,则应为该提交指定"编辑":

      pick   fc62e55 added file_size
      pick   9824bf4 fixed little thing
      edit   21d80a5 added number to log
      pick   76b9da6 added the apply command
      pick   c264051 Revert "added file_size"
      
      Run Code Online (Sandbox Code Playgroud)

      然后当你到命令行,你回复犯下并创建两个(或更多)新的.让我们说21d80a5修改了两个文件,file1和file2,你想将它们拆分成单独的提交.您可以在rebase将您放到命令行后执行此操作:

      $ git reset HEAD^
      $ git add file1
      $ git commit 'first part of split commit'
      $ git add file2
      $ git commit 'second part of split commit'
      $ git rebase --continue
      
      Run Code Online (Sandbox Code Playgroud)

      现在不是5次提交,而是6次.

    • 重新绑定以合并提交B和C.1