高级git场景

时间:2011-11-06 00:18:40

标签: git

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

  1. A - B - C - D - E。我想将提交D中的更改添加到提交B并删除提交D。怎么样?
  2. A - B - C。提交B包含一个不应提交的文件。如何从提交中删除它?
  3. A - B - C - D。提交C包含应该使用提交B提交的文件。如何从提交C中删除它并将其添加到提交B
  4. 请注意:所有提交仅在我的工作副本中,尚未推送。

1 个答案:

答案 0 :(得分:8)

我的答案使用git rebase非常多。如果您不熟悉变基,be sure to read this chapter on git rebase first

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

      

    现在真的从对象数据库中删除对象,您可能需要在包含该对象的所有分支上使用filter-branch。之后,reflogs可能需要一段时间才能过期。如果对象是安全敏感对象,您可能需要git gc --aggressive --prune=tomorrowPro Git book has a section on removing objects。{{3}}。
    git-filter-branch始终记得包含--tag-name-filter cat,请参阅评论

  3. 如果所有C都在B中,只需

    git rebase -i B用壁球标记C,它会将提交压缩在一起。

      

    如果它涉及到更多(只有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"
      
               

      然后当你到达命令行时,你恢复该提交并创建两个(或更多)新提交。让我们说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
      
               

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

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